如何防止 IIS7 处理 HTTP 状态码 401?

Posted

技术标签:

【中文标题】如何防止 IIS7 处理 HTTP 状态码 401?【英文标题】:How to prevent IIS7 for handling HTTP status code 401? 【发布时间】:2011-05-20 11:45:37 【问题描述】:

我正在处理我的 ASP.NET MVC 2 项目。我创建了异常过滤器来捕获当用户无权查看某些操作时发生的未经授权的访问异常。

[CustomError(typeof(UnauthorizedAccessException), "Error", "UnauthorizedAccess")]
public class MyController : BaseController


抛出异常后,我的过滤器将转移到配置的控制器/动作,即以下方法。

public ActionResult UnauthorizedAccess(ExceptionContext context)

    Response.StatusCode = CustomHttpStatusCode.UnauthorizedUser;

    return View(model);

最后,在 ASP.NET 应用程序结束此请求之前,它会调用位于 Global.ascx 中的以下方法将自定义 HTTP 状态码更改为 HTTP 状态 401(未授权访问)。

public void Application_EndRequest(object sender, EventArgs e)

    if (Response.StatusCode == CustomHttpStatusCode.UnauthorizedUser)
    
        Response.StatusCode = 401;
    

在我的机器(IIS 7.5)上一切正常。但它不适用于我的部署网站。它仍然返回纯文本“您无权查看此目录或页面。”而不是我的自定义错误页面。

PS。以下配置是我当前针对此案例的 web.config。

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration>
    <system.web>
      <customErrors mode="On"></customErrors>
    </system.web>
    <system.webServer>
      <httpErrors errorMode="Custom">
         <remove statusCode="502" subStatusCode="-1" />
         <remove statusCode="501" subStatusCode="-1" />
         <remove statusCode="500" subStatusCode="-1" />
         <remove statusCode="412" subStatusCode="-1" />
         <remove statusCode="406" subStatusCode="-1" />
         <remove statusCode="405" subStatusCode="-1" />
         <remove statusCode="404" subStatusCode="-1" />
         <remove statusCode="403" subStatusCode="-1" />
         <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>

【问题讨论】:

如果当前用户已通过身份验证,即使我更改为返回状态码为 403,但结果仍然相同。 【参考方案1】:

我刚刚找到了解决这个问题的简单方法。我只是将新设置添加到 web.config 文件中,如下面的代码。在我的部署网站上一切正常。

  <?xml version="1.0" encoding="utf-8"?>
  <configuration> 
    <system.webServer>
      <httpErrors errorMode="Custom" existingResponse="PassThrough">
          <remove statusCode="502" subStatusCode="-1" />
          <remove statusCode="501" subStatusCode="-1" />
          <remove statusCode="500" subStatusCode="-1" />
          <remove statusCode="412" subStatusCode="-1" />
          <remove statusCode="406" subStatusCode="-1" />
          <remove statusCode="405" subStatusCode="-1" />
          <remove statusCode="404" subStatusCode="-1" />
          <remove statusCode="403" subStatusCode="-1" />
          <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>

所以我也可以在纯文本和 JSON 响应中创建自定义错误页面。

欲了解更多信息:HttpErrorsSection Class

PS。但我在 IIS 管理器的错误页面功能中找不到 existingResponse 属性。

【讨论】:

有很多 IIS 设置,例如 existingResponse 没有出现在 IIS 管理器中。一个很好的例子是,如果您尝试恢复自定义错误设置以使用继承值:***.com/questions/4255120【参考方案2】:

您可以通过两种方式传递 IIS7 默认错误消息

一种是设置response.TrySkipIisCustomErrors为true

response.TrySkipIisCustomErrors = true;
response.Status = response.Status;

由于某种原因,如果您不设置 response.Status,则不会使用 TrySkipIisCustomErrors。

另一种是在web.config中设置existingResponse为“PassThrough”

<configuration>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
</configuration>

但这会忽略所有设置的 IIS 自定义错误页面。

【讨论】:

&lt;httpErrors existingResponse="PassThrough" /&gt; 帮了我大忙,谢谢!我不需要使用TrySkipIisCustomErrors

以上是关于如何防止 IIS7 处理 HTTP 状态码 401?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP状态码401,以及其他常见HTTP状态码

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

http常见的状态码,400,401,403状态码 , http响应 ,php设置http响应

http协议的状态码——400,401,403,404,500,502,503,301,302等常见网页错误代码

HTTP 状态码:GCMDemo 中的 401

19.在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?)写出http常见的状态码和含义,至少5个.[完善题目]