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
Zorg ervoor dat u Visual Studio ® uitvoert in de beheerdersmodus.
Klik met de rechtermuisknop op de gewenste oplossing in Solution Explorer, voeg een nieuw klassebibliotheekproject toe en geef het vervolgens een naam, bijvoorbeeld MyClaimsAuthorizationManager.
Verwijder de standaardklasse Class1.cs.
Voeg een nieuwe klasse toe en geef deze een naam, bijvoorbeeld ZipClaimsAuthorizationManager. Hiermee wordt een autorisatie geïmplementeerd op basis van postcodes.
Voeg een verwijzing naar het Microsoft.IdentityModel en de System.Web-assembly's toe.
Voeg de volgende declaraties toe.
using System.IO; using System.Xml; using Microsoft.IdentityModel.Claims; using Microsoft.IdentityModel.Configuration;
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; } } }
Compileer de oplossing om ervoor te zorgen dat er geen compilatiefouten zijn.
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
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" />
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.