次の方法で共有


ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) メソッド

定義

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

public:
 virtual void LoadCustomConfiguration(System::Xml::XmlNodeList ^ nodelist);
public virtual void LoadCustomConfiguration (System.Xml.XmlNodeList nodelist);
abstract member LoadCustomConfiguration : System.Xml.XmlNodeList -> unit
override this.LoadCustomConfiguration : System.Xml.XmlNodeList -> unit
Public Overridable Sub LoadCustomConfiguration (nodelist As XmlNodeList)

パラメーター

nodelist
XmlNodeList

カスタム構成要素。 リスト内の各ノードは XmlElement 型です。

実装

このトピックで ClaimsAuthorizationManager 使用されるコード例は、サンプルから抜粋したものです Claims Based Authorization 。 このサンプルでは、構成で指定されたポリシーに基づいてサブジェクトを承認できるカスタム要求承認マネージャーを提供します。 カスタム要求承認マネージャーは、3 つの基本コンポーネント (マネージャーを実装するクラス ClaimsAuthorizationManagerResourceAction リソースとアクションをペアにするクラス、構成ファイルで指定されたポリシーを読み取ってコンパイルするポリシー リーダー) で構成されます。 このコンパイル済みポリシーは、要求承認マネージャーがリソースへのアクセスを承認するためにプリンシパルを評価するために使用できます。 簡潔にするために、すべての要素が表示されるわけではありません。 WIF で使用できるこのサンプルとその他のサンプルの詳細と、それらをダウンロードする場所については、 WIF コード サンプル インデックスを参照してください。

次のコードは、メソッドのオーバーライドを LoadCustomConfiguration 示しています。 このメソッドは、ヘルパー ポリシー リーダー クラス (図示せず) を使用して、構成ファイルで指定された承認ポリシーの読み取りとコンパイルを行います。 ポリシーはディクショナリに追加され、目的のリソースとアクションから作成されたキー オブジェクトによって ResourceAction アクセスされます。

static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
PolicyReader _policyReader = new PolicyReader();
/// <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;
    }
}

次のコードは、 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;
        }
    }
}

クレーム承認マネージャーで使用されるポリシーは、claimsAuthorizationManager> 要素の下の<カスタム<policy>要素によって指定されます。 このポリシーは、メソッドによって LoadCustomConfiguration 読み取られ、コンパイルされます。 最初のポリシーでは、指定したリソースに対して指定したアクションを実行するには、プリンシパルが指定した要求のいずれかを所有している必要があります。 2 番目のポリシーでは、プリンシパルは、指定したリソースに対して指定されたアクションを実行できるようにするために、両方の要求を保持する必要があります。 それ以外の場合は、プリンシパルが所有する要求に関係なく、プリンシパルに自動的にアクセス権が付与されます。

<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>

注釈

このメソッドは LoadCustomConfiguration 、構成インフラストラクチャによって呼び出されます。 このメソッドが呼び出されると、nodelist構成ファイルの claimsAuthorizationManager> 要素の<最上位の子要素が含まれます。 これらの各要素には、派生クラスに対して定義した構成スキーマに応じて、属性または子要素が含まれる場合があります。 構成ファイル内の要素の下に <claimsAuthorizationManager> 子要素が表示されない場合、このメソッドは呼び出されません。

既定の実装では、次の値がスローされます NotImplementedException。 構成ファイルからの要求承認マネージャーの初期化を有効にするには、派生クラスでこのメソッドをオーバーライドします。 通常、構成要素は承認ポリシーを表すために使用されます。ただし、要素を定義し、アプリケーションの要件に基づいて意味のある方法で使用できます。

適用対象