ClaimsAuthorizationManager 类

定义

定义身份验证管理器的基本实现。

public ref class ClaimsAuthorizationManager : System::IdentityModel::Configuration::ICustomIdentityConfiguration
public class ClaimsAuthorizationManager : System.IdentityModel.Configuration.ICustomIdentityConfiguration
type ClaimsAuthorizationManager = class
    interface ICustomIdentityConfiguration
Public Class ClaimsAuthorizationManager
Implements ICustomIdentityConfiguration
继承
ClaimsAuthorizationManager
实现

示例

主题中使用的 ClaimsAuthorizationManager 代码示例取自示例 Claims Based Authorization 。 此示例提供了一个自定义声明授权管理器,该管理器可以根据配置中指定的策略对使用者进行授权。 自定义声明授权管理器由三个基本组件组成:派生自 ClaimsAuthorizationManager 实现管理器的类、 ResourceAction 配对资源和操作的类,以及读取和编译配置文件中指定的策略的策略读取器。 然后,声明授权管理器可以使用此编译的策略来评估主体,以便授权访问资源。 为了简洁起见,并非所有元素都显示。 有关此示例和可用于 WIF 的其他示例以及下载位置的信息,请参阅 WIF 代码示例索引

以下代码演示自定义声明授权管理器的实现。 方法 LoadCustomConfiguration 使用策略读取器帮助程序类从配置中读取和编译策略, (未显示) 并且 CheckAccess 方法基于此策略授予或拒绝访问。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Xml;

namespace ClaimsAuthorizationLibrary
{
    /// <summary>
    /// Simple ClaimsAuthorizationManager implementation that reads policy information from the .config file
    /// </summary>
    public class MyClaimsAuthorizationManager : ClaimsAuthorizationManager
    {
        static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
        PolicyReader _policyReader = new PolicyReader();

        /// <summary>
        /// Creates a new instance of the MyClaimsAuthorizationManager
        /// </summary>        
        public MyClaimsAuthorizationManager()
        {
        }

        /// <summary>
        /// Overloads  the base class method to load the custom policies from the config file
        /// </summary>
        /// <param name="nodelist">XmlNodeList containing the policy information read from the config file</param>
        public override void LoadCustomConfiguration(XmlNodeList nodelist)
        {
            Expression<Func<ClaimsPrincipal, bool>> policyExpression;

            foreach (XmlNode node in nodelist)
            {
                //
                // Initialize the policy cache
                //
                XmlDictionaryReader rdr = XmlDictionaryReader.CreateDictionaryReader(new XmlTextReader(new StringReader(node.OuterXml)));
                rdr.MoveToContent();

                string resource = rdr.GetAttribute("resource");
                string action = rdr.GetAttribute("action");

                policyExpression = _policyReader.ReadPolicy(rdr);

                //
                // Compile the policy expression into a function
                //
                Func<ClaimsPrincipal, bool> policy = policyExpression.Compile();

                //
                // Insert the policy function into the policy cache
                //
                _policies[new ResourceAction(resource, action)] = policy;
            }
        }

        /// <summary>
        /// Checks if the principal specified in the authorization context is authorized to perform action specified in the authorization context 
        /// on the specified resoure
        /// </summary>
        /// <param name="pec">Authorization context</param>
        /// <returns>true if authorized, false otherwise</returns>
        public override bool CheckAccess(AuthorizationContext pec)
        {
            //
            // Evaluate the policy against the claims of the 
            // principal to determine access
            //
            bool access = false;
            try
            {
                ResourceAction ra = new ResourceAction(pec.Resource.First<Claim>().Value, pec.Action.First<Claim>().Value);

                access = _policies[ra](pec.Principal);
            }
            catch (Exception)
            {
                access = false;
            }

            return access;
        }
    }
}

以下代码显示了 ResourceAction 自定义声明管理器使用的类。

using System;

namespace ClaimsAuthorizationLibrary
{
    /// <summary>
    /// Class to encapsulate resource/action pair
    /// </summary>
    public class ResourceAction
    {
        public string Resource;
        public string Action;

        /// <summary>
        /// Checks if the current instance is equal to the given object by comparing the resource and action values
        /// </summary>
        /// <param name="obj">object to compare to</param>
        /// <returns>True if equal, else false.</returns>
        public override bool Equals(object obj)
        {
            ResourceAction ra = obj as ResourceAction;
            if (ra != null)
            {
                return ((string.Compare(ra.Resource, Resource, true) == 0) && (string.Compare(ra.Action, Action, true) == 0));
            }

            return base.Equals(obj);
        }

        /// <summary>
        /// Gets the hash code.
        /// </summary>
        /// <returns>The hash code.</returns>
        public override int GetHashCode()
        {
            return (Resource + Action).ToLower().GetHashCode();
        }

        /// <summary>
        /// Creates an instance of ResourceAction class.
        /// </summary>
        /// <param name="resource">The resource name.</param>
        /// <param name="action">The action.</param>
        /// <exception cref="ArgumentNullException">when <paramref name="resource"/> is null</exception>
        public ResourceAction(string resource, string action)
        {
            if (string.IsNullOrEmpty(resource))
            {
                throw new ArgumentNullException("resource");
            }

            Resource = resource;
            Action = action;
        }
    }
}

以下 XML 演示如何为 IIS 7.5 中托管的 Web 应用程序配置上面所示的声明授权管理器。 仅显示特定于声明授权管理器配置的元素。 请注意,对 类的 ClaimsAuthorizationModule 引用必须添加到 元素下的 <system.Webserver> 管道中。 对于在 IIS 7 之前的 IIS 版本中托管的站点和应用程序,可以将模块添加到 元素下的 <system.Web> 管道中。 显示此配置,但已注释掉。

声明授权管理器使用的策略由 claimsAuthorizationManager> 元素下的<自定义<policy>元素指定。 在第一个策略中,主体必须拥有指定声明之一,才能对指定资源执行指定操作。 第二个策略中,主体必须同时拥有两个声明,才能对指定资源执行指定操作。 在所有其他情况下,无论主体拥有何种声明,都将自动授予主体访问权限。

<configuration>
  <configSections>
    <!--WIF 4.5 sections -->
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    ...

  </configSections>

  ...

  <system.web>
    <httpModules>
      <!--WIF 4.5 modules -->
      <!--Not needed here for IIS >= 7 -->
      <!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
    </httpModules>
  </system.web>

  ...

  <system.webServer>
    <modules>
      <!--WIF 4.5 modules -->
      <add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </modules>
  </system.webServer>

  ...

  <!-- WIF 4.5 s.im section-->
  <system.identityModel>
    <identityConfiguration>
      <claimsAuthorizationManager type="ClaimsAuthorizationLibrary.MyClaimsAuthorizationManager, ClaimsAuthorizationLibrary">
        <policy resource="http://localhost:28491/Developers.aspx" action="GET">
          <or>
            <claim claimType="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" claimValue="developer" />
            <claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
          </or>
        </policy>
        <policy resource="http://localhost:28491/Administrators.aspx" action="GET">
          <and>
            <claim claimType="http://schemas.xmlsoap.org/claims/Group" claimValue="Administrator" />
            <claim claimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country" claimValue="USA" />
          </and>
        </policy>
        <policy resource="http://localhost:28491/Default.aspx" action="GET">
        </policy>
        <policy resource="http://localhost:28491/" action="GET">
        </policy>
        <policy resource="http://localhost:28491/Claims.aspx" action="GET">
        </policy>
      </claimsAuthorizationManager>

      ...

    </identityConfiguration>
  </system.identityModel>
  ...

</configuration><configuration>
  <configSections>
    <!--WIF 4.5 sections -->
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    ...

  </configSections>

  ...

  <system.web>
    <httpModules>
      <!--WIF 4.5 modules -->
      <!--Not needed here for IIS >= 7 -->
      <!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
    </httpModules>
  </system.web>

  ...

  <system.webServer>
    <modules>
      <!--WIF 4.5 modules -->
      <add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </modules>
  </system.webServer>

  ...

  <!-- WIF 4.5 s.im section-->
  <system.identityModel>
    <identityConfiguration>
      <claimsAuthorizationManager type="MyClaimsAuthorizationManager.SimpleClaimsAuthorizationManager, MyClaimsAuthorizationManager" />
      ...

  </system.identityModel>
  ...

</configuration>

注解

ClaimsAuthorizationManager 为声明授权管理器提供基本实现。 声明授权管理器可用于以下两种情况:

  • 在基于 Web 的应用程序和服务中,可以将声明授权管理器添加到处理管道中,以提供一个扩展点,在调用实际实现所请求资源的应用程序代码之前,可以根据传入声明的值授权访问资源。

  • 在代码中使用 ClaimsPrincipalPermission 类或 ClaimsPrincipalPermissionAttribute 类执行基于声明的命令性或声明性访问检查时,系统会调用为应用程序配置的声明授权管理器来执行检查。 可以在基于 Web 的应用程序和桌面应用程序中执行基于声明的访问检查。

类提供 ClaimsAuthorizationManager 的默认实现授权对提供的每个声明进行访问;但是,你可以从此类派生并重写 CheckAccess 方法以提供你自己的授权逻辑。

声明授权管理器的使用是可选的。 可以通过使用 类或声明方式将应用程序配置为使用IdentityConfiguration声明授权管理器,方法是指定 <claimsAuthorizationManager> 元素,该元素是应用程序配置文件中的 identityConfiguration> 元素的<子元素。 如果应用程序是托管在 Internet Information Services (IIS) 中的网站或 Web 应用程序,则还必须 ClaimsAuthorizationModule 在 ASP.NET HTTP Modules 集合中添加 。

重要

使用 ClaimsPrincipalPermission 类或 ClaimsPrincipalPermissionAttribute 类时,用于执行访问检查的声明授权管理器是在 属性下的 FederatedAuthentication.FederationConfiguration 标识配置中指定的声明授权管理器。 在配置文件中,它是 <identityConfiguration> 从默认 <federationConfiguration> 元素引用的 节。 即使对于 Windows Communication Foundation (WCF) 服务和桌面应用程序也是如此。

ClaimsAuthorizationManager 类不采用任何其他配置;但是,可以重写 LoadCustomConfiguration 派生类中的 ,以便从 的子元素 <claimsAuthorizationElement>初始化声明授权管理器。 典型的方案是使用这些子元素来指定授权策略,这些策略确定需要哪些声明类型和值才能访问哪个资源。 这不是硬性要求,但你可以自由定义任何对实现有意义的用法和语法。

构造函数

ClaimsAuthorizationManager()

初始化 ClaimsAuthorizationManager 类的新实例。

方法

CheckAccess(AuthorizationContext)

在派生类中实现时,检查对指定上下文中的主题的授权,以在指定资源上执行指定操作。

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
LoadCustomConfiguration(XmlNodeList)

在派生类中重写时,将从 XML 中加载自定义配置。

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于