为什么“Forms”的身份验证模式会导致一个空的LOGON_USER服务器变量?

时间:2009-08-13 17:54:26

标签: iis authentication asp.net-membership forms-authentication windows-authentication

是否可以:

禁止在IIS中进行匿名访问

...有

<authenticate mode="Forms"/>

...在Web配置中?我们需要访问ASP.Net成员资格提供程序访问LOGON_USER服务器变量中的Windows用户名。

我们发现,如果我们还将身份验证模式设置为“Windows”,那么在IIS中禁止匿名访问只会填充LOGON_USER ...然后我们不会使用成员资格提供程序。

我很困惑为什么“Forms”模式会导致一个空的LOGON_USER变量。

1 个答案:

答案 0 :(得分:2)

因为它们完全是不同的身份验证方案。

通过使用禁用匿名访问(使用Windows帐户),一个在技术上是运行在开放模式的应用程序(没有应用级认证),并依靠IIS否认页面,谁可能是没有用认证的那些人您的域名或无权查看页面)。由于LOGON_USER变量,应用程序只知道正在运行它的人,但应用程序根本没有对用户进行身份验证。执行身份验证的是IIS(根据域名或组等拒绝用户)。

当您告诉应用程序通过WINDOWS进行身份验证时,您将该网站的应用程序帐户绑定到来自IIS的信息(LOGON_USER变量)将被视为该应用程序帐户。

Forms Authentication,希望您生成一个实现IPrincipal的对象,并将其分配给应用程序以获取特定的请求集(允许您访问诸如Page.User.IsAuthenticated之类的内容)。此外,它期望创建和设置FormAuthenticationTicket(这是处理cookie而不是。)这些事情可以通过登录提供程序或手动完成。

现在,这是有趣的东西。

在为了使用FORMS认证模式和禁用匿名访问,所有必须要做的就是自动使用户登录到系统(生成FormsAuthentication cookiee)用传递给经由LOGON_USER可变应用程序的信息。这可以通过检查用户是否已经过身份验证或者Global.asax方法是否围绕一组新请求(例如application_authenticaterequest或application_sessionstart)来完成

或者,您可以允许匿名访问,但是要对您的AD服务器执行FORMS身份验证:http://msdn.microsoft.com/en-us/library/ms998360.aspx