Procedure: Toegang beperken met de klasse PrincipalPermissionAttribute
Het beheren van de toegang tot resources op een Windows-domeincomputer is een eenvoudige beveiligingstaak. Zo moeten alleen bepaalde gebruikers gevoelige gegevens kunnen bekijken, zoals salarisgegevens. In dit onderwerp wordt uitgelegd hoe u de toegang tot een methode beperkt door te eisen dat de gebruiker deel uitmaakt van een vooraf gedefinieerde groep. Zie Toegang tot servicebewerkingen autoriseren voor een werkend voorbeeld.
De taak bestaat uit twee afzonderlijke procedures. De eerste maakt de groep en vult deze met gebruikers. De tweede past de PrincipalPermissionAttribute klasse toe om de groep op te geven.
Een Windows-groep maken
Open de computerbeheerconsole .
Klik in het linkerdeelvenster op Lokale gebruikers en groepen.
Klik met de rechtermuisknop op Groepen en klik op Nieuwe groep.
Typ een naam voor de nieuwe groep in het vak Groepsnaam .
Typ een beschrijving van de nieuwe groep in het vak Beschrijving .
Klik op de knop Toevoegen om nieuwe leden toe te voegen aan de groep.
Als u uzelf aan de groep hebt toegevoegd en de volgende code wilt testen, moet u zich afmelden bij de computer en weer aanmelden om in de groep te worden opgenomen.
Gebruikerslidmaatschap vragen
Open het WCF-codebestand (Windows Communication Foundation) dat de geïmplementeerde servicecontractcode bevat. Zie Servicecontracten implementeren voor meer informatie over het implementeren van een contract.
Pas het PrincipalPermissionAttribute kenmerk toe op elke methode die moet worden beperkt tot een specifieke groep. Stel de Action eigenschap in Demand op en de Role eigenschap op de naam van de groep. Bijvoorbeeld:
// Only members of the CalculatorClients group can call this method. [PrincipalPermission(SecurityAction.Demand, Role = "CalculatorClients")] public double Add(double a, double b) { return a + b; }
' Only members of the CalculatorClients group can call this method. <PrincipalPermission(SecurityAction.Demand, Role:="CalculatorClients")> _ Public Function Add(ByVal a As Double, ByVal b As Double) As Double Return a + b End Function
Notitie
Als u het PrincipalPermissionAttribute kenmerk toepast op een contract, wordt er een SecurityException gegenereerd. U kunt het kenmerk alleen toepassen op methodeniveau.
Een certificaat gebruiken om de toegang tot een methode te beheren
U kunt de klasse ook gebruiken om de PrincipalPermissionAttribute
toegang tot een methode te beheren als het clientreferentietype een certificaat is. Hiervoor moet u het onderwerp en de vingerafdruk van het certificaat hebben.
Zie Certificaten weergeven met de MMC-module om een certificaat voor de eigenschappen ervan te bekijken. Zie Procedure voor het vinden van de vingerafdrukwaarde: De vingerafdruk van een certificaat ophalen.
Toegang beheren met behulp van een certificaat
Pas de PrincipalPermissionAttribute klasse toe op de methode waarop u de toegang wilt beperken.
Stel de actie van het kenmerk in op SecurityAction.Demand.
Stel de
Name
eigenschap in op een tekenreeks die bestaat uit de onderwerpnaam en de vingerafdruk van het certificaat. Scheid de twee waarden met een puntkomma en een spatie, zoals wordt weergegeven in het volgende voorbeeld:// Only a client authenticated with a valid certificate that has the // specified subject name and thumbprint can call this method. [PrincipalPermission(SecurityAction.Demand, Name = "CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")] public double Multiply(double a, double b) { return a * b; }
' Only a client authenticated with a valid certificate that has the ' specified subject name and thumbprint can call this method. <PrincipalPermission(SecurityAction.Demand, Name:="CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")> _ Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double Return a * b End Function
Stel de PrincipalPermissionMode eigenschap in op UseAspNetRoles zoals wordt weergegeven in het volgende configuratievoorbeeld:
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
Als u deze waarde instelt om aan te
UseAspNetRoles
geven dat deName
eigenschap van dePrincipalPermissionAttribute
eigenschap wordt gebruikt om een tekenreeksvergelijking uit te voeren. Wanneer een certificaat wordt gebruikt als clientreferentie, voegt WCF standaard de algemene naam van het certificaat en de vingerafdruk samen met een puntkomma om een unieke waarde te maken voor de primaire identiteit van de client. AlsUseAspNetRoles
deze waarde is ingesteld als dePrincipalPermissionMode
op de service, wordt deze primaire identiteitswaarde vergeleken met deName
eigenschapswaarde om de toegangsrechten van de gebruiker te bepalen.Als u een zelf-hostende service maakt, kunt u de PrincipalPermissionMode eigenschap ook instellen in code, zoals wordt weergegeven in de volgende code:
ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri); ServiceAuthorizationBehavior myServiceBehavior = myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); myServiceBehavior.PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles;
Dim myServiceBehavior As ServiceAuthorizationBehavior myServiceBehavior = _ myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)() myServiceBehavior.PrincipalPermissionMode = _ PrincipalPermissionMode.UseAspNetRoles