使用Windows 2008r2,IIS 7.5,我有一个使用Windows集成身份validation(WWW-Authenticate:NTLM,协商)的应用程序。
在我的ASP.NET MVC代码,我覆盖IIS错误页面输出…
protected void Application_EndRequest(Object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; if (context.Response.Status.Substring(0, 3).Equals("401")) { HttpApplication app = (HttpApplication)sender; string returnUrl = Response.ApplyAppPathModifier("~/OpenId/AskUser").ToString(); string url = new Uri(this.Request.Url, Response.ApplyAppPathModifier("~/Account/Login?returnUrl=" + returnUrl)).ToString(); app.Response.ClearContent(); app.Response.Write(string.Format("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"0;URL='{0}'\"><title>Error Authenticating</title><script language=\"javascript\">self.location='{0}';</script></head><body>Error Authenticating</body></html>", url)); } }
目标是在非Windows计算机或移动设备上(或在Windows PC上使用Firefox)将用户redirect到基于表单的login名,而不是通过Windows集成身份validation预期他们的Windows凭据。
我在服务器上与IIS 7.5遇到的问题是,即使此EndRequest事件正在触发(我可以从X-DEBUG标头中看到我插入代码并看着fiddler),发送回客户端的HTML输出是HTTP状态代码401的IIS 7.5默认错误页面,而不是我输出的HTML页面。 第一次发送请求(401响应的第一个请求)它工作正常,但如果用户用空或错误的用户名/密码组合命中确定,后续401响应不包括适当的输出响应(默认的IIS 7.5 401响应页面或一个简单的文本和HTML的句子)。
请注意,在我的开发人员工具箱上的IIS 7.5 Express上不会发生这种情况 – 从上面的代码段正确输出了HTML页面。 只有在将项目部署到IIS 7.5 Web服务器时才会发生这种情况。
我也尝试创build一个自定义错误页面…在我的web.config我在system.webServer下面添加…
<httpErrors> <remove statusCode="401"/> <error statusCode="401" prefixLanguageFilePath="" path="ErrorPages/401.html" responseMode="File" /> </httpErrors>
并创build并部署相应的HTML文件。 一旦我这样做了,我不再得到默认的IIS 7.5错误页面,但现在只接收下面的简洁纯文本(而不是HTML)答复,“您没有权限查看此目录或页面”。
我失去了为什么IIS Express输出一切正常,而IIS 7.5不是。 即使当我告诉IIS 7.5为这种types的错误输出不同的页面,它仍然不会这样做。
这似乎是重复的https://stackoverflow.com/questions/434272/iis7-overrides-customerrors-when-setting-response-statuscode ,但我太新的服务器故障来标记这一点。
我的意思是:在IIS服务器上使用Mediawiki时遇到了类似的问题。
当您浏览到Mediawiki中不存在的页面时。 它发回一个特殊的维基页面,说明该页面不存在,并允许您创build它。 但是,该页面的状态为404。
在标准的IIS服务器上,IIS会自动用一个自定义的错误页面覆盖这个页面给不在本地主机上的用户,但是会向那些用户发送详细的错误信息。 在实践中,“详细的错误信息”是指通过原始的错误页面,不pipe是在你的应用程序中定制的,还是由于编码错误而由ASP.NET生成的。
我的方法是在错误页面>function设置中为本地和远程用户启用详细的错误消息。 但是,这也将允许远程用户看到详细的ASP错误消息,如果它们发生,这可能会帮助恶意用户危害您的安全。
其他选项是作为链接问题的答案给出的,包括可能没有安全含义的更好的答案。 在这种情况下的另一个select是不返回一个401状态代码,但只是一个正常的200代码与您的自定义页面。 这牺牲了REST原则以便于开发。
请注意,为本地用户显示详细的错误消息,而不显示远程用户的事实可以解释为什么您的解决scheme在本地testing期间工作,而不是部署时。