Delen via


Procedure: Claimautorisatie implementeren in een claimbewuste ASP.NET toepassing met behulp van WIF en ACS

Bijgewerkt: 19 juni 2015

Van toepassing op: Azure

Van toepassing op

  • Microsoft® Azure™ Access Control Service (ACS)

  • ® Windows Identity Foundation (WIF)

  • ASP.NET

Samenvatting

In dit onderwerp wordt beschreven hoe u cbac-autorisatie (Claims Based Access Control) implementeert in claimbewuste ASP.NET webtoepassingen met behulp van WIF en ACS.

Inhoud

  • Doelen

  • Overzicht

  • Samenvatting van de stappen

  • Stap 1: Een autorisatiebibliotheek voor claims implementeren

  • Stap 2: een ASP.NET-toepassing configureren voor het gebruik van de bibliotheek voor claimautorisatie

  • Stap 3: een autorisatiebeleid configureren

  • Verwante items

Doelen

  • De autorisatielogica van de toepassing extern maken.

  • Implementeer de autorisatiecontroles buiten rollen, wat resulteert in een gedetailleerdere controle over autorisatie.

  • Bieden beleidgestuurd, declaratief, autorisatiebeheer.

Overzicht

Claimautorisatie is gebaseerd op het gebruik van de gegevens die binnen een token worden meegenomen: de claims. Claimautorisatie is handig als het onvoldoende is om de autorisatiebeslissing alleen op basis van rollen te nemen. In financiële toepassingen kan bijvoorbeeld dezelfde rol worden gegeven aan verschillende limieten voor het overdragen van geld tussen accounts op basis van duur en andere kenmerken. Dergelijke kenmerken kunnen in de vorm van een claim samen met de rol komen en daarom een nauwkeuriger afgestemde autorisatiebeslissing toestaan.

Samenvatting van de stappen

  • Stap 1: Een autorisatiebibliotheek voor claims implementeren

  • Stap 2: een ASP.NET-toepassing configureren voor het gebruik van de bibliotheek voor claimautorisatie

  • Stap 3: een autorisatiebeleid configureren

Stap 1: Een autorisatiebibliotheek voor claims implementeren

In deze stap ziet u hoe u een externe klassebibliotheek maakt die een toegangsbeleid leest vanuit een configuratiebestand en de toegangscontroles afdwingt. In het volgende voorbeeld ziet u hoe u een autorisatiebibliotheek voor claims implementeert die een autorisatiebeslissing maakt op basis van een postcodeclaim.

Autorisatiebibliotheek voor claims implementeren

  1. Zorg ervoor dat u Visual Studio ® uitvoert in de beheerdersmodus.

  2. Klik met de rechtermuisknop op de gewenste oplossing in Solution Explorer, voeg een nieuw klassebibliotheekproject toe en geef het vervolgens een naam, bijvoorbeeld MyClaimsAuthorizationManager.

  3. Verwijder de standaardklasse Class1.cs.

  4. Voeg een nieuwe klasse toe en geef deze een naam, bijvoorbeeld ZipClaimsAuthorizationManager. Hiermee wordt een autorisatie geïmplementeerd op basis van postcodes.

  5. Voeg een verwijzing naar het Microsoft.IdentityModel en de System.Web-assembly's toe.

  6. Voeg de volgende declaraties toe.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Breid de klasse ClaimsAuthorizationManager uit, overschrijft de AccessCheck-methode en implementeer vervolgens een constructor in de klasse ZipClaimsAuthorizationManager . Uw code moet er ongeveer als volgt uitzien.

    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. Compileer de oplossing om ervoor te zorgen dat er geen compilatiefouten zijn.

  9. Zoek de gecompileerde bibliotheek in dit geval MyClaimsAuthorizationManager.dll. Deze moet worden neergezet in de bin-map van de ASP.NET-webtoepassing.

Stap 2: een ASP.NET-toepassing configureren voor het gebruik van de bibliotheek voor claimautorisatie

De volgende stappen worden uitgevoerd in uw ASP.NET-webtoepassing. Voeg geen verwijzing toe naar uw Claim Authorization Manager-bibliotheek die u in de vorige stap hebt gemaakt. Uw ASP.NET-webtoepassing moet er niet van op de hoogte zijn, behalve in web.config.

Een ASAP.NET-toepassing configureren voor het gebruik van de bibliotheek voor claimautorisatie

  1. Configureer uw ASP.NET-webtoepassing om WIFs ClaimsAuthorizationModule op te nemen in de pijplijn door de volgende vermelding toe te voegen aan de sectie HttpModules in de web.config (geldig voor de ontwikkelwebserver die wordt geleverd met Visual Studio; voor Internet Information Services (IIS) versie 7, deze configuratie moet zich in de sectie modules onder het node system.webServer bevinden.

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Configureer uw ASP.NET-webtoepassing om de aangepaste autorisatiebibliotheek te gebruiken die u in de vorige stap hebt geïmplementeerd door de volgende vermelding toe te voegen aan het knooppunt microsoft.identityModel.service.

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

Stap 3: een autorisatiebeleid configureren

In dit onderwerp wordt het configuratiebeleid uitgedrukt in het ASP.NET webtoepassing web.config bestand. Het beleid bevat eenvoudige regels waarmee resources worden toegewezen aan het claimtype en de bijbehorende waarde. Het volgende beleid kan bijvoorbeeld worden gelezen en afgedwongen door de aangepaste autorisatiebibliotheek die u in de vorige stappen hebt gemaakt en geconfigureerd. Voeg de volgende vermelding toe aan het knooppunt claimsAuthorizationManager dat u in de vorige stap hebt geconfigureerd.

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

Het bovenstaande beleid vereist dat een binnenkomend token een zip-claim met een waarde van 11111 moet hebben om toegang te krijgen tot de default.aspx-pagina.