在ASP.NET中强制自定义HTTP 401未授权页面

时间:2012-05-25 22:46:24

标签: c# asp.net access-denied http-status-code-401 httpexception

我已经编写了一个供工作内部使用的Web应用程序(不适用于更广泛的互联网),它使用Windows身份验证 - ASP.NET查询Windows以获取当前的凭据集。如果在我设置的AD组中找不到用户名,则从受保护页面的Page_PreInit调用的身份验证方法会引发401错误。

我实施了来自Throwing an HttpException always sends back HTTP 500 error?的Earlz'CustomErrorsFixer,因为我也只有500秒回来了。现在我的自定义错误页面正常运行,这很棒。

在Visual Studio开发服务器本地开发,我发现如果我没有访问权限,我会直接进入401错误页面。然而!当我将站点发布到IIS服务器时,如果用户没有访问权限,则会收到 Windows用户名/密码提示(XP中的丑陋,小的)。这实际上非常方便,因为它使登录到不同域的人有机会输入正确的凭据。

在此阶段,当密码提示出现时,如果用户点击取消退出,他们会转到自定义401页面,告诉他们该如何去关于请求访问。但是,如果他们尝试输入用户名和密码(默认为错误的域名,因此是不正确的凭据),则会显示默认IIS 401页面,我非常希望避免这种情况。第三种情况 - 如果他们输入CORRECT凭据,则会询问他们3次,然后显示自定义错误页面。

因此,如果用户“经过身份验证”,则会看到自定义401页面,如果不是,则会看到标准IIS页面。

但是,我发现大多数人在提示输入用户名/密码框时只输入没有域名的用户名/密码 - 这最终会导致错误,因此将其发送到非自定义IIS 401页面即可。有谁知道我怎么解决这个问题?这非常烦人,因为人们需要查看自定义401页面才能看到他们需要访问哪个组!

如果重要,我们所使用的浏览器都是XP上的IE8或Windows 7上的IE9。请告诉我是否应该发布任何代码。

1 个答案:

答案 0 :(得分:2)

IIS7默认拦截401以及一些其他HTTP状态代码。

试试这个:

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