【问题标题】:How do I send a 401 response from an HttpHandler?如何从 HttpHandler 发送 401 响应?
【发布时间】:2012-08-29 19:28:43
【问题描述】:

我们有一个登录强制应用程序,它只允许用户登录到我们应用程序中的单个会话。这是在 postauthenticate 请求事件处理程序中完成的。

如果用户需要退出(他们有另一个会话),我们会这样做:

FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();

这已经很好地工作了很长时间。现在我们正在向我们的应用程序添加一个 web api。当您点击 Web api Url 时, PostAuthentication 事件确实会触发,它会看到用户已在其他地方登录......但是,它会重定向到登录......由于代码,这是预期的。

我尝试更改上面的代码以设置Response.StatusCode = 401,然后结束请求。嗯,这很好用,但是 asp.net 很“不错”并且会自动重定向到登录页面。

如果此请求来自 web api URL,有没有办法我可以用 401 响应并且不让它重定向到登录页面?

【问题讨论】:

  • 301 不是 401。301 必须有 Location: 重定向标头,但 401 没有。你能否澄清你原来的问题,因为没有什么能阻止你做Response.StatusCode = 401;,这应该可以正常工作。
  • 对不起,我的问题只是一个错字。我将状态代码设置为 401... 这会导致 asp.net 根据 web.config 中的表单身份验证重定向到登录。

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api


【解决方案1】:

问题是 FormsAuthenticationModule 在 EndRequest 捕获所有出站请求,如果状态为 401 并且 URL 不是配置的登录位置,您将被重定向到登录位置。

没有什么好的方法可以解决这个问题。基本上我见过两种方法,都不是很棒:

  1. 实现您自己的 FormsAuthenticationModule。与其使用开箱即用的方法,不如自行推出了解异常情况并让 401 通过的方法。
  2. 向为您发出 401 的登录页面添加一些逻辑。查看入站 URL。如果 URL 是来自 FormsAuthenticationModule 的重定向之一,但用户已经登录,则发出 401 而不是显示登录表单。 FormsAuthModule 不会循环重定向到登录表单,所以你没问题。

【讨论】:

  • 是的,这就是我所期望的。谢谢。我们要做的只是让我们的移动应用程序检测到 login.aspx 的 302,如果它看到它就假设它是 401,或者等待 authticket 消失。如果我们将 API 公开,我们将不得不做一些更强大的事情。
【解决方案2】:

您可以将 HttpResponse 的 SuppressFormsAuthenticationRedirect 设置为 true,FormsAuthentication 模块将不会捕获 401。

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多