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

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

我有一台 W2K8 服务器,其中安装了 IIS 7.5,托管两个指向单个 asp.net Web 应用程序的站点。

Web 应用程序已配置为表单身份验证和集成 (windows) 身份验证。loginUrl 设置为配置为集成身份验证的登录页面;如果无法使用 Request.ServerVariables["LOGON_USER"] 识别用户,则应用程序会将用户重定向到配置为表单身份验证的登录页面。

问题是,当我以匿名用户身份访问该网站时,IIS 发出 401 挑战,因此将用户重定向到表单登录页面的逻辑永远不会执行。有人建议我设置两个网站,并让它们都指向同一个 Web 应用程序;这里的问题是,web.config 中的 loginUrl 属性会被任一网站上的更改覆盖。如何配置两个网站以使用不同的身份验证模式?

答案1

ASP.NET 不支持同时拥有多个内置身份验证模块。这在文档<authentication mode="[Windows|Forms|Passport|None]" ...>

解决方案:

  • 构建一个处理身份验证的自定义 IHttpModule。
  • 将您的应用程序在 IIS 中分成两个 Web 应用程序,它们指向具有不同配置文件的两个不同目录。这是最简单的解决方案。
  • 将您的应用程序分成 IIS 中的两个 Web 应用程序,但将它们都指向同一目录。您需要从目录中的 web.config 中删除身份验证和模拟设置,并将它们移动到系统范围的 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>

答案2

我知道这是一个老问题,但我也曾尝试过但未能成功;Simon 提出的答案对我来说不起作用。我让它工作的方法是通过代码来处理。就我而言,我希望一个站点允许匿名身份验证,另一个站点使用 NTLM(Windows)身份验证。这两个站点都由 CMS 托管,因此它也不像针对路径设置授权规则那么简单。

我最后做的是检查Request.ServerVariables["LOGON_USER"]值以及Request.Url.Host,然后强制响应代码为,401以向访问者的浏览器显示身份验证质询。我在站点之间共享的 Web.config 文件中启用了匿名和 Windows 身份验证模式。

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

相关内容