Freigeben über


Vorgehensweise: Implementieren der Anspruchsberechtigung in einer anspruchsbasierten ASP.NET Anwendung mit WIF und ACS

Aktualisiert: 19. Juni 2015

Gilt für: Azure

Gilt für

  • Microsoft® Azure™ Access Control Service (ACS)

  • Windows® Identity Foundation (WIF)

  • ASP.NET

Zusammenfassung

In diesem Thema wird beschrieben, wie Sie die Anspruchsbasierte Access Control (CBAC)-Autorisierung in anspruchsbasierten ASP.NET Webanwendungen mithilfe von WIF und ACS implementieren.

Inhalte

  • Ziele

  • Übersicht

  • Zusammenfassung von Schritten

  • Schritt 1 – Implementieren einer Anspruchsautorisierungsbibliothek

  • Schritt 2 – Konfigurieren einer ASP.NET-Anwendung für die Verwendung der Anspruchsautorisierungsbibliothek

  • Schritt 3 – Konfigurieren einer Autorisierungsrichtlinie

  • Verwandte Elemente

Ziele

  • Trennen der Autorisierungsprogrammlogik von der Anwendung.

  • Implementieren der Autorisierungsüberprüfungen über Rollen hinaus, um eine genauere Steuerung der Autorisierung zu erzielen.

  • Bereitstellen einer richtliniengesteuerten, deklarativen Autorisierungsverwaltung.

Übersicht

Die Anspruchsautorisierung basiert auf der Verwendung der Informationen, die in einem Token übermittelt werden – den Ansprüchen. Anspruchsautorisierung ist dann sinnvoll, wenn es nicht ausreicht, Autorisierungsentscheidungen nur auf Rollen basierend zu treffen. In Finanzanwendungen kann die gleiche Rolle z. B. an verschiedene Grenzwerte für den Transfer von Beträgen zwischen Konten basierend auf der Anstellungsdauer und anderen Attributen vergeben werden. Solche Attribute liegen ggf. in der Form eines Anspruchs zusammen mit der Rolle vor und ermöglichen daher eine genauere Autorisierungsentscheidung.

Zusammenfassung von Schritten

  • Schritt 1 – Implementieren einer Anspruchsautorisierungsbibliothek

  • Schritt 2 – Konfigurieren einer ASP.NET-Anwendung für die Verwendung der Anspruchsautorisierungsbibliothek

  • Schritt 3 – Konfigurieren einer Autorisierungsrichtlinie

Schritt 1 – Implementieren einer Anspruchsautorisierungsbibliothek

In diesem Schritt wird das Erstellen einer externen Klassenbibliothek gezeigt, die eine Zugriffsrichtlinie aus einer Konfigurationsdatei liest und die Zugriffsüberprüfungen durchsetzt. Das folgende Beispiel zeigt, wie eine Anspruchsautorisierungsbibliothek implementiert wird, die eine Autorisierungsentscheidung basierend auf einem Postleitzahlenanspruch trifft.

So implementieren Sie eine Anspruchsautorisierungsbibliothek

  1. Stellen Sie sicher, dass Visual Studio® im Administratormodus ausgeführt wird.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das gewünschte Projekt, fügen Sie ein neues Projekt Klassenbibliothek hinzu, und geben Sie diesem dann einen Namen (z. B. MyClaimsAuthorizationManager).

  3. Löschen Sie die Standardklasse (Class1.cs).

  4. Fügen Sie die neue Klasse hinzu, und geben Sie ihr dann einen Namen, z. B. ZipClaimsAuthorizationManager. Auf diese Weise wird eine Autorisierung basierend auf Postleitzahlen implementiert.

  5. Fügen Sie einen Verweis auf die Assemblys Microsoft.IdentityModel und System.Web hinzu.

  6. Fügen Sie die folgenden Deklarationen hinzu.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Erweitern Sie die Klasse ClaimsAuthorizationManager unter Außerkraftsetzung ihrer Methode AccessCheck, und implementieren Sie dann einen Konstruktor für Ihre Klasse ZipClaimsAuthorizationManager. Ihr Code sollte dem folgenden Code ähnlich sehen.

    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. Kompilieren Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler auftreten.

  9. Suchen Sie nach der kompilierten Bibliothek (in diesem Fall MyClaimsAuthorizationManager.dll). Diese muss im Ordner bin der ASP.NET-Webanwendung abgelegt werden.

Schritt 2 – Konfigurieren einer ASP.NET-Anwendung für die Verwendung der Anspruchsautorisierungsbibliothek

Die nächsten Schritte werden in Ihrer ASP.NET-Webanwendung ausgeführt. Fügen Sie keinen Verweis auf Ihre Anspruchsautorisierungs-Manager-Bibliothek hinzu, die Sie im vorherigen Schritt erstellt haben. Ihre ASP.NET-Webanwendung sollte mit Ausnahme der Datei web.config keine Verweise auf diese Bibliothek enthalten.

So konfigurieren Sie eine ASP.NET-Anwendung für die Verwendung der Anspruchsautorisierungsbibliothek

  1. Konfigurieren Sie Ihre ASP.NET-Webanwendung so, dass sie das ClaimsAuthorizationModule von WIF in ihrer Pipeline enthält, indem Sie dem Abschnitt HttpModules in der Datei web.config den folgenden Eintrag hinzufügen (gilt für den Entwicklungswebserver, der im Lieferumfang von Visual Studio enthalten ist, für IIS (Internet Information Services, Internetinformationsdienste), Version 7, sollte diese Konfiguration im Modulabschnitt unter dem Knoten system.webServer vorhanden sein).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Konfigurieren Sie Ihre ASP.NET-Webanwendung für die Verwendung der benutzerdefinierten Autorisierungsbibliothek, die Sie im vorherigen Schritt implementiert haben, indem Sie dem Knoten microsoft.identityModel.service den folgenden Eintrag hinzufügen.

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

Schritt 3 – Konfigurieren einer Autorisierungsrichtlinie

In diesem Thema wird die Konfigurationsrichtlinie in der Datei web.config der ASP.NET-Webanwendung angegeben. Die Richtlinie enthält einfache Regeln, die Ressourcen dem Anspruchstyp und seinem Wert zuordnen. Die folgende Richtlinie kann z. B. von der in den vorherigen Schritten erstellten und konfigurierten benutzerdefinierten Autorisierungsbibliothek gelesen und durchgesetzt werden. Fügen Sie dem im vorherigen Schritt konfigurierten Knoten claimsAuthorizationManager den folgenden Eintrag hinzu.

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

Die oben beschriebene Richtlinie verlangt, dass ein eingehendes Token einen Postleitzahlanspruch mit einem Wert von 11111 aufweisen muss, damit auf die Seite default.aspx zugegriffen werden kann.