科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道ASP.NET 2.0 中的 Windows 身份验证 3

ASP.NET 2.0 中的 Windows 身份验证 3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

asp.net 2.0 在计算机级别的 Web.config 文件中定义一组 HTTP 模块。其中包括大量身份验证模块,如下所示:

作者:中国IT实验室 来源:中国IT实验室 2007年9月7日

关键字: 身份验证 Windows ASP.NET

  • 评论
  • 分享微博
  • 分享邮件
 身份验证模块

    asp.net 2.0 在计算机级别的 Web.config 文件中定义一组 HTTP 模块。其中包括大量身份验证模块,如下所示:

<httpModules>

  <add name="WindowsAuthentication"
    type="System.Web.Security.WindowsAuthenticationModule" />
  <add name="FormsAuthentication"
    type="System.Web.Security.FormsAuthenticationModule" />
  <add name="PassportAuthentication"
    type="System.Web.Security.PassportAuthenticationModule" />

</httpModules>

    只加载一个身份验证模块,这取决于该配置文件的 authentication 元素中指定了哪种身份验证模式。该身份验证模块创建一个 iprincipal 对象并将它存储在 httpcontext.user 属性中。这是很关键的,因为其他授权模块使用该 iprincipal 对象作出授权决定。

    当 IIS 中启用匿名访问且 authentication 元素的 mode 属性设置为 none 时,有一个特殊模块将默认的匿名原则添加到 httpcontext.user 属性中。因此,在进行身份验证之后,httpcontext.user 绝不是一个空引用(在 Visual Basic 中为 nothing)。

    windowsauthenticationmodule

    如果 Web.config 文件包含以下元素,则激活 windowsauthenticationmodule 类。

<authentication mode="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 事件之后进行此操作。

    授权模块

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

<httpModules>
  <add name="UrlAuthorization"
    type="System.Web.Security.UrlAuthorizationModule" />
  <add name="FileAuthorization"
    type="System.Web.Security.FileAuthorizationModule" />
  <add name="AnonymousIdentification"
    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 中,用 windowsprincipal 和 windowsidentity 类表示使用 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();

    表 1 显示从各种标识属性获得的结果标识,当您的应用程序使用 Windows 身份验证且 IIS 配置为使用集成 Windows 身份验证时,可以从 ASP.NET 应用程序使用这些标识属性。

表 1:线程公开的 CurrentPrincipal Object
Web.config 设置 变量位置 结果标识

<identity impersonate="true"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
线程

Domain\UserName
Domain\UserName
Domain\UserName

<identity impersonate="false"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
线程

Domain\UserName
NT AUTHORITY\NETWORK SERVICE
Domain\UserName

<identity impersonate="true"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
线程

用户提供的名称
Domain\UserName
用户提供的名称

<identity impersonate="false"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
线程

用户提供的名称
NT AUTHORITY\NETWORK SERVICE
用户提供的名称

七、模拟

    asp.net 应用程序可以使用模拟来执行操作,使用经过身份验证的客户端或特定 Windows 帐户的安全上下文来访问资源。

    初始用户模拟

    要模拟初始(经过身份验证的)用户,请在 Web.config 文件中使用以下配置:

<authentication mode="Windows" />
<identity impersonate="true" />

    使用该配置,asp.net 始终模拟经过身份验证的用户,且所有资源访问均使用经过身份验证的用户的安全上下文执行。如果您的应用程序的虚拟目录上启用了匿名访问,则模拟 IUSR_MACHINENAME 帐户。

    要暂时模拟经过身份验证的调用方,将 identity 元素的 impersonate 属性设置为 false,然后使用以下代码:

using System.Security.Principal;
...
// Obtain the authenticated user's identity.
WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
    // Start impersonating.
    ctx = winId.Impersonate();
    // Now impersonating.
    // Access resources using the identity of the authenticated user.
}
// Prevent exceptions from propagating.
catch
{
}
finally
{
    // Revert impersonation.
    if (ctx != null)
        ctx.Undo();
}
// Back to running under the default ASP.NET process identity.

 

    这段代码模拟经过身份验证的初始用户。在 httpcontext.current.user.identity 对象中维护初始用户的标识和 Windows 令牌。

    固定标识模拟

    如果需要在应用程序的整个生命周期中模拟相同的标识,可以在 Web.config 文件中的 identity 元素上指定凭据。以下示例显示如何模拟名为"TestUser"的 Windows 帐户。

    如果使用该方法,应该对这些凭据进行加密。使用 ASP.NET 2.0,您可以使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe)。使用 ASP.NET 1.1 版,您可以使用 Aspnet_setreg.exe 实用工具。有关该实用工具的详细信息,请参阅 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrfaspnetiisregistrationtoolaspnet_regiisexe.asp.

    要在 ASP.NET 应用程序中使用固定标识进行资源访问,可使用 Windows 2000 Server 或 Windows Server 2003 上的 identity 元素来配置凭据。如果正在运行 Windows Server 2003,其中的 IIS 6.0 配置为运行在辅助进程隔离模式下(默认情况),则可通过将 ASP.NET 应用程序配置为在自定义应用程序池(在特定的域标识下运行)中运行来避免模拟。然后,可以使用指定的域标识访问资源而无需使用模拟。

八、委托

    模拟只提供对本地资源的访问。委托是一个扩展的模拟功能,它允许您使用模拟令牌访问网络资源。

    如果应用程序使用 Kerberos v5 身份验证对其用户进行身份验证,则可使用 Kerberos 委托在应用程序的各层传递用户标识并访问网络资源。如果应用程序不使用 Kerberos v5 身份验证,则可使用协议转换切换到 Kerberos,然后使用委托传递该标识。

    windows Server 2003 中的约束委托需要 Kerberos 身份验证。如果您的应用程序无法使用 Kerberos 身份验证对其调用方进行身份验证,您可以使用协议转换从可选的非 Windows 身份验证模式(如,窗体或证书身份验证)切换到 Kerberos 身份验证。然后,可使用具有约束委托的 Kerberos 访问下游网络资源。

    约束的和未约束的委托

    windows 2000 Server 上的 Kerberos 委托是未约束的。Active Directory 中配置了委托的服务器可在使用模拟的用户安全上下文的同时访问任何网络资源或网络上的任何计算机。这会带来潜在的安全威胁,尤其是 Web 服务器遭受恶意用户攻击时。

    为了解决该安全问题,windows Server 2003 引入了约束的委托。这使管理员能够在使用模拟的用户安全上下文时准确指定另一个服务器或域帐户可以访问的服务。

    配置委托

    要使用 Kerberos 委托,需要适当的 Active Directory 配置。

    要授予 Web 服务器委托客户端凭据的权限,请按以下方式配置 Active Directory:

    · 如果在 NetworkService 帐户下运行应用程序,Web 服务器计算机帐户必须在 Active Directory 中标记为受信任委托。

    · 如果在自定义域帐户下运行应用程序,该用户帐户必须在 Active Directory 中标记为受信任委托。

    · 如果应用程序模拟一个用户帐户,请确保应用程序模拟的用户帐户在 Active Directory 中未标记为"敏感帐户,不能被委托".

    有关协议转换和约束委托的详细信息,请参阅 How To: Use Protocol Transition and Constrained Delegation in ASP.NET 2.0.

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章