我有一个W2K8服务器与IIS 7.5托pipe指向一个单一的ASP.NET Web应用程序的两个网站。
Web应用程序已configuration为进行表单身份validation和集成(Windows)身份validation。 loginUrl被设置为configuration为集成authentication的login页面; 如果无法使用Request.ServerVariables [“LOGON_USER”]识别用户,则应用程序会将用户redirect到为表单身份validationconfiguration的login页面。
问题是,当我作为一个匿名用户访问网站时,IIS发出一个401挑战,所以将用户redirect到表单login页面的逻辑从不执行。 我被build议设置两个网站,让他们都指向同一个networking应用程序; 问题在于web.config中的loginUrl属性被两个站点上的更改覆盖。 如何将两个站点configuration为使用不同的身份validation模式?
ASP.NET不支持同时拥有多个内置身份validation模块。 这在文档中很重要, <authentication mode="[Windows|Forms|Passport|None]" ...>
解决scheme:
例:
<location path="My Awesome Site - Forms"> <system.web> <authentication mode="Forms" /> </system.web> </location> <location path="My Awesome Site - Windows"> <system.web> <authentication mode="Windows" /> <identity impersonate="true"/> </system.web> </location>
我意识到这是一个古老的问题,但我正在试图做这件事情,并没有办法; 西蒙提出的答案不适合我。 我得到它的工作方式是通过代码处理它。 就我而言,我希望一个站点允许匿名身份validation,另一个站点使用NTLM(Windows)身份validation。 这些网站都由CMS托pipe,因此不像设置授权规则那样简单。
我最终做的是检查Request.ServerVariables["LOGON_USER"]值以及Request.Url.Host ,然后强制响应代码401向访问者的浏览器显示authentication质询。 我在Web站点之间共享的Web.config文件中启用了匿名和Windows身份validation模式。
WebForms示例:
// we only care about authorization for one of the sites if (Request.Url.Host == "use-ntlm.example.com" && string.IsNullOrEmpty(Request.ServerVariables["LOGON_USER"])) { Response.StatusCode = 401; Response.End(); return; }