Freigeben über


ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) Methode

Definition

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird die benutzerdefinierte Konfiguration aus XML geladen.

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)

Parameter

nodelist
XmlNodeList

Die benutzerdefinierten Konfigurationselemente. Jeder Knoten in der Liste ist vom Typ XmlElement.

Implementiert

Beispiele

Die Codebeispiele, die in den ClaimsAuthorizationManager Themen verwendet werden, stammen aus dem Claims Based Authorization Beispiel. Dieses Beispiel enthält einen benutzerdefinierten Anspruchsautorisierungs-Manager, der Subjekte basierend auf einer in der Konfiguration angegebenen Richtlinie autorisieren kann. Der benutzerdefinierte Anspruchsautorisierungs-Manager besteht aus drei grundlegenden Komponenten: einer Klasse, die vom ClaimsAuthorizationManager Manager abgeleitet wird, der Klasse, die ResourceAction eine Ressource und eine Aktion koppelt, und einen Richtlinienleser, der richtlinienleset und kompiliert, die in der Konfigurationsdatei angegeben ist. Diese kompilierte Richtlinie kann dann vom Anspruchsautorisierungs-Manager verwendet werden, um einen Prinzipal auszuwerten, um den Zugriff auf Ressourcen zu autorisieren. Nicht alle Elemente werden aus Platzgründen angezeigt.

Der folgende Code zeigt die Außerkraftsetzung der LoadCustomConfiguration Methode. Diese Methode verwendet eine Hilfsrichtlinienleserklasse (nicht angezeigt), um Autorisierungsrichtlinien zu lesen und zu kompilieren, die in der Konfigurationsdatei angegeben sind. Richtlinien werden einem Wörterbuch hinzugefügt und von einem ResourceAction Schlüsselobjekt aufgerufen, das aus der Ressource und aktion erstellt wird, für die sie vorgesehen sind.

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

Der folgende Code zeigt die ResourceAction Klasse, die vom benutzerdefinierten Anspruchs-Manager verwendet wird.

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

Die vom Anspruchsautorisierungs-Manager verwendete Richtlinie wird durch benutzerdefinierte <policy> Elemente unter dem <ClaimsAuthorizationManager-Element> angegeben. Diese Richtlinie wird von der LoadCustomConfiguration Methode gelesen und kompiliert. In der ersten Richtlinie muss der Prinzipal über einen der angegebenen Ansprüche verfügen, um die angegebene Aktion für die angegebene Ressource auszuführen. In der zweiten Richtlinie muss der Prinzipal über beide Ansprüche verfügen, um die angegebene Aktion für die angegebene Ressource ausführen zu können. In allen anderen Wird dem Prinzipal automatisch Zugriff gewährt, unabhängig von den ansprüchen, die er besitzt.

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

Hinweise

Die LoadCustomConfiguration Methode wird von der Konfigurationsinfrastruktur aufgerufen. Wenn diese Methode aufgerufen wird, enthält sie nodelist die untergeordneten Elemente der obersten Ebene des <claimsAuthorizationManager-Elements> aus der Konfigurationsdatei. Jedes dieser Elemente kann wiederum Attribute oder untergeordnete Elemente enthalten, je nach dem Konfigurationsschema, das Sie für ihre abgeleitete Klasse definieren. Wenn unter dem <claimsAuthorizationManager> Element in der Konfigurationsdatei keine untergeordneten Elemente angezeigt werden, wird diese Methode nicht aufgerufen.

Die Standardimplementierung löst ein NotImplementedException. Überschreiben Sie diese Methode in der abgeleiteten Klasse, um die Initialisierung Ihres Anspruchsautorisierungs-Managers aus einer Konfigurationsdatei zu ermöglichen. In der Regel werden die Konfigurationselemente verwendet, um eine Autorisierungsrichtlinie auszudrücken; Sie können jedoch Elemente definieren und auf jede Weise verwenden, die auf der Grundlage der Anforderungen Ihrer Anwendung sinnvoll ist.

Gilt für: