MSDN明确表示它应该进行401重定向,但我在FF上获得302重定向,这导致AJAX请求出现问题,因为返回状态为200(来自重定向页面)。
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我发现其他人有同样的问题: http://blog.nvise.com/?p=26
除了他的任何其他解决方案?
答案 0 :(得分: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;
}
}
客户端代码:
$(function () {
$.ajaxSetup({
statusCode: {
401: function () {
location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
}
}
});
});
答案 1 :(得分:9)
Authorize属性 返回Http 401 Unauthorized响应。不幸的是,如果你启用了FormsAuthentication,那么401会被FormsAuthenticationModule截获,然后执行重定向到登录页面 - 然后将Http 200(和登录页面)返回给你的ajax请求。
最好的替代方法是编写自己的授权属性,然后如果你得到一个也是Ajax请求的未经身份验证的请求,则返回一个不同的Http状态代码 - 比如403 - 这是formAuthenticationModule没有捕获的,你可以捕获在你的Ajax方法中。
答案 2 :(得分:5)
我实现了自己的自定义authorize属性,该属性继承自AuthorizeAttribute并遇到了同样的问题。
然后我发现自.Net 4.5以来有一个解决方案 - 您可以通过以下方式抑制重定向:
$sample = array();
for($z=0; $z<count($array1); $z++){
$sample[]=array($array1[$z],$array2[$z],$array3[$z]);
}
print_r($sample);
然后响应将是401 - 未授权,以及HTTP基本身份验证质询。
答案 3 :(得分:1)
如果您使用的是ASP.NET MVC 5 Web应用程序,请转到App_Start
- &gt; Startup.Auth.cs
。检查是否已启用app.UseCookieAuthentication
并查看CookieAuthenticationOptions
是否设置为LoginPath = new PathString("/Login"),
或类似。如果删除此参数,401
将停止重定向。
LoginPath
的说明:
LoginPath属性通知中间件它应该更改 传出401未授权状态码到302重定向到 给定登录路径。生成401的当前url被添加到 LoginPath作为查询字符串参数 ReturnUrlParameter。一旦对LoginPath的请求授予新的 SignIn标识,ReturnUrlParameter值用于重定向 浏览器返回到导致原始未授权状态的URL 码。如果LoginPath为null或为空,则中间件将不会显示 对于401 Unauthorized状态代码,它不会重定向 登录发生时自动。