2010-10-20 47 views

回答

9

授权属性确实返回一个Http 401未经授权的响应。不幸的是,如果启用了FormsAuthentication,则401被FormsAuthenticationModule拦截,然后执行重定向到登录页面 - 然后将Http 200(和登录页面)返回到您的ajax请求。

最好的选择是编写自己的授权属性,然后如果你得到一个未经身份验证的请求,这也是一个Ajax请求,返回一个不同的Http状态代码 - 比如说403--它不被formsAuthenticationModule捕获,你可以抓住你的Ajax方法。

12

我非常喜欢这个解决方案。通过将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; 
      } 
     } 
     }); 
    }); 
+0

代码为我完美工作。谢谢。 – njr101 2012-06-14 11:25:32

+3

这是一个不好的做法,因为所有的请求都应该在EndRequest中进行chelic,包括所有的静态文件。 – 2014-06-07 14:01:08

+1

它是如此悲伤,处理这个'最好'的方式涉及劫持所有ajax 302s – 2015-12-09 01:38:16

2

我实现了从AuthorizeAttribute继承和遇到同样的问题,我自己的自定义授权属性。

后来我发现,自.NET 4.5有到了一个解决方案 - 可以抑制以下列方式重定向:

context.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 

那么响应将是一个401 - 未经授权,与沿HTTP基本身份验证挑战。

更多信息here

+0

这应该是被接受的答案。 – icesar 2018-01-16 17:44:21

0

如果您使用的是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未授权状态代码,并且在登录发生时它不会自动重定向 。