ClaimsPrincipalPermission 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示使用 ClaimsAuthorizationManager 实施的权限,以确定对资源的访问是否应授予活动原则。 此类不能被继承。
public ref class ClaimsPrincipalPermission sealed : System::Security::IPermission, System::Security::Permissions::IUnrestrictedPermission
[System.Serializable]
public sealed class ClaimsPrincipalPermission : System.Security.IPermission, System.Security.Permissions.IUnrestrictedPermission
[<System.Serializable>]
type ClaimsPrincipalPermission = class
interface IPermission
interface ISecurityEncodable
interface IUnrestrictedPermission
Public NotInheritable Class ClaimsPrincipalPermission
Implements IPermission, IUnrestrictedPermission
- 继承
-
ClaimsPrincipalPermission
- 属性
- 实现
示例
以下示例演示如何使用 Demand 方法、 CheckAccess 方法或 ClaimsPrincipalPermissionAttribute 声明保护资源。 在每种情况下,都会调用配置的 ClaimsAuthorizationManager ,以针对指定的资源和操作评估当前主体。 如果当前主体未获得对指定资源执行的指定操作的授权, SecurityException 则会引发 ;否则,将继续执行。
using System;
using System.IdentityModel.Services;
using System.Security.Claims;
using System.Security.Permissions;
using System.Threading;
namespace ClaimsBasedAuthorization
{
/// <summary>
/// Program illustrates using Claims-based authorization
/// </summary>
class Program
{
static void Main(string[] args)
{
//
// Method 1. Simple access check using static method.
// Expect this to be most common method.
//
ClaimsPrincipalPermission.CheckAccess("resource", "action");
//
// Method 2. Programmatic check using the permission class
// Follows model found at http://msdn.microsoft.com/library/system.security.permissions.principalpermission.aspx
//
ClaimsPrincipalPermission cpp = new ClaimsPrincipalPermission("resource", "action");
cpp.Demand();
//
// Method 3. Access check interacting directly with the authorization manager.
//
ClaimsAuthorizationManager am = new ClaimsAuthorizationManager();
am.CheckAccess(new AuthorizationContext((ClaimsPrincipal)Thread.CurrentPrincipal, "resource", "action"));
//
// Method 4. Call a method that is protected using the permission attribute class
//
ProtectedMethod();
Console.WriteLine("Press [Enter] to continue.");
Console.ReadLine();
}
//
// Declarative access check using the permission class. The caller must satisfy both demands.
//
[ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "resource", Operation = "action")]
[ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "resource1", Operation = "action1")]
static void ProtectedMethod()
{
}
}
}
以下 XML 显示了对 类使用自定义声明授权管理器 ClaimsPrincipalPermission 所需的最低配置。 至少必须在 元素中声明 system.identityModel
和 system.identityModel.services
节,然后在默认标识配置下的 <claimsAuthorizationManager> 元素中<configSection>
指定授权管理器。 这将确保从默认联合配置引用授权管理器。 或者,可以指定在 federationConfiguration> 元素的 属性中指定授权管理器所依据的<标识配置的名称。identityConfigurationName
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!-- WIF configuration sections -->
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.identityModel>
<identityConfiguration>
<claimsAuthorizationManager type ="MyClaimsAuthorizationManager.MyClaimsAuthorizationManager, MyClaimsAuthorizationManager"/>
</identityConfiguration>
</system.identityModel>
</configuration>
注解
类 ClaimsPrincipalPermission 提供使用 ClaimsAuthorizationManager 为应用程序配置的 执行命令性访问检查的功能。 通过调用 Demand 方法或静态 CheckAccess 方法,可以根据为声明身份验证管理器定义的授权策略,从代码的执行路径中为资源提供保护。 可以使用 类执行 ClaimsPrincipalPermissionAttribute 声明性访问检查。
重要
类ClaimsPrincipalPermission使用 由 在 属性下FederatedAuthentication.FederationConfiguration设置的 IdentityConfiguration 配置的声明授权管理器。 这在所有情况下都是如此,即使在不使用 WS-Federation 的情况下也是如此;例如,活动 (WCF) Web 应用程序和控制台应用程序。 可以在配置中或以编程方式指定声明授权管理器。 若要在配置文件中指定声明授权管理器,请在 identityConfiguration> 元素下<设置 <claimsAuthorizationManager> 元素,并确保运行时 (加载的 federationConfiguration> 元素引用<此标识配置,例如,通过将 属性设置为 identityConfigurationName
) 。 若要以编程方式设置声明授权管理器,请提供 FederatedAuthentication.FederationConfigurationCreated 事件的处理程序。
在一个层面上,提供 ClaimsPrincipalPermission 的功能类似于通过 PrincipalPermission 类提供的基于角色的访问检查 (RBAC) ;但是, ClaimsAuthorizationManager 类根据活动主体提供的声明执行检查。 这比通过纯 RBAC 提供的粒度要高得多,因为纯 RBAC 通常会在单个角色下收集许多权限。 更重要的是,基于声明的授权可以实现业务逻辑和授权策略的更好分离,因为对代码中的资源执行特定操作需要权限,而后端策略可用于配置呈现实体必须拥有哪些声明才能满足需求。 与 RBAC 一样,ClaimsPrincipalPermission执行基于用户的访问检查,也就是说,与派生自 CodeAccessPermission 类的类实现的代码访问安全性不同,使用堆栈遍历来确保代码的所有调用方都已被授予权限,ClaimsPrincipalPermission仅在当前主体上执行其检查。
静态 CheckAccess 方法检查对指定资源执行指定操作的访问。 资源和操作都是字符串,通常是 URI。 还可以使用 操作和资源初始化 的 ClaimsPrincipalPermission 实例,并调用 Demand 方法。 尽管构造函数仅采用单个资源和操作,ClaimsPrincipalPermission但可以通过 和 Intersect 方法组合Union对象。 使用这些方法创建的权限可能包含多个资源操作对。
这两种方法通过调用 ClaimsAuthorizationManager.CheckAccess 已配置的声明授权管理器的 方法来确定访问权限,该管理器由 AuthorizationContext 活动主体 (Thread.CurrentPrincipal) 、资源和操作组成。 如果当前主体无权对资源执行操作,则引发 SecurityException ;否则,将继续执行。
对于包含多个资源操作对的 ClaimsPrincipalPermission , ClaimsAuthorizationManager.CheckAccess 将针对权限中包含的每个资源操作对调用 方法。 若要成功调用 Demand ,必须为权限中包含的所有资源操作对授权活动主体。
构造函数
ClaimsPrincipalPermission(String, String) |
创建 ClaimsPrincipalPermission 类的新实例。 |
方法
CheckAccess(String, String) |
检查是否授权当前主体在指定资源上执行指定操作。 |
Copy() |
返回当前 ClaimsPrincipalPermission 实例的副本。 |
Demand() |
检查当前主体是否获得与当前实例关联的资源操作对的授权。 |
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
FromXml(SecurityElement) |
通过指定的 XML 内码重新构建当前权限及其状态。 |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
Intersect(IPermission) |
返回一个权限,该权限是当前权限与指定权限的交集。 |
IsSubsetOf(IPermission) |
返回一个值,该值指示当前权限是否为指定权限的一个子集。 |
IsUnrestricted() |
返回一个值,指示权限是否不受限。 |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |
ToXml() |
返回当前权限及其状态的 XML 编码形式。 |
Union(IPermission) |
返回一个新权限,该权限是当前权限与指定权限的并集。 具有当前实例和目标实例中存在的所有资源操作对的 ClaimsPrincipalPermission 对象。 |