.NET Framework 用户操作基础知识

更新:2007 年 11 月

.NET Framework 在 System.Security.Principal 命名空间中提供了基于角色的安全实现,在应用程序中对用户进行授权和身份验证时可以使用该实现。本主题讨论如何在 .NET Framework 中使用应用程序授权,并创建 IIdentityIPrincipal 对象来表示用户。

IIdentity 封装已经过身份验证的用户。IPrincipal 是用户的标识及其具有的任何角色的组合。您可以使用 System.Security.Principal 命名空间中的预定义标识和主体类,也可以通过创建实现接口的类来添加自定义身份验证。

若要使用这些接口,必须完全限定接口名称,或都通过在受影响的源代码文件开头处包括 Imports 语句来导入适当的命名空间。有关更多信息,请参见 Imports 语句(.NET 命名空间和类型)

在 .NET Framework 应用程序中使用基于角色的安全性

每个应用程序线程都可以具有一个关联的主体对象(可通过 CurrentPrincipal 属性访问),该对象表示代码正在代表其运行的用户的安全上下文。主体对象封装用户的用户安全上下文(或标识)对象。使用两个对象可允许分离身份验证(在标识对象中)和授权(在主体中)。

标识对象必须实现 IIdentity 接口。标识对象表示特定用户,并根据 IIdentity 接口的要求公开下列属性:NameIsAuthenticatedAuthenticationType。标识对象通常具有执行用户身份验证的其他私有成员。

主体对象必须实现 IPrincipal 接口。主体对象通过公开下列成员(根据 IPrincipal 接口的要求)来封装用户的安全上下文:IsInRole 方法(执行授权)和 Identity 属性(提供对用户的标识对象的访问)。

处理标识

.NET Framework 提供了四个用于实现 IIdentity 接口的类:

每个类允许您处理不同类型的用户标识。若要访问使用 Windows 身份验证的应用程序的当前 WindowsIdentity 对象,请使用 WindowsIdentity 类的静态 GetCurrent 方法。您也可以通过调用 My.User.InitializeWithWindowsUser 方法设置当前线程的主体。

还可以通过在自己的自定义类中实现 IIdentity 接口来创建自定义标识类。有关创建自定义标识的更多信息,请参见演练:实现自定义身份验证和授权

处理主体

.NET Framework 提供 IPrincipal 接口以链接用户角色和标识。如果您的应用程序执行授权,则应该使用一个实现 IPrincipal 的对象。例如,WindowsIdentityGenericIdentity 类提供 IPrincipal 的内置实现。也可以基于 IPrincipal 创建自己的自定义主体类。

可以通过将 IPrincipal 对象分配给线程的 CurrentPrincipal 属性或 My.User.CurrentPrincipal 属性,将当前线程链接到该对象。然后,可以通过测试用户是否是某个特定角色的成员来执行授权检查。为此,请使用主体的 IsInRole 方法。

ASP.NET 应用程序处理 IPrincipal 对象的方式与其他 .NET Framework 应用程序处理该对象的方式不同。ASP.NET 通过无状态的 HTTP 协议创建会话的外观。作为该会话的一部分,对于执行用户请求的所有代码,可以从 HttpContext 对象的 User 属性使用表示该用户的 IPrincipal 对象。在 Global.asax 文件的 OnAuthenticate 事件之后,公共语言运行库使用 User 值自动更新 CurrentPrincipal。ASP.NET 应用程序通常使用 User 属性来执行授权检查。

说明:

手动更改 User 将自动更新在同一 HTTP 上下文中执行的所有线程的 CurrentPrincipal 属性。但是,更改 CurrentPrincipal 并不会影响 User 属性。它仅影响为请求的其余部分选择的线程。

在 ASP.NET 应用程序中,My.User.CurrentPrincipal 属性更新 User 属性。

有关创建您自己的 IPrincipal 类型的更多信息,请参见演练:实现自定义身份验证和授权

授予使用 IIdentity 和 IPrincipal 对象的权限

授予使用 IIdentity 对象的权限时应谨慎,因为这些对象可以使与用户相关的敏感信息供他人使用。应用程序的授权功能是基于其当前主体的,因此您应该保护应用程序的当前 IPrincipal 对象不被更改。

.NET Framework 通过要求这些操作具有代码访问安全权限,来提供上述保护。通过使用代码访问安全策略工具 (Caspol.exe),将 SecurityPermissionAttribute.ControlPrincipal 权限授予需要操作这些对象的应用程序。

默认情况下,所有本地安装的应用程序都具有该权限,因为它们是在 FullTrust 权限集下运行的。

执行下列方法需要 ControlPrincipal 权限:

请参见

任务

演练:实现自定义身份验证和授权

参考

My.User 对象

其他资源

.NET Framework 中的身份验证和授权 (Visual Basic)