Megosztás a következőn keresztül:


Útmutató: Jogcím-engedélyezés implementálása jogcímbarát ASP.NET alkalmazásban WIF és ACS használatával

Frissítve: 2015. június 19.

Érintett kiadások: Azure

Érvényesség

  • Microsoft® Azure™ Access Control Service (ACS)

  • ® Windows Identity Foundation (WIF)

  • ASP.NET

Összefoglalás

Ez a témakör azt ismerteti, hogyan valósíthat meg jogcímalapú Access Control (CBAC) hitelesítést jogcímbarát ASP.NET webalkalmazásokban WIF és ACS használatával.

Tartalom

  • Célkitűzések

  • Áttekintés

  • A lépések összefoglalása

  • 1. lépés – Jogcím-engedélyezési kódtár megvalósítása

  • 2. lépés – ASP.NET alkalmazás konfigurálása a jogcím-engedélyezési kódtár használatára

  • 3. lépés – Engedélyezési szabályzat konfigurálása

  • Kapcsolódó elemek

Célkitűzések

  • Az engedélyezési logika külsősítése az alkalmazásból.

  • Implementálja az engedélyezési ellenőrzéseket a szerepkörök után, így részletesebben szabályozhatja az engedélyezést.

  • Szabályzatalapú, deklaratív, engedélyezési felügyelet biztosítása.

Áttekintés

A jogcímek engedélyezése a jogkivonaton – a jogcímeken – belül tárolt információkon alapul. A jogcímek engedélyezése akkor hasznos, ha nem elegendő a kizárólag szerepkörökön alapuló engedélyezési döntés meghozatala. A pénzügyi alkalmazásokban például ugyanaz a szerepkör különböző korlátokat szabhat meg a számlák közötti pénzátadásra a bérleti idő és más attribútumok alapján. Az ilyen attribútumok jogcím formájában is megjelenhetnek a szerepkörrel együtt, és így lehetővé teszik a pontosabb engedélyezési döntés meghozatalát.

A lépések összefoglalása

  • 1. lépés – Jogcím-engedélyezési kódtár megvalósítása

  • 2. lépés – ASP.NET alkalmazás konfigurálása a jogcím-engedélyezési kódtár használatára

  • 3. lépés – Engedélyezési szabályzat konfigurálása

1. lépés – Jogcím-engedélyezési kódtár megvalósítása

Ez a lépés bemutatja, hogyan hozhat létre külső osztálytárat, amely beolvas egy hozzáférési szabályzatot egy konfigurációs fájlból, és kikényszeríti a hozzáférés-ellenőrzéseket. Az alábbi minta bemutatja, hogyan implementálhat egy jogcím-engedélyezési kódtárat, amely egy irányítószám-jogcímen alapuló engedélyezési döntést hoz.

Jogcím-engedélyezési kódtár implementálása

  1. Győződjön meg arról, hogy rendszergazdai módban futtatja a Visual Studio ®.

  2. Kattintson a jobb gombbal a kívánt megoldásra Megoldáskezelő, adjon hozzá egy új Osztálytár projektet, majd adjon neki egy nevet, például MyClaimsAuthorizationManager.

  3. Törölje az alapértelmezett Class1.cs osztályt.

  4. Adjon hozzá egy új osztályt, és adjon neki egy nevet, például ZipClaimsAuthorizationManager. Ez az irányítószámokon alapuló engedélyezést valósít meg.

  5. Adjon hozzá egy hivatkozást a Microsoft.IdentityModel és a System.Web szerelvényekhez.

  6. Adja hozzá a következő deklarációkat.

    using System.IO;
    using System.Xml; 
    using Microsoft.IdentityModel.Claims; 
    using Microsoft.IdentityModel.Configuration; 
    
  7. Bővítse ki a ClaimsAuthorizationManager osztályt , felülírva annak AccessCheck metódusát, majd implementáljon egy konstruktort a ZipClaimsAuthorizationManager osztályban. A kódnak az alábbihoz hasonlóan kell kinéznie.

    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. Fordítsa le a megoldást, hogy meggyőződjön arról, hogy nincsenek fordítási hibák.

  9. Keresse meg a lefordított kódtárat, ebben az esetben MyClaimsAuthorizationManager.dll. Ezt a ASP.NET webalkalmazás bin mappájába kell helyezni.

2. lépés – ASP.NET alkalmazás konfigurálása a jogcím-engedélyezési kódtár használatára

A következő lépések a ASP.NET-webalkalmazásban lesznek végrehajtva. Ne adjon hozzá hivatkozást az előző lépésben létrehozott Jogcímengedélyezési kezelő tárhoz. A ASP.NET-webalkalmazásnak nem szabad tisztában lennie vele, kivéve web.config.

ASAP.NET alkalmazás konfigurálása a jogcím-engedélyezési kódtár használatára

  1. Konfigurálja a ASP.NET-webalkalmazást úgy, hogy tartalmazza a WIFs ClaimsAuthorizationModule modult a folyamatában. Ehhez adja hozzá a következő bejegyzést a web.config HttpModules szakaszához (amely a Visual Studio; for Internet Information Services (IIS) 7-es verziójában ezt a konfigurációt a system.webServer csomópont modulok szakaszában kell elhelyezni.

    <add name="ClaimsAuthorizationModule" 
         type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    
  2. Konfigurálja a ASP.NET-webalkalmazást az előző lépésben implementált egyéni engedélyezési kódtár használatára. Ehhez adja hozzá a következő bejegyzést a microsoft.identityModel.service csomóponthoz.

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

3. lépés – Engedélyezési szabályzat konfigurálása

Ebben a témakörben a konfigurációs szabályzatot a ASP.NET webalkalmazás web.config fájlban fejezzük ki. A szabályzat egyszerű szabályokat használ, amelyek az erőforrásokat a jogcím típusához és értékéhez rendelik. Az alábbi szabályzatot például az előző lépésekben létrehozott és konfigurált egyéni engedélyezési kódtár tudja olvasni és kikényszeríteni. Adja hozzá a következő bejegyzést az előző lépésben konfigurált claimsAuthorizationManager csomóponthoz.

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

A fenti szabályzat megköveteli, hogy a bejövő jogkivonatnak 11111 értékű zip-jogcímmel kell rendelkeznie a default.aspx lap eléréséhez.