通过


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 以根据指定的资源和操作评估当前主体。 如果当前主体未获得指定资源上指定操作的授权,则会引发 a 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元素中的<configSection>节和system.identityModel.services节,然后在默认标识配置下的 claimsAuthorizationManager> 元素中<指定授权管理器。 这将确保从默认联合配置引用授权管理器。 或者,可以指定在 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 一样, ClaimsPrincipalPermission 执行基于用户的访问检查,也就是说,与派生自 CodeAccessPermission 类的类实现的代码访问安全性不同,并使用堆栈演练来确保代码的所有调用方都被授予权限, ClaimsPrincipalPermission 仅对当前主体执行其检查。

静态 CheckAccess 方法检查对指定资源上的指定操作的访问。 资源和操作都是字符串,通常是 URI。 还可以使用操作和资源初始化实例 ClaimsPrincipalPermission 并调用 Demand 该方法。 尽管构造函数只采用单个资源和操作,ClaimsPrincipalPermission但可以通过和Intersect方法组合Union对象。 使用这些方法创建的权限可能包含多个资源操作对。

这两种方法通过调用 ClaimsAuthorizationManager.CheckAccess 已配置的声明授权管理器的方法(包括 AuthorizationContext 活动主体、Thread.CurrentPrincipal资源和操作)来确定访问权限。 如果当前主体无权对资源执行操作,则引发 a 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 对象,其中包含当前实例和目标实例中存在的所有资源操作对。

适用于

另请参阅