mvc如何在不重定向到LogIn视图的情况下返回未授权的代码

mat*_*teo 25 rest json asp.net-mvc-2

我的MVC Web应用程序为两种类型的用户提供服务.

  • 第一个通过标准Web浏览器;
  • 第二个通过REST返回仅返回JSON数据.

另外,

  • 两者都需要认证和授权;
  • 两种方案都根据路线进行区分,以便了解要提供的内容.

当用户访问应用程序时,如果他们未登录,则应用程序应以不同的方式做出反应.

  1. 在第一种情况下,它应该返回默认的LogIn页面(这很好).
  2. 在第二种情况下,它应该仅返回401 Unauthorized代码.

我习惯使用WCF REST服务,我可以在这里引发这样的异常:

throw new WebProtocolException(System.Net.HttpStatusCode.Unauthorized, exc.Message, exc);
Run Code Online (Sandbox Code Playgroud)

并收到401消息.我把statusCode这样的问题用在MVC中的相同方法的问题:

HttpContext.Response.StatusCode = (Int32)HttpStatusCode.Unauthorized
Run Code Online (Sandbox Code Playgroud)

它总是重定向到LogIn页面.

我怎样才能做到这一点?

我已经尝试重写AuthorizeAttribute并处理该OnAuthorization函数,但是一旦我将其设置statusCode为401,它就会被重定向到LogIn页面.

Kam*_*him 27

要防止登录页面重定向,必须将SuppressFormsAuthenticationRedirectproperty 设置HttpContext.Response为true;

 HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
Run Code Online (Sandbox Code Playgroud)

  • 我在哪里放这行代码?我是否必须制作自定义过滤器?还是一个HTTP模块? (3认同)

Cli*_*ity 3

您遇到的是 ASP.NET MVC 中的一个漏洞(我希望他们有一天能修复)。

ASP.NET 的标准操作模型是,如果检测到 401 Http 状态代码,那么正如您所经历的那样,它会自动重定向到登录页面,即使您通过 Ajax 调用进入,也会发生这种情况。不幸的是我还没有找到任何方法来改变这种行为。

相反,我所做的是返回一个替代的、未使用的 Http 状态代码,我可以在客户端中检测到该代码并以适当的方式进行处理。

因此,在我的身份验证过滤器中,如果它是 Ajax 请求,我将返回 449,否则返回标准 401。然后在客户端上,我可以检查 XMLHttpRequest.status,并在检测到 449 时采取适当的操作。