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 가져옵니다. 이 샘플에서는 구성에 지정된 정책에 따라 주체에 권한을 부여할 수 있는 사용자 지정 클레임 권한 부여 관리자를 제공합니다. 사용자 지정 클레임 권한 부여 관리자는 관리자를 구현하는 클래스, 리소스와 작업을 페어링하는 클래스 ClaimsAuthorizationManager , ResourceAction 구성 파일에 지정된 정책을 읽고 컴파일하는 정책 판독기의 세 가지 기본 구성 요소로 구성됩니다. 그런 다음 클레임 권한 부여 관리자가 리소스에 대한 액세스 권한을 부여하기 위해 보안 주체를 평가하는 데 이 컴파일된 정책을 사용할 수 있습니다. 모든 요소가 간결함을 위해 표시되는 것은 아닙니다.

다음 코드는 메서드의 재정의를 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;
        }
    }
}

클레임 권한 부여 관리자에서 사용하는 정책은 > 사용자 지정 요소에 의해 지정됩니다. 이 정책은 메서드에 의해 읽고 컴파일됩니다 LoadCustomConfiguration . 첫 번째 정책에서 보안 주체는 지정된 리소스에 대해 지정된 작업을 수행하려면 지정된 클레임 중 하나를 소유해야 합니다. 두 번째 정책에서 보안 주체는 지정된 리소스에 대해 지정된 작업을 수행할 수 있도록 두 클레임을 모두 소유해야 합니다. 다른 모든 항목에서는 보안 주체가 소유한 클레임에 관계없이 자동으로 액세스 권한이 부여됩니다.

<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> 요소 아래에 자식 요소가 나타나지 않으면 이 메서드가 호출되지 않습니다.

기본 구현은 .를 NotImplementedExceptionthrow합니다. 구성 파일에서 클레임 권한 부여 관리자를 초기화할 수 있도록 파생 클래스에서 이 메서드를 재정의합니다. 일반적으로 구성 요소는 권한 부여 정책을 표현하는 데 사용됩니다. 그러나 애플리케이션의 요구 사항에 따라 어떤 방식으로든 요소를 정의하고 사용할 수 있습니다.

적용 대상