Procedura: Implementare l'autorizzazione delle attestazioni in un'applicazione ASP.NET con riconoscimento delle attestazioni tramite WIF e ACS

Aggiornamento: 19 giugno 2015

Si applica a: Azure

Si applica a

  • Servizio di controllo di accesso di Microsoft® Azure™ (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

Riepilogo

Questo argomento descrive come implementare l'autorizzazione basata su attestazioni Controllo di accesso (CBAC) nelle applicazioni Web che supportano attestazioni ASP.NET tramite WIF e ACS.

Contenuto

  • Obiettivi

  • Panoramica

  • Riepilogo dei passaggi

  • Passaggio 1 - Implementare una libreria di autorizzazioni basate su attestazioni

  • Passaggio 2 - Configurare un'applicazione ASP.NET per l'uso della libreria di autorizzazioni basate su attestazioni

  • Passaggio 3 - Configurare un criterio di autorizzazione

  • Elementi correlati

Obiettivi

  • Esternalizzare la logica dell'autorizzazione dall'applicazione

  • Implementare i controlli di autorizzazione all'esterno dei ruoli, in modo da acquisire un controllo più dettagliato dell'autorizzazione.

  • Predisporre una gestione dell'autorizzazione dichiarativa, basata su criteri.

Panoramica

L'autorizzazione basata su attestazioni presuppone l'uso delle informazioni contenute in un token, ossia le attestazioni. Questo tipo di autorizzazione risulta particolarmente utile nel caso in cui non si ritenga sufficiente una decisione di autorizzazione basata solo sui ruoli. Nelle applicazioni finanziarie, ad esempio, uno stesso ruolo può essere assegnato a più limiti per il trasferimento di denaro tra conti diversi, in base alla permanenza in servizio e ad altri attributi. Quando questi attributi si presentano nel ruolo sotto forma di attestazione, consentono una decisione di autorizzazione più circostanziata.

Riepilogo dei passaggi

  • Passaggio 1 - Implementare una libreria di autorizzazioni basate su attestazioni

  • Passaggio 2 - Configurare un'applicazione ASP.NET per l'uso della libreria di autorizzazioni basate su attestazioni

  • Passaggio 3 - Configurare un criterio di autorizzazione

Passaggio 1 - Implementare una libreria di autorizzazioni basate su attestazioni

Questo passaggio consente di creare una libreria di classi esterna in grado di leggere criteri di accesso da un file di configurazione e applicare controlli di accesso. Il seguente esempio illustra come implementare una libreria di autorizzazioni basate su attestazioni che consenta di incentrare una decisione di autorizzazione su un'attestazione di codice postale.

Per implementare una libreria di autorizzazioni basate su attestazioni

  1. Accertarsi di aver avviato Visual Studio® in modalità di amministratore.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione desiderata, aggiungere un nuovo progetto Libreria di classi e assegnare un nome a tale progetto, ad esempio MyClaimsAuthorizationManager.

  3. Eliminare la classe predefinita: Class1.cs.

  4. Aggiungere una nuova classe e assegnarle un nome, ad esempio ZipClaimsAuthorizationManager. Verrà implementata un'autorizzazione basata sui codici postali.

  5. Aggiungere un riferimento agli assembly Microsoft.IdentityModel e System.Web.

  6. Aggiungere le seguenti dichiarazioni.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Estendere la classe ClaimsAuthorizationManager ignorando il relativo metodo AccessCheck e implementando quindi un costruttore nella classe ZipClaimsAuthorizationManager. Il codice risultante dovrebbe essere simile al seguente.

    namespace MyClaimsAuthorizationManager 
    { 
        class ZipClaimsAuthorizationManager : ClaimsAuthorizationManager 
        { 
            private static Dictionary<string, int> m_policies = new Dictionary<string, int>(); 
    
            public ZipClaimsAuthorizationManager(object config) 
            { 
                XmlNodeList nodes = config as XmlNodeList; 
                foreach (XmlNode node in nodes) 
                { 
                    { 
                        //FIND ZIP CLAIM IN THE POLICY IN WEB.CONFIG AND GET ITS VALUE 
                        //ADD THE VALUE TO MODULE SCOPE m_policies 
                        XmlTextReader reader = new XmlTextReader(new StringReader(node.OuterXml)); 
                        reader.MoveToContent(); 
                        string resource = reader.GetAttribute("resource"); 
                        reader.Read(); 
                        string claimType = reader.GetAttribute("claimType"); 
                        if (claimType.CompareTo(ClaimTypes.PostalCode) == 0) 
                        { 
                            throw new ArgumentNullException("Zip Authorization is not specified in policy in web.config"); 
                        } 
                        int zip = -1; 
                        bool success = int.TryParse(reader.GetAttribute("Zip"),out zip); 
                        if (!success) 
                        { 
                            throw new ArgumentException("Specified Zip code is invalid - check your web.config"); 
                        } 
                        m_policies[resource] = zip; 
                    } 
                } 
            } 
            public override bool CheckAccess(AuthorizationContext context) 
            { 
                //GET THE IDENTITY 
                //FIND THE POSTALCODE CLAIM'S VALUE IN IT 
                //COMPARE WITH THE POLICY 
                int allowedZip = -1; 
                int requestedZip = -1; 
                Uri webPage = new Uri(context.Resource.First().Value); 
                IClaimsPrincipal principal = (IClaimsPrincipal)HttpContext.Current.User; 
                if (principal == null) 
                { 
                    throw new InvalidOperationException("Principal is not populate in the context - check configuration"); 
                } 
                IClaimsIdentity identity = (IClaimsIdentity)principal.Identity; 
                if (m_policies.ContainsKey(webPage.PathAndQuery)) 
                { 
                    allowedZip = m_policies[webPage.PathAndQuery]; 
                    requestedZip = -1; 
                    int.TryParse((from c in identity.Claims 
                                            where c.ClaimType == ClaimTypes.PostalCode 
                                            select c.Value).FirstOrDefault(), out requestedZip); 
                } 
                if (requestedZip!=allowedZip) 
                { 
                    return false; 
                } 
                return true; 
            } 
        } 
    }
    
  8. Compilare la soluzione per verificare che non siano presenti errori di compilazione.

  9. Individuare la libreria compilata, che in questo caso sarà MyClaimsAuthorizationManager.dll. La libreria dovrà essere spostata nella cartella bin dell'applicazione Web ASP.NET.

Passaggio 2 - Configurare un'applicazione ASP.NET per l'uso della libreria di autorizzazioni basate su attestazioni

I seguenti passaggi dovranno essere eseguiti nell'applicazione Web ASP.NET in uso. Non aggiungere alcun riferimento alla libreria Claims Authorization Manager creata nel passaggio precedente. L'applicazione Web ASP.NET dovrebbe non essere in grado di riconoscerla, se non in web.config.

Per configurare un'applicazione ASP.NET per l'uso della libreria di autorizzazioni basate su attestazioni

  1. Configurare l'applicazione Web ASP.NET in modo da includere ClaimsAuthorizationModule di WIF nella relativa pipeline aggiungendo la seguente voce alla sezione HttpModules di web.config (valido per il server Web di sviluppo fornito con Visual Studio; per Internet Information Services (IIS) versione 7, questa configurazione dovrebbe essere posizionata nella sezione dei moduli all'interno del nodo system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configurare l'applicazione Web ASP.NET in modo da usare la libreria di autorizzazioni basate su attestazioni implementata nel passaggio precedente aggiungendo la seguente voce al nodo microsoft.identityModel.service.

    <claimsAuthorizationManager type="MyClaimsAuthorizationManager.ZipClaimsAuthorizationManager, MyClaimsAuthorizationManager" >
    

Passaggio 3 - Configurare un criterio di autorizzazione

In questo argomento il criterio di configurazione viene espresso nel file web.config dell'applicazione Web ASP.NET. Il criterio contiene regole semplici per il mapping delle risorse al tipo di attestazione e al relativo valore. Di seguito è riportato un criterio di esempio che può essere letto e applicato dalla libreria di autorizzazioni creata e configurata nei passaggi precedenti. Aggiungere la seguente voce al nodo claimsAuthorizationManager configurato nel passaggio precedente.

<policy resource="/default.aspx">
  <claim claimType=https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode
  Zip="11111" />
</policy>

Il criterio sopra riportato richiede che il token in ingresso contenga un'attestazione di codice postale impostata sul valore 11111 per poter accedere alla pagina default.aspx.