ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) Metod

Definition

När du åsidosättas i en härledd klass läser du in anpassad konfiguration från 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)

Parametrar

nodelist
XmlNodeList

De anpassade konfigurationselementen. Varje nod i listan är av typen XmlElement.

Implementeringar

Exempel

Kodexemplen som används i ämnena ClaimsAuthorizationManager tas från Claims Based Authorization exemplet. Det här exemplet innehåller en ansvarig för anpassad anspråksauktorisering som kan auktorisera ämnen baserat på en princip som anges i konfigurationen. Hanteraren för anpassade anspråksauktorisering består av tre grundläggande komponenter: en klass som härleds från ClaimsAuthorizationManager som implementerar chefen, ResourceAction klassen som parar ihop en resurs och en åtgärd samt en principläsare som läser och kompilerar en princip som anges i konfigurationsfilen. Den här kompilerade principen kan sedan användas av anspråksauktoriseringshanteraren för att utvärdera ett huvudnamn för att auktorisera åtkomst till resurser. Alla element visas inte för korthetens skull. Information om det här exemplet och andra exempel som är tillgängliga för WIF och var du kan ladda ned dem finns i WIF Code Sample Index.

Följande kod visar åsidosättningen av LoadCustomConfiguration metoden. Den här metoden använder en hjälpprincipläsarklass (visas inte) för att läsa och kompilera auktoriseringsprinciper som anges i konfigurationsfilen. Principer läggs till i en ordlista och används av ett ResourceAction nyckelobjekt som skapas från resursen och åtgärden som de är avsedda för.

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

Följande kod visar klassen ResourceAction som används av den anpassade anspråkshanteraren.

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

Principen som används av anspråksauktoriseringshanteraren anges av anpassade <policy> element under elementet< claimsAuthorizationManager>. Den här principen läs- och kompileras av LoadCustomConfiguration metoden. I den första principen måste huvudkontot ha ett av de angivna anspråken för att kunna utföra den angivna åtgärden på den angivna resursen. I den andra principen måste huvudkontot ha båda anspråken för att kunna utföra den angivna åtgärden på den angivna resursen. I alla andra beviljas huvudmannen automatiskt åtkomst oavsett vilka anspråk det har.

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

Kommentarer

Metoden LoadCustomConfiguration anropas av konfigurationsinfrastrukturen. När den här metoden anropas nodelist innehåller den underordnade element på den översta nivån i elementet <claimsAuthorizationManager> från konfigurationsfilen. Vart och ett av dessa element kan i sin tur innehålla attribut eller underordnade element beroende på det konfigurationsschema som du definierar för din härledda klass. Om inga underordnade element visas under elementet <claimsAuthorizationManager> i konfigurationsfilen anropas inte den här metoden.

Standardimplementeringen genererar en NotImplementedException. Åsidosätt den här metoden i din härledda klass för att aktivera initiering av hanteraren för anspråksauktorisering från en konfigurationsfil. Vanligtvis används konfigurationselementen för att uttrycka en auktoriseringsprincip. Du kan dock definiera element och använda dem på alla sätt som är meningsfulla baserat på kraven i ditt program.

Gäller för