我有一台 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;
}