次の方法で共有


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 。 このサンプルでは、構成で指定されたポリシーに基づいてサブジェクトを承認できるカスタムクレーム承認マネージャーを提供します。 カスタム要求承認マネージャーは、3 つの基本的なコンポーネントで構成されます。これは、マネージャーを実装する から 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>要素によって指定されます。 最初のポリシーでは、指定したリソースに対して指定したアクションを実行するには、プリンシパルが指定した要求のいずれかを所有している必要があります。 2 番目のポリシーでは、指定したリソースに対して指定したアクションを実行できるようにするには、プリンシパルが両方の要求を持っている必要があります。 それ以外の場合、プリンシパルには、所有している要求に関係なく、自動的にアクセス権が付与されます。

<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 、クレーム承認マネージャーの基本実装を提供します。 クレーム承認マネージャーは、次の 2 つのシナリオで使用できます。

  • Web ベースのアプリケーションとサービスでは、要求されたリソースを実際に実装するアプリケーション コードが呼び出される前に、要求承認マネージャーを処理パイプラインに追加して、受信要求の値に従ってリソースへのアクセスを承認できる拡張ポイントを提供できます。

  • クラスまたは ClaimsPrincipalPermissionAttribute クラスをClaimsPrincipalPermission使用してコード内で命令型または宣言型の要求ベースのアクセス チェックを実行すると、アプリケーション用に構成されたクレーム承認マネージャーがシステムによって呼び出されてチェックが実行されます。 要求ベースのアクセス チェックは、Web ベースのアプリケーションとデスクトップ アプリケーションの両方で実行できます。

クラスによって提供される既定の ClaimsAuthorizationManager 実装では、提示された要求ごとにアクセスが承認されます。ただし、このクラスから派生し、 メソッドを CheckAccess オーバーライドして独自の承認ロジックを提供できます。

クレーム承認マネージャーの使用は省略可能です。 アプリケーション構成ファイルの identityConfiguration> 要素の子要素<である claimsAuthorizationManager> 要素を<指定することにより、 クラスを使用するか、宣言によって、プログラムで要求承認マネージャーを使用IdentityConfigurationするようにアプリケーションを構成できます。 アプリケーションが Web サイトまたはインターネット インフォメーション サービス (IIS) でホストされている Web アプリケーションの場合は、ASP.NET HTTP モジュール コレクションに を ClaimsAuthorizationModule 追加する必要もあります。

重要

クラスまたは ClaimsPrincipalPermissionAttribute クラスをClaimsPrincipalPermission使用する場合、アクセス チェックの実行に使用されるクレーム承認マネージャーは、 プロパティの下FederatedAuthentication.FederationConfigurationの ID 構成で指定される要求承認マネージャーです。 構成ファイルでは、既定<federationConfiguration><identityConfiguration>要素から参照されるセクションです。 これは、Windows Communication Foundation (WCF) サービスやデスクトップ アプリケーションでも当てはまります。

基底クラスはClaimsAuthorizationManager追加の構成を受け取りません。ただし、 の子要素からクレーム承認マネージャーを初期化できるように、派生クラスの を<claimsAuthorizationElement>オーバーライドLoadCustomConfigurationできます。 一般的なシナリオでは、これらの子要素を使用して、どのリソースにアクセスするために必要な要求の種類と値を決定する承認ポリシーを指定します。 これは難しい要件ではありませんが、実装に適した使用法と構文を自由に定義できます。

コンストラクター

ClaimsAuthorizationManager()

ClaimsAuthorizationManager クラスの新しいインスタンスを初期化します。

メソッド

CheckAccess(AuthorizationContext)

派生クラスで実装された場合、指定されたリソースで指定されたアクションを実行するために、指定されたコンテキストでサブジェクトの承認を確認します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
LoadCustomConfiguration(XmlNodeList)

派生クラスでオーバーライドされると、XML からカスタム構成を読み込みます。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象