Compartir a través de


ClaimsAuthorizationManager.LoadCustomConfiguration(XmlNodeList) Método

Definición

Cuando se reemplaza en una clase derivada, carga la configuración personalizada de 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)

Parámetros

nodelist
XmlNodeList

Elementos de configuración personalizados. Todos los nodos de la lista son de tipo XmlElement.

Implementaciones

Ejemplos

Los ejemplos de código que se usan en los ClaimsAuthorizationManager temas se toman del Claims Based Authorization ejemplo. En este ejemplo se proporciona un administrador de autorización de notificaciones personalizado que puede autorizar sujetos en función de una directiva especificada en la configuración. El administrador de autorización de notificaciones personalizado consta de tres componentes básicos: una clase derivada de ClaimsAuthorizationManager que implementa el administrador, la ResourceAction clase que empareja un recurso y una acción, y un lector de directivas que lee y compila la directiva especificada en el archivo de configuración. A continuación, el administrador de autorización de notificaciones puede usar esta directiva compilada para evaluar una entidad de seguridad con el fin de autorizar el acceso a los recursos. No todos los elementos se muestran por motivos de brevedad. Para obtener información sobre este ejemplo y otros ejemplos disponibles para WIF y sobre dónde descargarlos, consulte Índice de ejemplo de código de WIF.

En el código siguiente se muestra la invalidación del LoadCustomConfiguration método . Este método usa una clase de lector de directivas auxiliares (no se muestra) para leer y compilar directivas de autorización especificadas en el archivo de configuración. Las directivas se agregan a un diccionario y se accede a ellas mediante un ResourceAction objeto de clave que se crea a partir del recurso y la acción para la que están pensadas.

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

En el código siguiente se muestra la ResourceAction clase usada por el administrador de notificaciones personalizado.


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

La directiva utilizada por el administrador de autorización de notificaciones se especifica mediante elementos personalizados <policy> en el <elemento claimsAuthorizationManager> . El método lee y compila LoadCustomConfiguration esta directiva. En la primera directiva, la entidad de seguridad debe poseer una de las notificaciones especificadas para realizar la acción especificada en el recurso especificado. En la segunda directiva, la entidad de seguridad debe poseer ambas notificaciones para poder realizar la acción especificada en el recurso especificado. En todos los demás, a la entidad de seguridad se le concede acceso automáticamente independientemente de las reclamaciones que posee.

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

Comentarios

La LoadCustomConfiguration infraestructura de configuración llama al método . Cuando se llama a este método, nodelist contendrá los elementos secundarios de nivel superior del <elemento claimsAuthorizationManager> del archivo de configuración. Cada uno de estos elementos puede, a su vez, contener atributos o elementos secundarios en función del esquema de configuración que defina para la clase derivada. Si no aparecen elementos secundarios bajo el <claimsAuthorizationManager> elemento del archivo de configuración, no se llama a este método.

La implementación predeterminada produce una NotImplementedExceptionexcepción . Invalide este método en la clase derivada para habilitar la inicialización del administrador de autorización de notificaciones desde un archivo de configuración. Normalmente, los elementos de configuración se usan para expresar una directiva de autorización; Sin embargo, puede definir elementos y usarlos de cualquier manera que tenga sentido en función de los requisitos de la aplicación.

Se aplica a