IIS 7.5:如何使用Windows身份验证配置自定义“身份验证错误”页。401标头问题


14

我有一个在IIS 7.5下运行的php网站。该站点由Windows身份验证保护,并且可以正常运行:

Windows身份验证已启用

当用户访问该站点时,系统会要求他们输入用户名/密码并通过身份验证。如果用户单击“取消”或3次输错密码,则会显示401错误页面:

丑陋的401页

现在,我想显示自定义页面来解释如何登录。因此,我转到“错误”页面,选择状态码401.2并将其指向我要显示的页面:

错误页面设置

然后,确保每个人都打开了自定义错误。还有kaa-boom!身份验证不再起作用,不会向用户显示密码提示。如文档所述,Windows身份验证的工作原理是先发送401答复,然后浏览器要求用户提供提供者凭据,然后他们确定下一步要做什么。

此处发生的情况:在首次请求页面时,IIS尝试发送401标头,但注意到web.config表示“在401上重定向到此页面”。而不是身份验证,它只提供重定向页面。

我尝试替换401、401.1、401.2-没什么区别。

我在做什么错以及如何在用户身份验证错误上给出自定义页面?

ps这是web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpErrors errorMode="Custom">
            <remove statusCode="500" subStatusCode="-1" />
            <remove statusCode="404" subStatusCode="-1" />
            <remove statusCode="401" subStatusCode="-1" />
            <error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />
            <error statusCode="404" prefixLanguageFilePath="" path="/not_restricted/404.htm" responseMode="ExecuteURL" />
        </httpErrors>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
    <system.web>
        <identity impersonate="false" />
        <customErrors defaultRedirect="http://www.myserver.com/not_restricted/500.htm" mode="Off">
        </customErrors>
    </system.web>
</configuration>

Answers:


15

尝试这个:

更改:

<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />

<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />

在响应模式为“文件”的情况下,IIS只是加载该文件的内容并显示它,它仍将401状态发送回客户端。

我曾经使用'ExecuteURL',但已经了解到文件模式的效果要好得多。您只需要确保错误页面中的所有链接资源仍然有效即可。


1
先生,你是明星!从第一次尝试就解决了这个问题!
Trailmax 2012年

2

我遇到了同样的问题,即在添加自定义httperrors之后,系统没有提示用户使用凭据,并且能够使用subStatusCode 0对其进行修复。希望这对某人有所帮助。

<error statusCode="401" subStatusCode="0" path="..." responseMode="ExecuteURL">

1

因此,我遇到了与基本身份验证完全不提示浏览器相同的问题。强制执行401.0的自定义错误(即,将子代码显式设置为0)或设置注册表项创建都无法为我解决它。

原来,这是我们使用自定义错误页面开始的。关闭它们,一切正常,然后重新打开...特别是401(0)和401.2错误阻止了该提示。

将自定义错误类型从“ ExecuteURL”设置为“文件”确实可以解决该问题,但是如果用户取消了提示或输入了错误的密码,他们将获得通用名称“您无权查看此目录或页面”。

在从各种帖子中获得很多提示之后,但是从来没有一个确切的“操作方法”或“为什么” ...我正在使用相对错误路径作为网站子目录中的自定义错误文件。如果取消或密码错误,则将路径更改为绝对路径会导致上述一般错误替换为“无法显示此页面”。多挖一点,我发现了一个帖子讨论配置属性“ allowAbsolutePathsWhenDelegated”,默认情况下将其设置为false。它还指出,如果您仅将客户错误文件放在站点根目录中,然后在自定义错误位置中,仅文件名(即指向站点根目录的相对路径)就可以了...当然可以,但是,我不想将自定义错误放在网站的根目录中。因此,我使用ConfigurationEditor将上述属性设置为true,为自定义错误文件设置了绝对路径,一切开始正常运行。提示仍然存在,触发时显示自定义错误。

我想要的是能够使用带有嵌套相对路径的File属性,但是到目前为止,我还没有找到为什么不能或如何做到这一点。另一个问题是,如果使用绝对路径,是否可能创建安全漏洞(即,为什么默认情况下将其禁用?)

无论如何,希望这对某人有帮助。


0

出于某种奇怪的原因,在asp.net MVC 5中,最多2种解决方案的组合对我有用。

  <error statusCode="401" subStatusCode="0" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />

这是确切的答案,是公认的答案。
发光的

状态码不同。
Teoman shipahi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.