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
}
});
其實這就是我tryed(有和沒有兩個額外的行太)filterContext.HttpContext.Response.StatusCode = 401; filterContext.HttpContext.Response.End(); filterContext.HttpContext.Response.Close(); 但沒有運氣,狀態碼仍然「200」即時通訊如此混亂。我會再次檢查一次,只是爲了你。 – radbyx
我還是得到了「200」: xhr.status:「200」和xhr.statusCode()。status:「200」 – radbyx
嗯。這段代碼應該封裝成如下形式:public class CustomAuthorizeAttribute:AuthorizeAttribute {} - 然後您必須確保您的操作是通過[CustomAuthorize]進行「裝飾」的 - 在基礎控制器,控制器或單個操作上 - if你不添加這個,自定義代碼不會踢。你有沒有檢查過你的行爲是用同等的[]來裝飾的? – RickL