Guide pratique pour implémenter l’autorisation des revendications dans une application prenant en compte les revendications ASP.NET à l’aide de WIF et d’ACS

Mise à jour : 19 juin 2015

S’applique à : Azure

S'applique à

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

Résumé

Cette rubrique explique comment implémenter l’autorisation CBAC (Claims Based Access Control) dans les applications web prenant en charge les revendications ASP.NET à l’aide de WIF et d’ACS.

Contenu

  • Objectifs

  • Vue d’ensemble

  • Résumé des étapes

  • Étape 1 – Implémenter une bibliothèque d'autorisations par revendications

  • Étape 2 – Configurer une application ASP.NET pour utiliser la bibliothèque d'autorisations par revendications

  • Étape 3 – Configurer une stratégie d'autorisation

  • Éléments associés

Objectifs

  • Externaliser la logique d'autorisation de l'application.

  • Implémenter les contrôles d'autorisation au-delà des rôles pour mieux contrôler l'autorisation.

  • Bénéficier d'une gestion de l'autorisation déclarative et pilotée par une stratégie.

Vue d’ensemble

L'autorisation par revendication est basée sur l'utilisation des informations contenues dans un jeton : les revendications. Elle est utile quand baser la décision d'autorisation uniquement sur les rôles ne suffit pas. Par exemple, dans des applications financières, le même rôle peut être accordé à différentes limites pour le transfert d'argent entre des comptes en fonction des titulaires et d'autres attributs. Ces attributs peuvent se présenter sous la forme d'une revendication associée au rôle et permettent donc d'affiner la décision d'autorisation.

Résumé des étapes

  • Étape 1 – Implémenter une bibliothèque d'autorisations par revendications

  • Étape 2 – Configurer une application ASP.NET pour utiliser la bibliothèque d'autorisations par revendications

  • Étape 3 – Configurer une stratégie d'autorisation

Étape 1 – Implémenter une bibliothèque d'autorisations par revendications

Cette étape montre comment créer une bibliothèque de classes externe qui lit une stratégie d'accès à partir d'un fichier de configuration et applique les contrôles d'accès. L'exemple suivant illustre comment implémenter une bibliothèque d'autorisations par revendications qui prend une décision d'autorisation sur la base d'une revendication de code postal.

Pour implémenter une bibliothèque d'autorisations par revendications

  1. Vérifiez que vous exécutez Visual Studio® en mode Administrateur.

  2. Cliquez avec le bouton droit sur la solution souhaitée dans l'Explorateur de solutions, ajoutez un nouveau projet Bibliothèque de classes, puis donnez-lui un nom, par exemple MyClaimsAuthorizationManager.

  3. Supprimez la classe par défaut, Class1.cs.

  4. Ajoutez une nouvelle classe et donnez-lui un nom, par exemple ZipClaimsAuthorizationManager. Cela implémentera une autorisation basée sur des codes postaux.

  5. Ajoutez une référence à Microsoft.IdentityModel et aux assemblys System.Web.

  6. Ajoutez les déclarations suivantes.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Développez la classe ClaimsAuthorizationManager, en substituant sa méthode AccessCheck, puis en implémentant un constructeur pour votre classe ZipClaimsAuthorizationManager. Votre code doit ressembler à ce qui suit.

    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. Compilez la solution pour vous assurer qu'il n'y a aucune erreur de compilation.

  9. Recherchez la bibliothèque compilée, dans notre exemple MyClaimsAuthorizationManager.dll. Elle devra être déposée dans le dossier bin de l'application web ASP.NET.

Étape 2 – Configurer une application ASP.NET pour utiliser la bibliothèque d'autorisations par revendications

Les étapes suivantes sont effectuées dans votre application web ASP.NET. N'ajoutez pas de référence à la bibliothèque de gestionnaire d'autorisations par revendications que vous avez créée lors de l'étape précédente. Votre application web ASP.NET ne doit pas « avoir conscience » de son existence, hormis dans web.config.

Pour configurer une application ASP.NET en vue d'utiliser la bibliothèque d'autorisations par revendications

  1. Configurez votre application web ASP.NET pour inclure ClaimsAuthorizationModule dans son pipeline en ajoutant l'entrée suivante dans la section HttpModules du fichier web.config (valide pour le serveur web de développement fourni avec Visual Studio ; pour Internet Information Services (IIS) version 7, cette configuration doit figurer dans la section des modules sous le nœud system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configurez votre application web ASP.NET pour utiliser la bibliothèque d'autorisations personnalisée que vous avez implémentée à l'étape précédente en ajoutant l'entrée suivante dans le nœud microsoft.identityModel.service.

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

Étape 3 – Configurer une stratégie d'autorisation

Dans cette rubrique, la stratégie de configuration est exprimée dans le fichier web.config d'application web ASP.NET. La stratégie spécifie des règles simples qui mappent des ressources au type de revendication et à sa valeur. Par exemple, la stratégie suivante peut être lue et appliquée par la bibliothèque d'autorisations personnalisée que vous avez créée et configurée lors des étapes précédentes. Ajoutez l'entrée suivante au nœud claimsAuthorizationManager que vous avez configuré à l'étape précédente.

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

La stratégie ci-dessus exige qu'un jeton entrant ait une revendication de code postal avec une valeur égale à 11111 pour pouvoir accéder à la page default.aspx.