ASP.NET MVC – Ajax 登入驗證

ASP.NET MVC – Ajax 登入驗證

通常我們利用非同步存取資料的時候,最麻煩的就是當需要登入驗證判斷的時候了;一般來說,當你用:

原本可能只是要取回一筆簡單的字串或數值,結果回來的卻是登入網頁的一大串html碼。

 

通常我們在發非同步要求的時候,在Http標頭裡面通常會有「X-Requested-With」這個屬性,雖然他是屬於非標準的用法,不過大部份的Javascript Framework都支援(JQuery)也是。在ASP.NET MVC中也支援這種屬性的判斷式:AjaxRequestExtensions.IsAjaxRequest,他是屬於System.Web.Mvc.AjaxRequestExtensions命名類別底下的方法。

 

通常我會自訂一個驗證的ActionFilter,用來判斷網站權限或是增加導頁之類的功能,例如:


{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        //沒有登入導到登入頁,登入之後再導回來~

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
                            {
                                { "controller", "Account" },
                                { "action", "Login" },
                                { "returnUrl", filterContext.HttpContext.Request.RawUrl }
                            });
            return;
        }

    }

}

這時候我們就可以利用這個屬性來得知是不是Ajax載入,所以我把他修改成:


{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        //沒有登入導到登入頁,登入之後再導回來~

        if (filterContext.Result is HttpUnauthorizedResult && !filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
                            {
                                { "controller", "Account" },
                                { "action", "Login" },
                                { "returnUrl", filterContext.HttpContext.Request.RawUrl }
                            });
            return;
        }
        else if (filterContext.Result is HttpUnauthorizedResult)
        {
            ContentResult cr = new ContentResult();
            cr.Content = "請先登入!!";
            filterContext.Result = cr;
        }
    }

}

直接利用filterContext.HttpContext.Request.IsAjaxRequest()來判斷他是否為非同步的需求,超簡單的吧?

 

註:

通常我在做這種非同步處理的時候,都會用1來判斷是否成功(如果成功,1會出現在index 0的位置),如果不成功就直接alert訊息,所以直接用這招就很方便…。

不過這種在非同步載入頁面的時候,有時候也不是很好用,所以我在login頁面還埋了判斷是否為iframe載入,有的話就從母視窗再重新載一次login頁面,另外可以客制化判斷載入的頁面內容是不是login,如果是就直接導到login頁面,這樣就可以省掉不少功夫花時間處理這些問題了。

 

Dotblogs 的標籤: