如何从HttpHandler发送401响应?

时间:2012-08-29 19:28:44

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

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

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

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

长期以来一直运作良好。现在我们正在为我们的应用添加一个web api。当您点击web api Url时,PostAuthentication事件会触发,它会看到用户已在其他地方登录...但是,它会重定向以登录..这是由于代码而预期的。

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

如果此请求来自web api网址,我是否可以使用401回复并且不将其重定向到登录页面?

2 个答案:

答案 0 :(得分:1)

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

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

  1. 实现您自己的FormsAuthenticationModule。而不是使用开箱即用的,滚动你自己知道异常并让401通过。
  2. 为登录页面添加一些逻辑,为您发布401。查看入站URL。如果URL是FormsAuthenticationModule中的重定向之一但用户已登录,则发出401而不是显示登录表单。 FormsAuthModule不会循环重定向到登录表单,所以你没事。

答案 1 :(得分:1)

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