几年来,我们成功地使用了本文中概述的方法,在我们的Asp.Net应用程序中启用了混合模式身份验证:https://stackoverflow.com/a/7735008
我们有两个页面,Login.aspx和WindowsLogin.aspx,上面的文章突出显示了相应的元素。直到最近它坏了,一切都很好,我们无法弄清楚它为什么或什么时候坏了(几个月来,我们一直在开发应用程序中的主要新功能,我们添加了一些托管模块和其他东西,但我试图一次删除一个,但都无济于事)。
我们为我们的全球认证定义了这个:
<system.web>
<authentication mode="Forms">
<forms cookieless="UseCookies" loginUrl="~/Login.aspx" slidingExpiration="true" timeout="10" />
</authentication>
</system.web>
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<basicAuthentication enabled="false" />
<digestAuthentication enabled="false" />
<windowsAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
然后适当的元素与参考文章中的内容完全相同。现在,当我直接在浏览器中访问WindowsLogin.aspx时,它302会将我重定向到Login.aspx,返回url设置为WindowsLogin..aspx。我尝试通过消除所有不需要的配置来简化web.config,直到剩下的只是基本的身份验证和其他部分。仍然WindowsLogin.aspx重定向到Login.aspx(即WindowsLogin..aspx页面上正在启动表单身份验证)。
有趣的是,如果我将loginUrl更改为WindowsLogin.aspx(其他内容保持完全相同),那么WindowsLogin..aspx会向我显示预期的本机浏览器身份验证挑战。
我已经尝试并用尽了我能想到的所有选项,将loginUrl设置为Login.aspx来完成这项工作,但它根本不起作用。
我为302重定向启用了IIS跟踪规则,并捕获了一个WindowsLogin.aspx重定向到Login.aspx的日志文件(其中loginUrl设置为Login.asp克斯)。跟踪文件位于:http://imbibe.in/public/fr000001.xml
有人能帮我弄清楚为什么FormsAuthentication模块在WindowsLogin.aspx页面上启动,而它的WindowsAuthentication模块本应在那里进行身份验证。为什么仅仅切换登录url就会在Windows Auth页面上引发401挑战。我们正在Win Server 2008上使用IIS 7.5。
更新:我创建了一个只有3个页面的简单web应用程序,Default、Login和WindowsLogin,并在同一台服务器上采用混合模式身份验证方法,它成功了。这显然意味着我们的应用程序/应用程序池中存在干扰。我希望提供的IIS跟踪日志可以对它有所帮助。如果我从应用程序的web.config中完全删除<authentiction mode="Forms">
(这基本上意味着没有启用身份验证),那么登录和WindowsLogin页面就可以正常工作。但仅使用当前配置,转到WindowsLogin会重定向回Login.aspx.
您需要在web.config文件中添加一些位置异常(常规System.web部分之外的任何位置):
<!-- Providing it's in the root - No leading slashes! -->
<location path="WindowsLogin.aspx">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
这将允许所有未经身份验证的FORMS用户访问该页面。否则,您的用户将不断被重定向到FORMS登录页面(他们应该这样做)。