Default AuthorizeAttribute 不处理 AjaxRequest。您需要编写自己的实现。我在下面给出了一个示例实现,您可以根据需要进行自定义。
我在 homecontroller 中添加了一个操作来返回一个 JsonResult 并应用了默认的 [Authorize] 属性。
[Authorize]
public ActionResult SayHello()
{
object result=new {status="200",res="Hello"};
return Json(result, JsonRequestBehavior.AllowGet);
}
在视图中,我添加了一个简单的 ajax 事件来调用操作并将 res 显示为警报。
<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 响应。
现在,让我们实现自定义 Authorize 属性并应用于操作
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 请求,它也会重定向到登录页面。