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 который связывает ресурс и действие, а также средство чтения политики, которое считывает и компилирует политику, указанную в файле конфигурации. Затем эту скомпилированную политику можно использовать диспетчером авторизации утверждений для оценки участника для авторизации доступа к ресурсам. Не все элементы отображаются ради краткости. Сведения об этом образце и других примерах, доступных для 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;
        }
    }
}

Политика, используемая диспетчером авторизации утверждений, задается пользовательскими <policy> элементами в элементе <claimsAuthorizationManager> . Эта политика считывается и компилируется методом 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> в файле конфигурации, этот метод не вызывается.

Реализация по умолчанию создает исключение NotImplementedException. Переопределите этот метод в производном классе, чтобы включить инициализацию диспетчера авторизации утверждений из файла конфигурации. Как правило, элементы конфигурации используются для выражения политики авторизации; однако вы можете определить элементы и использовать их любым способом, который имеет смысл в зависимости от требований приложения.

Применяется к