![IIS 7.5:如何使用 Windows 身份验证配置自定义身份验证错误页面。401 标头问题](https://linux22.com/image/797703/IIS%207.5%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Windows%20%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E9%94%99%E8%AF%AF%E9%A1%B5%E9%9D%A2%E3%80%82401%20%E6%A0%87%E5%A4%B4%E9%97%AE%E9%A2%98.png)
我有一个在 IIS 7.5 下运行的 php 网站。该网站由 Windows 身份验证保护,并且运行良好:
当用户访问该网站时,系统会要求他们输入用户名/密码,如果通过身份验证,则可以通过。如果用户单击“取消”或三次输入错误密码,则会显示 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" />