asp.net身份验证方式介绍(6)

WindowsAuthenticationModule 类使用 P/Invoke 调用 Win32 函数并获得该用户所属的 Windows 组的列表。这些组用于填充 WindowsPrincipal 角色列表。

WindowsAuthenticationModule 类将 WindowsPrincipal 对象存储在 HttpContext.User 属性中。随后,授权模块用它对经过身份验证的用户授权。

注: DefaultAuthenticationModule 类(也是 ASP.NET 管道的一部分)将 Thread.CurrentPrincipal 属性设置为与 HttpContext.User 属性相同的值。它在处理 AuthenticateRequest 事件之后进行此操作。

授权模块

WindowsAuthenticationModule 类完成其处理之后,如果未拒绝请求,则调用授权模块。授权模块也在计算机级别的 Web.config 文件中的 httpModules 元素中定义,如下所示:

<httpModules> <add type="System.Web.Security.UrlAuthorizationModule" /> <add type="System.Web.Security.FileAuthorizationModule" /> <add type="System.Web.Security.AnonymousIdentificationModule" /> </httpModules>

UrlAuthorizationModule

调用 UrlAuthorizationModule 类时,它在计算机级别或应用程序特定的 Web.config 文件中查找 authorization 元素。如果存在该元素,则 UrlAuthorizationModule 类从 HttpContext.User 属性检索 IPrincipal 对象,然后使用指定的动词(GET、POST 等)来确定是否授权该用户访问请求的资源。

FileAuthorizationModule

接下来,调用 FileAuthorizationModule 类。它检查 HttpContext.User.Identity 属性中的 IIdentity 对象是否是 WindowsIdentity 类的一个实例。如果 IIdentity 对象不是 WindowsIdentity 类的一个实例,则 FileAuthorizationModule 类停止处理。

如果存在 WindowsIdentity 类的一个实例,则 FileAuthorizationModule 类调用 AccessCheck Win32 函数(通过 P/Invoke)来确定是否授权经过身份验证的客户端访问请求的文件。如果该文件的安全描述符的随机访问控制列表 (DACL) 中至少包含一个 Read 访问控制项 (ACE),则允许该请求继续。否则,FileAuthorizationModule 类调用 HttpApplication.CompleteRequest 方法并将状态码 401 返回到客户端。

安全上下文

.NET Framework 使用以下两个接口封装 Windows 令牌和登录会话:

System.Security.Principal.IPrincipal

System.Security.Principal.IIdentity(它公开为 IPrincipal 接口中的一个属性。)

HttpContext.User

在 ASP.NET 中,用 WindowsPrincipalWindowsIdentity 类表示使用 Windows 身份验证进行身份验证的用户的安全上下文。使用 Windows 身份验证的 ASP.NET 应用程序可以通过 HttpContext.User 属性访问 WindowsPrincipal 类。

要检索启动当前请求的 Windows 经过身份验证的用户的安全上下文,使用以下代码:

using System.Security.Principal; ... // Obtain the authenticated user's Identity WindowsPrincipal winPrincipal = (WindowsPrincipal)HttpContext.Current.User;

WindowsIdentity.GetCurrent

WindowsIdentity.GetCurrent 方法可用于获得当前运行的 Win32 线程的安全上下文的标识。如果不使用模拟,线程继承 IIS 6.0(默认情况下的 NetworkService 帐户)上进程的安全上下文。

该安全上下文在访问本地资源时使用。通过使用经过身份验证的初始用户的安全上下文或使用固定标识,您可以使用模拟重写该安全上下文。

要检索运行应用程序的安全上下文,使用以下代码:

using System.Security.Principal; ... // Obtain the authenticated user's identity. WindowsIdentity winId = WindowsIdentity.GetCurrent(); WindowsPrincipal winPrincipal = new WindowsPrincipal(winId);

Thread.CurrentPrincipal

ASP.NET 应用程序中的每个线程公开一个 CurrentPrincipal 对象,该对象保存经过身份验证的初始用户的安全上下文。该安全上下文可用于基于角色的授权。

要检索线程的当前原则,使用以下代码:

using System.Security.Principal; ... // Obtain the authenticated user's identity WindowsPrincipal winPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjdpyf.html