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

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

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

Windows 身份验证已启用

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

丑陋的 401 页面

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

错误页面设置

然后确保为所有人打开自定义错误。然后 kaa-boom!身份验证不再起作用,用户不会看到密码提示。正如文档所述,Windows 身份验证的工作方式是先发送 401 回复,然后浏览器要求用户提供提供商凭据,然后他们决定下一步该做什么。

这里发生了什么:第一次请求页面时,IIS 尝试发送 401 标头,但注意到 web.config 说“401 重定向到此页面”。它不进行身份验证,而是直接提供重定向页面。

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

我做错了什么以及如何在用户身份验证错误时显示自定义页面?

附言:这是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>

答案1

尝试这个:

改变:

<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”,但后来发现文件模式效果更好。你只需确保错误页面中链接的所有资源仍然有效即可。

答案2

在添加自定义 httperrors 后,我遇到了同样的问题,即用户没有被提示输入凭据,并且能够使用 subStatusCode 0 来修复它。希望这对某些人有帮助。

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

答案3

所以我遇到了同样的问题,即 Basic Auth 无法提示浏览器。无论是强制自定义错误 401.0(即明确将子代码设置为 0),还是设置注册表项创建都无法解决这个问题。

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

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

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

我希望能够使用带有嵌套相对路径的 File 属性,但到目前为止我还没有发现为什么我不能这样做或如何做到这一点。另一个问题是,如果使用绝对路径,我是否可能会造成安全漏洞(即为什么默认情况下会禁用此功能?)

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

答案4

由于某些奇怪的原因,在我的案例中,以上 2 个解决方案的组合对我的 asp.net MVC 5 有效。

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

相关内容