如何在具有不同身份validation模式的单个ASP.NET Web应用程序的同一个IIS 7.5服务器上configuration两个站点

我有一个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:

  • 构build一个处理authentication的自定义IHttpModule。
  • 将您的应用程序分成两个Web应用程序在您的IIS中指向具有不同configuration文件的两个不同的目录。 这是最简单的解决scheme。
  • 将您的应用程序分成两个Web应用程序在您的IIS中,但将它们都指向相同的目录。 您需要从驻留在目录中的web.config中删除身份validation和模拟设置,然后将这些设置移至系统范围的web.config(%SystemRoot%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web .config或类似的)。 这些设置必须使用位置标签使用IIS站点的名称进行包装。

例:

 <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; }