.NET Framework 用户操作基础知识
更新:2007 年 11 月
.NET Framework 在 System.Security.Principal 命名空间中提供了基于角色的安全实现,在应用程序中对用户进行授权和身份验证时可以使用该实现。本主题讨论如何在 .NET Framework 中使用应用程序授权,并创建 IIdentity 和 IPrincipal 对象来表示用户。
IIdentity 封装已经过身份验证的用户。IPrincipal 是用户的标识及其具有的任何角色的组合。您可以使用 System.Security.Principal 命名空间中的预定义标识和主体类,也可以通过创建实现接口的类来添加自定义身份验证。
若要使用这些接口,必须完全限定接口名称,或都通过在受影响的源代码文件开头处包括 Imports 语句来导入适当的命名空间。有关更多信息,请参见 Imports 语句(.NET 命名空间和类型)。
在 .NET Framework 应用程序中使用基于角色的安全性
每个应用程序线程都可以具有一个关联的主体对象(可通过 CurrentPrincipal 属性访问),该对象表示代码正在代表其运行的用户的安全上下文。主体对象封装用户的用户安全上下文(或标识)对象。使用两个对象可允许分离身份验证(在标识对象中)和授权(在主体中)。
标识对象必须实现 IIdentity 接口。标识对象表示特定用户,并根据 IIdentity 接口的要求公开下列属性:Name、IsAuthenticated 和 AuthenticationType。标识对象通常具有执行用户身份验证的其他私有成员。
主体对象必须实现 IPrincipal 接口。主体对象通过公开下列成员(根据 IPrincipal 接口的要求)来封装用户的安全上下文:IsInRole 方法(执行授权)和 Identity 属性(提供对用户的标识对象的访问)。
处理标识
.NET Framework 提供了四个用于实现 IIdentity 接口的类:
每个类允许您处理不同类型的用户标识。若要访问使用 Windows 身份验证的应用程序的当前 WindowsIdentity 对象,请使用 WindowsIdentity 类的静态 GetCurrent 方法。您也可以通过调用 My.User.InitializeWithWindowsUser 方法设置当前线程的主体。
还可以通过在自己的自定义类中实现 IIdentity 接口来创建自定义标识类。有关创建自定义标识的更多信息,请参见演练:实现自定义身份验证和授权。
处理主体
.NET Framework 提供 IPrincipal 接口以链接用户角色和标识。如果您的应用程序执行授权,则应该使用一个实现 IPrincipal 的对象。例如,WindowsIdentity 和 GenericIdentity 类提供 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 权限: