Share via


设置基于角色的安全策略和主体

利用基于角色的安全性策略,组件可以在运行时识别当前用户及其关联角色。 然后,将使用代码访问安全策略映射此信息,以确定在运行时授予的权限集。 对于给定应用程序域,宿主可更改默认的基于角色的安全性策略并设置默认安全主体。 安全主体表示用户和与该用户相关联的角色。

基于角色的安全性策略通常用于实现自定义的身份验证方案。 例如,ASP.NET 宿主使用基于角色的安全性策略来实现基于用户信息的身份验证方案,这些用户信息将从 Internet 信息服务 (IIS) 中获取。

用户和用户角色的定义都针对于特定的应用程序。 应用程序可以具有不同于 Windows 的用户概念。 例如,应用程序可以要求用户在登录到该应用程序时提供用户名和密码。 该用户名/密码与用户登录到 Windows 时使用的用户名/密码无关。

显式设置线程的主体

如果线程已设置主体,则会忽略应用程序域的策略和默认主体。 例如,线程可能是使用 Thread 类的 CurrentPrincipal 静态属性(Visual Basic 中的 Shared 属性)为自己设置的主体。 另外,线程还可能是从启动它的线程那里获得自己的主体的。

注意注意

在 .NET Framework 2.0 版本中,如果某个线程启动了其他线程,或将某个工作项插入了等待线程池执行的队列中,该线程的上下文(包括安全主体)会自动流向子线程或线程池线程。在 .NET Framework 1.0 和 1.1 版本中,上下文仅流向由线程启动的线程,不流向线程池线程。

如果没有安全主体的线程执行了需要主体的操作,则会基于当前应用程序域的安全策略和默认安全主体提供主体。

注意注意

当没有安全主体的线程使用 CurrentPrincipal 静态属性来查询其主体时,会使用应用程序域的默认值来设置此主体。即,CurrentPrincipal 绝不会返回 null。

应用程序域的策略和默认主体

宿主可通过调用 SetThreadPrincipal 方法来设置应用程序域的默认主体。 如果已提供了默认主体,则会将该主体分配给应用程序域中正在执行的、需要主体但没有主体的任何线程。

注意注意

即使调用 SetThreadPrincipal 的线程没有主体,默认主体也不会自动应用于该线程。如果该线程后来需要主体,但当时并没有获得主体,则会根据正在执行该线程的应用程序域的默认主体和策略为该线程分配主体。

如果应用程序域没有设置默认主体,则会根据该应用程序域的策略为线程分配主体。 默认情况下,应用程序域的策略是为线程分配未经身份验证的泛型主体。 宿主可通过调用 SetPrincipalPolicy 方法来更改应用程序域的这个策略。 例如,下面的托管代码会创建一个应用程序域,并将其策略设置为使用当前的 Windows 主体。

Dim ad As AppDomain = AppDomain.CreateDomain("Child")
ad.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
AppDomain ad = AppDomain.CreateDomain("Child");
ad.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
AppDomain^ ad = AppDomain::CreateDomain("Child");
ad->SetPrincipalPolicy(PrincipalPolicy::WindowsPrincipal);

非托管宿主可使用 _AppDomain 接口访问应用程序域,这样可在 .NET Framework 的不同版本中保留 vtable 顺序。

请参见

参考

System.AppDomain

概念

承载概述

基于角色的安全性

其他资源

安全性的基础概念