Exporter (0) Imprimer
Développer tout
Développer Réduire

Procédure : Implémenter une autorisation par revendications dans une application ASP.NET prenant en charge les revendications avec WIF et ACS

Publication: avril 2011

Mis à jour: mars 2015

S'applique à: Azure

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

Cette rubrique explique comment implémenter l'autorisation de contrôle d'accès basé sur les revendications (CBAC, Claims Based Access Control) dans des applications web ASP.NET prenant en charge les revendications à l'aide de WIF et d'ACS.

  • 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

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

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.

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

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.

  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.

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.

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

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=http://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.

Ajouts de la communauté

AJOUTER
Afficher:
© 2015 Microsoft