MSDN明确表示它应该执行401重定向,但是我在FF上获得了302重定向,并且这导致AJAX请求中的问题返回状态是200(来自重定向页面)。当用户未被授权时,ASP.NET MVC授权属性会执行302重定向
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我发现别人用了同样的问题: http://blog.nvise.com/?p=26
任何其他解决办法,除了他的?
MSDN明确表示它应该执行401重定向,但是我在FF上获得了302重定向,并且这导致AJAX请求中的问题返回状态是200(来自重定向页面)。当用户未被授权时,ASP.NET MVC授权属性会执行302重定向
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我发现别人用了同样的问题: http://blog.nvise.com/?p=26
任何其他解决办法,除了他的?
授权属性确实返回一个Http 401未经授权的响应。不幸的是,如果启用了FormsAuthentication,则401被FormsAuthenticationModule拦截,然后执行重定向到登录页面 - 然后将Http 200(和登录页面)返回到您的ajax请求。
最好的选择是编写自己的授权属性,然后如果你得到一个未经身份验证的请求,这也是一个Ajax请求,返回一个不同的Http状态代码 - 比如说403--它不被formsAuthenticationModule捕获,你可以抓住你的Ajax方法。
我非常喜欢这个解决方案。通过将ajax请求上的302响应更改为401,它允许您在客户端设置您的ajax,以监控寻找401的任何ajax请求,以及是否找到一个重定向到登录页面的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;
}
}
客户端代码:
$(function() {
$.ajaxSetup({
statusCode: {
401: function() {
location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
}
}
});
});
如果您使用的是ASP.NET MVC 5 Web应用程序去App_Start
- >Startup.Auth.cs
。检查是否启用了app.UseCookieAuthentication
,并查看CookieAuthenticationOptions
是否设置为LoginPath = new PathString("/Login"),
或类似。如果您删除此参数401
将停止重定向。
描述为LoginPath
:
的LOGINPATH属性通知它应改变 传出401 Unauthorized状态代码到302重定向到 给定的登录路径的中间件。生成401的当前url被添加到 LoginPath作为由 ReturnUrlParameter命名的查询字符串参数。一旦对LoginPath的请求授予新的登录身份,ReturnUrlParameter值将用于将 浏览器重定向到导致原始未授权状态 代码的url。如果LoginPath为空或空,中间件将不会查找 401未授权状态代码,并且在登录发生时它不会自动重定向 。
代码为我完美工作。谢谢。 – njr101 2012-06-14 11:25:32
这是一个不好的做法,因为所有的请求都应该在EndRequest中进行chelic,包括所有的静态文件。 – 2014-06-07 14:01:08
它是如此悲伤,处理这个'最好'的方式涉及劫持所有ajax 302s – 2015-12-09 01:38:16