MSDN明确表示,它应该做401重定向,但我发现在FF 302重定向,这也是造成在AJAX请求问题,因为返回的状态是200(从重定向的页面).
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我发现其他人有同样的问题:http: //blog.nvise.com/?p = 26
还有其他解决办法吗?
Kyl*_*ers 12
我非常喜欢这个解决方案.通过将ajax请求的302响应更改为401,它允许您在客户端设置ajax以监视查找401的任何ajax请求,以及是否找到一个重定向到登录页面.非常简单有效.
Global.asax中:
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302 &&
Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
Run Code Online (Sandbox Code Playgroud)
客户端代码:
$(function () {
$.ajaxSetup({
statusCode: {
401: function () {
location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
Authorize属性确实返回Http 401 Unauthorized响应.不幸的是,但是如果你启用了FormsAuthentication,那么401会被FormsAuthenticationModule截获,然后执行重定向到登录页面 - 然后返回一个Http 200(和登录页面)回到你的ajax请求.
最好的选择是编写自己的授权属性,然后如果你得到一个也是Ajax请求的未经身份验证的请求,则返回一个不同的Http状态代码 - 比如说403 - 这是formAuthenticationModule没有捕获的,你可以捕获你的Ajax方法.
我实现了自己的自定义authorize属性,该属性继承自AuthorizeAttribute并遇到了同样的问题.
然后我发现自.Net 4.5以来就有一个解决方案 - 您可以通过以下方式抑制重定向:
context.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
Run Code Online (Sandbox Code Playgroud)
然后响应将是401 - 未授权,以及HTTP基本身份验证质询.
更多信息在这里
| 归档时间: |
|
| 查看次数: |
6509 次 |
| 最近记录: |