2016-03-08 99 views
1

在MVC 5中,我重寫HandleUnauthorizedRequest()並檢查請求是否來自AJAX。未經授權的AJAX請求返回狀態碼200而不是401

我還註冊了全球ajaxComplete,用於處理401個AJAX請求,但狀態代碼在HandleUnauthorizedRequest()之後仍爲200。

問題:是否需要手動更改filterContext中的狀態碼HandleUnauthorizedRequest()

未經授權的AJAX請求檢測

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.IsAjaxRequest()) 
    { 
     // <-- in here 
     filterContext.Result = new JsonResult 
     { 
      Data = new 
      { 
       returnUrl = "foo" 
      }, 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

全球ajaxComplete註冊

$(document).ajaxComplete(function (e, xhr, settings) { 
    console.log('xhr.status: "' + xhr.status +'"'); // 200 - i want 401 
    if(xhr.status === 401) { 
     window.location.replace(urlHelper.getUrlNotAuthorized()); 
    } 
}); 

「工作,但被黑的解決方案,直到我找到ajaxComplete的解決方案。

它檢查用戶請求是否被授權。缺點是我必須檢查isAuthorized()我提出任何要求。這就是爲什麼我想用一個全球性的ajaxComplete,所以我不會錯過任何一個「。

檢查,如果用戶AJAX請求被授權

isAuthorized = function (result) { 
    try { 
     var obj = JSON && JSON.parse(result) || $.parseJSON(result); 
     // Here, obj can still be a parsed JsonResult, from when getting GetDatatableRows(), so we also need to check on returnUrl which is distinct 
     // obj will only contain returnUrl if the JSON was returned from Shield validation 
     if (obj && obj.returnUrl) { 
      window.location.replace(urlHelper.getUrlNotAuthorized() + '?returnUrl=' + encodeURIComponent(obj.returnUrl)); 
      return false; 
     } 
    } catch (e) { 
    } 
    return true; 
}; 

AJAX請求,其中結果爲局部視圖或JSON

partialViewService.changePartialViewService(url, data) 
.done(function (result) { 
    if (isAuthorized(result)) { 
     // use result 
    } 
}); 

回答

3

是 - 我沒有檢查這一點,但嘗試添加線指示指定代碼401不經過過濾,以你想要的結果(我懷疑這我。原因可能會攔截身份代碼401專):

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.IsAjaxRequest()) 
    { 
     // Add this (code 401 does not work) 
     filterContext.HttpContext.Response.StatusCode = 412; 
     // <-- in here 
     filterContext.Result = new JsonResult 
     { 
      Data = new 
      { 
       returnUrl = "foo" 
      }, 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 
+0

其實這就是我tryed(有和沒有兩個額外的行太)filterContext.HttpContext.Response.StatusCode = 401; filterContext.HttpContext.Response.End(); filterContext.HttpContext.Response.Close(); 但沒有運氣,狀態碼仍然「200」即時通訊如此混亂。我會再次檢查一次,只是爲了你。 – radbyx

+0

我還是得到了「200」: xhr.status:「200」和xhr.statusCode()。status:「200」 – radbyx

+1

嗯。這段代碼應該封裝成如下形式:public class CustomAuthorizeAttribute:AuthorizeAttribute {} - 然後您必須確保您的操作是通過[CustomAuthorize]進行「裝飾」的 - 在基礎控制器,控制器或單個操作上 - if你不添加這個,自定義代碼不會踢。你有沒有檢查過你的行爲是用同等的[]來裝飾的? – RickL

相關問題