Sdílet prostřednictvím


Postupy: Implementace autorizace deklarací identity v aplikaci pracující s deklaracemi ASP.NET pomocí WIF a ACS

Aktualizováno: 19. června 2015

Platí pro: Azure

Platí pro

  • Služba Microsoft® Azure™ Access Control (ACS)

  • ® Windows Identity Foundation (WIF)

  • ASP.NET

Souhrn

Toto téma popisuje, jak implementovat autorizaci Access Control deklarací identity (CBAC) ve webových aplikacích pracujících s deklaracemi ASP.NET pomocí WIF a ACS.

Obsah

  • Cíle

  • Přehled

  • Přehled kroků

  • Krok 1 – Implementace knihovny deklarací identity

  • Krok 2 – Konfigurace aplikace ASP.NET pro použití knihovny pro autorizaci deklarací identity

  • Krok 3 – Konfigurace zásad autorizace

  • Související položky

Cíle

  • Externí autorizace logiky z aplikace.

  • Implementujte kontroly autorizace nad rolemi, což vede k podrobnější kontrole autorizace.

  • Poskytuje zásady řízené, deklarativní a autorizační správu.

Přehled

Autorizace deklarací identity je založená na použití informací, které se přenášejí v tokenu – deklarací identity. Autorizace deklarací identity je užitečná, pokud není dostatečná k tomu, aby rozhodnutí o autorizaci bylo založeno výhradně na rolích. Například ve finančních aplikacích může být stejná role udělena různým omezením převodu peněz mezi účty na základě tenanta a dalších atributů. Tyto atributy mohou být součástí deklarace identity spolu s rolí, a proto umožňují jemněji vyladěné rozhodnutí o autorizaci.

Přehled kroků

  • Krok 1 – Implementace knihovny deklarací identity

  • Krok 2 – Konfigurace aplikace ASP.NET pro použití knihovny pro autorizaci deklarací identity

  • Krok 3 – Konfigurace zásad autorizace

Krok 1 – Implementace knihovny deklarací identity

Tento krok ukazuje, jak vytvořit externí knihovnu tříd, která bude číst zásady přístupu z konfiguračního souboru a vynucovat kontroly přístupu. Následující ukázka ukazuje, jak implementovat knihovnu pro autorizaci deklarací identity, která provádí rozhodnutí o autorizaci na základě deklarace PSČ.

Implementace knihovny pro autorizaci deklarací identity

  1. Ujistěte se, že používáte Visual Studio ® v režimu správce.

  2. Klikněte pravým tlačítkem myši na požadované řešení v Průzkumník řešení, přidejte nový projekt knihovny tříd a dejte mu název, například MyClaimsAuthorizationManager.

  3. Odstraňte výchozí třídu Class1.cs.

  4. Přidejte novou třídu a pojmenujte ji, například ZipClaimsAuthorizationManager. Tím se implementuje autorizace na základě PSČ.

  5. Přidejte odkaz na sestavení Microsoft.IdentityModel a system.Web .

  6. Přidejte následující deklarace.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Rozšiřte třídu ClaimsAuthorizationManager , přepíšete svou metodu AccessCheck a pak implementujte konstruktor do třídy ZipClaimsAuthorizationManager . Váš kód by měl vypadat podobně jako v následujícím příkladu.

    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. Zkompilujte řešení a ujistěte se, že nedošlo k žádným chybám kompilace.

  9. Vyhledejte kompilovanou knihovnu, v tomto případě MyClaimsAuthorizationManager.dll. Bude nutné ho vyhodit do složky přihrádky webové aplikace ASP.NET.

Krok 2 – Konfigurace aplikace ASP.NET pro použití knihovny pro autorizaci deklarací identity

V ASP.NET webové aplikaci se provádějí další kroky. Nepřidávejte odkaz na knihovnu Správce autorizace deklarací identity, kterou jste vytvořili v předchozím kroku. Webová aplikace ASP.NET by o ní měla být "neznámá", s výjimkou web.config.

Konfigurace aplikace ASAP.NET tak, aby používala knihovnu deklarací identity

  1. Nakonfigurujte webovou aplikaci ASP.NET tak, aby zahrnovala wify ClaimsAuthorizationModule v kanálu přidáním následující položky do oddílu HttpModules v web.config (platné pro vývojový webový server, který se dodává s Visual Studio; pro Internetová informační služba (IIS) verze 7, tato konfigurace by měla být umístěna v části modulů v uzlu system.webServer).

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Nakonfigurujte ASP.NET webovou aplikaci tak, aby používala vlastní autorizační knihovnu, kterou jste implementovali v předchozím kroku, přidáním následující položky do uzlu microsoft.identityModel.service.

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

Krok 3 – Konfigurace zásad autorizace

V tomto tématu se zásady konfigurace vyjadřují v souboru web.config webové aplikace ASP.NET. Zásady mají jednoduchá pravidla, která mapuje prostředky na typ deklarace identity a její hodnotu. Například následující zásady je možné číst a vynucovat vlastní autorizační knihovnou, kterou jste vytvořili a nakonfigurovali v předchozích krocích. Přidejte následující položku do uzlu claimsAuthorizationManager, který jste nakonfigurovali v předchozím kroku.

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

Výše uvedená zásada vyžaduje, aby příchozí token měl deklaraci zip s hodnotou 11111, aby bylo možné získat přístup ke stránce default.aspx.