当用户未获得授权时,ASP.NET MVC授权属性会执行302重定向

时间:2010-10-20 13:28:50

标签: asp.net-mvc-2

MSDN明确表示它应该进行401重定向,但我在FF上获得302重定向,这导致AJAX请求出现问题,因为返回状态为200(来自重定向页面)。

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

我发现其他人有同样的问题: http://blog.nvise.com/?p=26

除了他的任何其他解决方案?

4 个答案:

答案 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基本身份验证质询。

更多信息https://mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/201104.mbox/%3C5FFFF0E4-B3BA-420A-ADE3-B422A66E8B11@yahoo-inc.com%3E

答案 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状态代码,它不会重定向   登录发生时自动。