本教程阐释在ASP.NET2.0版中,IIS集成Windows身份验证以及ASP.NETWindows身份验证的工作机制。同时,阐释NTLM和Kerberos身份验证的工作机制。此外,本教程还阐释WindowsAuthenticationModule类如何构造WindowsPrincipal和WindowsIdentity对象,然后将这些对象附加到当前的ASP.NETWeb请求以表示经过身份验证的用户。 概述 身份验证是一个验证客户端身份的过程,通常采用指定的第三方授权方式。客户端可能是最终用户、计算机、应用程序或服务。客户端的标识称为安全原则。为了使用服务器应用程序进行验证,客户端提供某种形式的凭据来允许服务器验证客户端的标识。确认了客户端的标识后,应用程序可以授予执行操作和访问资源的原则。 如果应用程序使用ActiveDirectory用户存储,则应该使用集成Windows身份验证。对ASP.NET应用程序使用集成Windows身份验证时,最好的方法是使用ASP.NET的Windows身份验证提供程序附带的Internet信息服务(IIS)身份验证方法。使用该方法,将自动创建一个WindowsPrincipal对象(封装一个WindowsIdentity对象)来表示经过身份验证的用户。您无需编写任何身份验证特定的代码。 ASP.NET还支持使用Windows身份验证的自定义解决方案(避开了IIS身份验证)。例如,可以编写一个根据ActiveDirectory检查用户凭据的自定义ISAPI筛选器。使用该方法,必须手动创建一个WindowsPrincipal对象。 ASP.NET身份验证 IIS向ASP.NET传递代表经过身份验证的用户或匿名用户帐户的令牌。该令牌在一个包含在IPrincipal对象中的IIdentity对象中维护,IPrincipal对象进而附加到当前Web请求线程。可以通过HttpContext.User属性访问IPrincipal和IIdentity对象。这些对象和该属性由身份验证模块设置,这些模块作为HTTP模块实现并作为ASP.NET管道的一个标准部分进行调用,如图3所示。 图3.ASP.NET管道 ASP.NET管道模型包含一个HttpApplication对象、多个HTTP模块对象,以及一个HTTP处理程序对象及其相关的工厂对象。HttpRuntime对象用于处理序列的开头。在整个请求生命周期中,HttpContext对象用于传递有关请求和响应的详细信息。 有关ASP.NET请求生命周期的详细信息,请参阅"ASP.NETLifeCycle",网址是http://msdn2.microsoft.com/library/ms227435(en-US,VS.80).aspx。 身份验证模块 ASP.NET2.0在计算机级别的Web.config文件中定义一组HTTP模块。其中包括大量身份验证模块,如下所示: 以下是引用片段: <httpModules> <addname="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/> <addname="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/> <addname="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/> </httpModules> 只加载一个身份验证模块,这取决于该配置文件的authentication元素中指定了哪种身份验证模式。该身份验证模块创建一个IPrincipal对象并将它存储在HttpContext.User属性中。这是很关键的,因为其他授权模块使用该IPrincipal对象作出授权决定。 当IIS中启用匿名访问且authentication元素的mode属性设置为none时,有一个特殊模块将默认的匿名原则添加到HttpContext.User属性中。因此,在进行身份验证之后,HttpContext.User绝不是一个空引用(在VisualBasic中为Nothing)。 WindowsAuthenticationModule 如果Web.config文件包含以下元素,则激活WindowsAuthenticationModule类。 以下是引用片段: <authenticationmode="Windows"/> WindowsAuthenticationModule类负责创建WindowsPrincipal和WindowsIdentity对象来表示经过身份验证的用户,并且负责将这些对象附加到当前Web请求。 对于Windows身份验证,遵循以下步骤: •WindowsAuthenticationModule使用从IIS传递到ASP.NET的Windows访问令牌创建一个WindowsPrincipal对象。该令牌包装在HttpContext类的WorkerRequest属性中。引发AuthenticateRequest事件时,WindowsAuthenticationModule从HttpContext类检索该令牌并创建WindowsPrincipal对象。HttpContext.User用该WindowsPrincipal对象进行设置,它表示所有经过身份验证的模块和ASP.NET页的经过身份验证的用户的安全上下文。 •WindowsAuthenticationModule类使用P/Invoke调用Win32函数并获得该用户所属的Windows组的列表。这些组用于填充WindowsPrincipal角色列表。 •WindowsAuthenticationModule类将WindowsPrincipal对象存储在HttpContext.User属性中。随后,授权模块用它对经过身份验证的用户授权。 注:DefaultAuthenticationModule类(也是ASP.NET管道的一部分)将Thread.CurrentPrincipal属性设置为与HttpContext.User属性相同的值。它在处理AuthenticateRequest事件之后进行此操作。 |