ClaimsPrincipalPermission 类

定义

表示使用 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.identityModelsystem.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 ;否则,将继续执行。

对于包含多个资源操作对的 ClaimsPrincipalPermissionClaimsAuthorizationManager.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 对象。

适用于

另请参阅