ClaimsAuthorizationManager Classe

Definizione

Definisce l'implementazione di base per una gestione dell'autorizzazione delle attestazioni.

public ref class ClaimsAuthorizationManager : System::IdentityModel::Configuration::ICustomIdentityConfiguration
public class ClaimsAuthorizationManager : System.IdentityModel.Configuration.ICustomIdentityConfiguration
type ClaimsAuthorizationManager = class
    interface ICustomIdentityConfiguration
Public Class ClaimsAuthorizationManager
Implements ICustomIdentityConfiguration
Ereditarietà
ClaimsAuthorizationManager
Implementazioni

Esempio

Gli esempi di codice usati negli ClaimsAuthorizationManager argomenti sono tratti dall'esempio Claims Based Authorization . Questo esempio fornisce un gestore di autorizzazioni delle attestazioni personalizzato che può autorizzare soggetti in base a un criterio specificato nella configurazione. Il gestore di autorizzazioni delle attestazioni personalizzate è costituito da tre componenti di base: una classe derivata da ClaimsAuthorizationManager che implementa il gestore, la ResourceAction classe che associa una risorsa e un'azione e un lettore di criteri che legge e compila i criteri specificati nel file di configurazione. Questo criterio compilato può quindi essere usato dal gestore delle autorizzazioni delle attestazioni per valutare un'entità per autorizzare l'accesso alle risorse. Non tutti gli elementi vengono visualizzati per brevità. Per informazioni su questo esempio e altri esempi disponibili per WIF e su dove scaricarli, vedere Indice di esempio di codice WIF.

Nel codice seguente viene illustrata l'implementazione di Gestione autorizzazioni attestazioni personalizzate. Il LoadCustomConfiguration metodo legge e compila i criteri dalla configurazione usando la classe helper del lettore di criteri (non visualizzata) e il CheckAccess metodo concede o nega l'accesso in base a questo criterio.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Xml;

namespace ClaimsAuthorizationLibrary
{
    /// <summary>
    /// Simple ClaimsAuthorizationManager implementation that reads policy information from the .config file
    /// </summary>
    public class MyClaimsAuthorizationManager : ClaimsAuthorizationManager
    {
        static Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>> _policies = new Dictionary<ResourceAction, Func<ClaimsPrincipal, bool>>();
        PolicyReader _policyReader = new PolicyReader();

        /// <summary>
        /// Creates a new instance of the MyClaimsAuthorizationManager
        /// </summary>        
        public MyClaimsAuthorizationManager()
        {
        }

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

        /// <summary>
        /// Checks if the principal specified in the authorization context is authorized to perform action specified in the authorization context 
        /// on the specified resoure
        /// </summary>
        /// <param name="pec">Authorization context</param>
        /// <returns>true if authorized, false otherwise</returns>
        public override bool CheckAccess(AuthorizationContext pec)
        {
            //
            // Evaluate the policy against the claims of the 
            // principal to determine access
            //
            bool access = false;
            try
            {
                ResourceAction ra = new ResourceAction(pec.Resource.First<Claim>().Value, pec.Action.First<Claim>().Value);

                access = _policies[ra](pec.Principal);
            }
            catch (Exception)
            {
                access = false;
            }

            return access;
        }
    }
}

Il codice seguente mostra la ResourceAction classe usata dal gestore delle attestazioni personalizzate.

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

Il codice XML seguente illustra come configurare la gestione autorizzazioni delle attestazioni illustrata in precedenza per un'applicazione Web ospitata in IIS 7.5. Vengono visualizzati solo gli elementi specifici della configurazione di Gestione autorizzazioni attestazioni. Si noti che un riferimento alla ClaimsAuthorizationModule classe deve essere aggiunto alla pipeline sotto l'elemento <system.Webserver> . Per i siti e le applicazioni ospitati in versioni di IIS precedenti a IIS 7, è possibile aggiungere i moduli alla pipeline sotto l'elemento <system.Web> . Questa configurazione viene visualizzata ma impostata come commento.

I criteri usati dal gestore di autorizzazione delle attestazioni vengono specificati da elementi personalizzati <policy> nell'elemento <claimsAuthorizationManager> . Nel primo criterio, l'entità deve possedere una delle attestazioni specificate per eseguire l'azione specificata sulla risorsa specificata. Nel secondo criterio, l'entità deve possedere entrambe le attestazioni per poter eseguire l'azione specificata sulla risorsa specificata. In tutti gli altri, all'entità viene concesso automaticamente l'accesso indipendentemente dalle attestazioni che possiede.

<configuration>
  <configSections>
    <!--WIF 4.5 sections -->
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    ...

  </configSections>

  ...

  <system.web>
    <httpModules>
      <!--WIF 4.5 modules -->
      <!--Not needed here for IIS >= 7 -->
      <!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
    </httpModules>
  </system.web>

  ...

  <system.webServer>
    <modules>
      <!--WIF 4.5 modules -->
      <add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </modules>
  </system.webServer>

  ...

  <!-- WIF 4.5 s.im section-->
  <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>
  ...

</configuration><configuration>
  <configSections>
    <!--WIF 4.5 sections -->
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    ...

  </configSections>

  ...

  <system.web>
    <httpModules>
      <!--WIF 4.5 modules -->
      <!--Not needed here for IIS >= 7 -->
      <!--<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>-->
    </httpModules>
  </system.web>

  ...

  <system.webServer>
    <modules>
      <!--WIF 4.5 modules -->
      <add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </modules>
  </system.webServer>

  ...

  <!-- WIF 4.5 s.im section-->
  <system.identityModel>
    <identityConfiguration>
      <claimsAuthorizationManager type="MyClaimsAuthorizationManager.SimpleClaimsAuthorizationManager, MyClaimsAuthorizationManager" />
      ...

  </system.identityModel>
  ...

</configuration>

Commenti

La ClaimsAuthorizationManager classe fornisce l'implementazione di base per un gestore di autorizzazioni delle attestazioni. Un gestore autorizzazioni attestazioni può essere usato nei due scenari seguenti:

  • Nelle applicazioni e nei servizi basati sul Web è possibile aggiungere un gestore autorizzazioni attestazioni alla pipeline di elaborazione per fornire un punto di estendibilità da cui è possibile autorizzare l'accesso a una risorsa in base al valore delle attestazioni in ingresso prima che venga chiamato il codice dell'applicazione che implementa effettivamente la risorsa richiesta.

  • Quando si usa la ClaimsPrincipalPermission classe o la ClaimsPrincipalPermissionAttribute classe per eseguire controlli di accesso imperativi o dichiarativi basati sulle attestazioni nel codice, il gestore delle autorizzazioni delle attestazioni configurato per l'applicazione viene chiamato dal sistema per eseguire il controllo. I controlli di accesso basati sulle attestazioni possono essere eseguiti sia nelle applicazioni basate sul Web che nelle applicazioni desktop.

L'implementazione predefinita fornita dalla ClaimsAuthorizationManager classe autorizza l'accesso per ogni attestazione presentata. Tuttavia, è possibile derivare da questa classe ed eseguire l'override del metodo per fornire la CheckAccess propria logica di autorizzazione.

L'uso di un gestore di autorizzazioni delle attestazioni è facoltativo. È possibile configurare l'applicazione in modo che usi una gestione autorizzazioni attestazioni a livello di codice usando la IdentityConfiguration classe o in modo dichiarativo, specificando l'elemento <claimsAuthorizationManager> , che è un elemento figlio dell'elemento <identityConfiguration> nel file di configurazione dell'applicazione. Se l'applicazione è un sito Web o un'applicazione Web ospitata in Internet Information Services (IIS), è necessario aggiungere anche nella ClaimsAuthorizationModule raccolta ASP.NET MODULI HTTP.

Importante

Quando si usa la ClaimsPrincipalPermission classe o la ClaimsPrincipalPermissionAttribute classe , il gestore delle autorizzazioni delle attestazioni usato per eseguire il controllo di accesso è quello specificato nella configurazione dell'identità nella FederatedAuthentication.FederationConfiguration proprietà . In un file di configurazione si tratta della <identityConfiguration> sezione a cui fa riferimento l'elemento predefinito <federationConfiguration> . Questo vale anche per i servizi Windows Communication Foundation (WCF) e le applicazioni desktop.

La ClaimsAuthorizationManager classe base non accetta alcuna configurazione aggiuntiva. Tuttavia, è possibile eseguire l'override di LoadCustomConfiguration nelle classi derivate per fornire l'inizializzazione del gestore autorizzazioni delle attestazioni dagli elementi figlio di <claimsAuthorizationElement>. Lo scenario tipico consiste nell'usare questi elementi figlio per specificare i criteri di autorizzazione che determinano quali tipi di attestazione e valori sono necessari per ottenere l'accesso alla risorsa. Questo non è un requisito rigido, anche se è possibile definire qualsiasi utilizzo e sintassi abbia senso per l'implementazione.

Costruttori

ClaimsAuthorizationManager()

Inizializza una nuova istanza della classe ClaimsAuthorizationManager.

Metodi

CheckAccess(AuthorizationContext)

Una volta eseguita l'implementazione in una classe derivata, controlla l'autorizzazione per il soggetto nel contesto specificato per eseguire l'azione specificata nella risorsa specificata.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
LoadCustomConfiguration(XmlNodeList)

Quando sottoposto a override in una classe derivata, carica la configurazione personalizzata dall'XML.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a