Dela via


Anvisningar: Implementera anspråksauktorisering i ett anspråksmedveten ASP.NET-program med WIF och ACS

Uppdaterad: 19 juni 2015

Gäller för: Azure

Gäller för

  • Microsoft® Azure™ Access Control Service (ACS)

  • ® Windows Identity Foundation (WIF)

  • ASP.NET

Sammanfattning

Det här avsnittet beskriver hur du implementerar CBAC-auktorisering (Claims Based Access Control) i anspråksmedvetna ASP.NET webbprogram med WIF och ACS.

Innehåll

  • Mål

  • Översikt

  • Sammanfattning av steg

  • Steg 1 – Implementera ett bibliotek för anspråksauktorisering

  • Steg 2 – Konfigurera ett ASP.NET program för att använda biblioteket för anspråksauktorisering

  • Steg 3 – Konfigurera en auktoriseringsprincip

  • Relaterade objekt

Mål

  • Externalisera auktoriseringslogik från programmet.

  • Implementera auktoriseringskontroller utöver roller, vilket resulterar i en mer detaljerad kontroll över auktorisering.

  • Ange principdriven, deklarativ, auktoriseringshantering.

Översikt

Anspråksauktorisering baseras på användning av den information som finns i en token – anspråken. Anspråksauktorisering är användbart när det inte är tillräckligt att fatta auktoriseringsbeslutet baserat enbart på roller. I finansiella program kan till exempel samma roll ges till olika gränser för överföring av pengar mellan konton baserat på besittningsrätt och andra attribut. Sådana attribut kan komma i form av ett anspråk tillsammans med rollen och därmed möjliggöra ett mer finjusterat auktoriseringsbeslut.

Sammanfattning av steg

  • Steg 1 – Implementera ett bibliotek för anspråksauktorisering

  • Steg 2 – Konfigurera ett ASP.NET program för att använda biblioteket för anspråksauktorisering

  • Steg 3 – Konfigurera en auktoriseringsprincip

Steg 1 – Implementera ett bibliotek för anspråksauktorisering

Det här steget visar hur du skapar ett externt klassbibliotek som läser en åtkomstprincip från en konfigurationsfil och framtvingar åtkomstkontrollerna. Följande exempel visar hur du implementerar ett bibliotek för anspråksauktorisering som fattar ett auktoriseringsbeslut baserat på ett postnummeranspråk.

Så här implementerar du biblioteket för anspråksauktorisering

  1. Kontrollera att du kör Visual Studio ® i administratörsläge.

  2. Högerklicka på önskad lösning i Solution Explorer, lägg till ett nytt klassbiblioteksprojekt och ge det sedan ett namn, till exempel MyClaimsAuthorizationManager.

  3. Ta bort standardklassen Class1.cs.

  4. Lägg till en ny klass och ge den ett namn, till exempel ZipClaimsAuthorizationManager. Detta implementerar ett auktorisering baserat på postnummer.

  5. Lägg till en referens till Microsoft.IdentityModel och system.Web-sammansättningarna .

  6. Lägg till följande deklarationer.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Utöka klassen ClaimsAuthorizationManager , åsidosätt dess AccessCheck-metod och implementera sedan en konstruktor till klassen ZipClaimsAuthorizationManager . Koden bör se ut ungefär så här.

    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. Kompilera lösningen för att kontrollera att det inte finns några kompileringsfel.

  9. Leta upp det kompilerade biblioteket, i det här fallet MyClaimsAuthorizationManager.dll. Den måste tas bort i mappen bin för ASP.NET-webbappen.

Steg 2 – Konfigurera ett ASP.NET program för att använda biblioteket för anspråksauktorisering

Nästa steg utförs i din ASP.NET webbapp. Lägg inte till en referens till ditt Claims Authorization Manager-bibliotek som du skapade i föregående steg. Din ASP.NET webbapp bör vara "omedveten" om den, förutom i web.config.

Så här konfigurerar du ett ASAP.NET program för att använda biblioteket för anspråksauktorisering

  1. Konfigurera din ASP.NET webbapp så att den inkluderar WIFs ClaimsAuthorizationModule i pipelinen genom att lägga till följande post i avsnittet HttpModules i web.config (giltig för utvecklingswebbservern som levereras med Visual Studio. För Internet Information Services (IIS) version 7 bör den här konfigurationen finnas i modulavsnittet under noden system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Konfigurera din ASP.NET webbapp så att den använder det anpassade auktoriseringsbiblioteket som du implementerade i föregående steg genom att lägga till följande post i noden microsoft.identityModel.service.

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

Steg 3 – Konfigurera en auktoriseringsprincip

I det här avsnittet uttrycks konfigurationsprincipen i ASP.NET webbappens web.config fil. Principen innehåller enkla regler som mappar resurser till anspråkstypen och dess värde. Följande princip kan till exempel läsas och framtvingas av det anpassade auktoriseringsbiblioteket som du skapade och konfigurerade i föregående steg. Lägg till följande post i noden claimsAuthorizationManager som du konfigurerade i föregående steg.

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

Principen ovan kräver att en inkommande token måste ha ett zip-anspråk med värdet 11111 för att få åtkomst till sidan default.aspx.