我有一个运行在IIS 7.5下的php网站。 该网站是由Windows身份validation安全,并正常工作:

当用户访问该网站时,他们被要求input用户名/密码,如果通过身份validation,则可以通过。 如果用户点击取消或输错密码3次,则会显示401错误页面:

现在我想显示自定义页面来解释如何login。 所以我去错误页面,select状态代码401.2,并将其指向我想要显示的页面:

然后确保自定义错误为每个人打开。 和kaa热潮! 身份validation不再工作,用户不会显示密码提示。 正如文档所述,Windows身份validation的工作原理是首先发送401回复,然后浏览器向用户提供提供者凭据,然后解决下一步要做的事情。
这里发生了什么:第一次请求页面IIS试图发送401头,但通知web.config说:“在401redirect到这个页面”。 而不是身份validation,它只是给redirect页面。
我试过replace401,401.1,401.2 – 没有什么区别。
我做错了什么,以及如何给用户身份validation错误的自定义页面?
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>
尝试这个:
更改:
<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”,但已经知道文件模式效果更好。 您只需确保错误页面中的任何链接资源仍然有效。
我遇到了同样的问题,用户在添加自定义的httper后没有被提示凭据,并且能够用subStatusCode为0来修复它。希望这有助于某人。
<error statusCode="401" subStatusCode="0" path="..." responseMode="ExecuteURL">
所以我很难与基本身份validation完全相同的问题,而不是提示浏览器。 既不强制自定义错误的401.0(即明确设置子代码为0)或设置registry项创build解决了我。
原来,这是我们使用自定义错误页面开始。 把它关掉,一切正常,回来…特别是401(0)和401.2错误阻止提示。
从“ExecuteURL”中将自定义错误types设置为“文件”确实解决了这个问题,但是如果用户取消提示或者input了错误的密码,他们会得到一个通用的“你没有权限查看这个目录或页面”。
在从各种post获得提示后,但从来没有一个确切的“如何”或“为什么”…我正在使用相对path的自定义错误文件,在该网站的子目录中。 如果将path更改为绝对path,则会导致上述一般错误被replace为“无法显示此页”(如果取消或密码错误)。 多一点挖,我发现一个职位谈论configuration属性“allowAbsolutePathsWhenDelegated”默认设置为false。 它还表示,如果你只是把客户错误文件放在你的站点根目录下,然后在自定义错误位置,只是文件名(即相对于站点根目录的path),它会工作…确实足够了,但是,我不想把自定义错误放在我的网站的根目录。 所以我使用ConfigurationEditor将上面的属性设置为true,将绝对path设置为自定义错误文件,一切正常。 提示仍然存在,触发时显示自定义错误。
我想要的是,能够使用嵌套的相对path的文件属性,但到目前为止,我还没有find为什么我不能或如何做到这一点。 另一个问题是,如果通过使用绝对path,如果我可能会创build一个安全漏洞(即为什么这是默认禁用?)
无论如何,希望这有助于某人。
对于一些奇怪的原因,在我的情况下组合了2个解决scheme为我工作的asp.net MVC 5。
<error statusCode="401" subStatusCode="0" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />