Default AuthorizeAttribute不處理AjaxRequest。你需要編寫你自己的實現。我在下面給出了一個示例實現,您可以根據需要進行自定義。
我在homecontroller中添加了一個操作來返回一個JsonResult並應用默認的[Authorize]屬性。
[Authorize]
public ActionResult SayHello()
{
object result=new {status="200",res="Hello"};
return Json(result, JsonRequestBehavior.AllowGet);
}
在視圖中,我添加了一個簡單的ajax事件來調用操作並將res顯示爲alert。
<h3>
<a id="anchorSayHello">Say Hello</a>
</h3>
@section Scripts{
<script>
$('#anchorSayHello').click(function() {
$.ajax('/Home/SayHello', {
success: function(data) {
var str = data.res;
alert(str);
}
});
return false;
});
</script>
}
因爲,你已經告訴它它將返回一個html響應作爲未授權。現在
,讓我們實現自定義授權attribtue並適用於該訴訟
public class TestAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
object res = new { status = "404", redirect = "/Account/Login" };
filterContext.Result = new JsonResult() { Data = res, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
return;
}
base.HandleUnauthorizedRequest(filterContext);
}
}
現在,讓我們修改JavaScript作爲,
$('#anchorSayHello').click(function() {
$.ajax('/Home/SayHello', {
success: function (data) {
if (data.status === '200') {
var str = data.res;
alert(str);
} else {
window.location = data.redirect;
}
}
});
return false;
});
現在,應該按預期工作,爲ajax請求也會重定向到登錄頁面。
您應用了新創建的自定義授權的controlers /動作屬性? – shakib 2013-05-11 19:52:59
是的,但它仍不會覆蓋基類。重寫的方法是無用的,這是因爲即時通訊使用表單身份驗證? – Xerxes 2013-05-11 19:55:12
你能發表一些代碼嗎? – shakib 2013-05-11 19:56:18