Procedure: Een aangepast autorisatiebeheer maken voor een service
De infrastructuur voor identiteitsmodellen in Windows Communication Foundation (WCF) ondersteunt een uitbreidbaar autorisatiemodel op basis van claims. Claims worden geëxtraheerd uit tokens en eventueel verwerkt door aangepast autorisatiebeleid en vervolgens in een AuthorizationContext. Een autorisatiebeheerder onderzoekt de claims in de AuthorizationContext om autorisatiebeslissingen te nemen.
Standaard worden autorisatiebeslissingen genomen door de ServiceAuthorizationManager klasse. Deze beslissingen kunnen echter worden overschreven door een aangepast autorisatiebeheer te maken. Als u een aangepast autorisatiebeheer wilt maken, maakt u een klasse die is afgeleid van ServiceAuthorizationManager de methode en implementeert CheckAccessCore . Autorisatiebeslissingen worden genomen in de CheckAccessCore methode, die retourneert true
wanneer toegang wordt verleend en false
wanneer de toegang wordt geweigerd.
Als de autorisatiebeslissing afhankelijk is van de inhoud van de berichttekst, gebruikt u de CheckAccess methode.
Vanwege prestatieproblemen moet u, indien mogelijk, uw toepassing opnieuw ontwerpen, zodat de autorisatiebeslissing geen toegang tot de hoofdtekst van het bericht vereist.
Registratie van de aangepaste autorisatiebeheerder voor een service kan worden uitgevoerd in code of configuratie.
Een aangepast autorisatiebeheer maken
Een klasse afleiden uit de ServiceAuthorizationManager klas.
public class MyServiceAuthorizationManager : ServiceAuthorizationManager {
Public Class MyServiceAuthorizationManager Inherits ServiceAuthorizationManager
Overschrijf de CheckAccessCore(OperationContext) methode.
Gebruik de OperationContext methode die wordt doorgegeven aan de CheckAccessCore(OperationContext) methode om autorisatiebeslissingen te nemen.
In het volgende codevoorbeeld wordt de FindClaims(String, String) methode gebruikt om de aangepaste claim
http://www.contoso.com/claims/allowedoperation
te vinden om een autorisatiebeslissing te nemen.protected override bool CheckAccessCore(OperationContext operationContext) { // Extract the action URI from the OperationContext. Match this against the claims // in the AuthorizationContext. string action = operationContext.RequestContext.RequestMessage.Headers.Action; // Iterate through the various claim sets in the AuthorizationContext. foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets) { // Examine only those claim sets issued by System. if (cs.Issuer == ClaimSet.System) { // Iterate through claims of type "http://www.contoso.com/claims/allowedoperation". foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty)) { // If the Claim resource matches the action URI then return true to allow access. if (action == c.Resource.ToString()) return true; } } } // If this point is reached, return false to deny access. return false; }
Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean ' Extract the action URI from the OperationContext. Match this against the claims. ' in the AuthorizationContext. Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action ' Iterate through the various claimsets in the AuthorizationContext. Dim cs As ClaimSet For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets ' Examine only those claim sets issued by System. If cs.Issuer Is ClaimSet.System Then ' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation". Dim c As Claim For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _ Rights.PossessProperty) ' If the Claim resource matches the action URI then return true to allow access. If action = c.Resource.ToString() Then Return True End If Next c End If Next cs ' If this point is reached, return false to deny access. Return False End Function
Een aangepast autorisatiebeheer registreren met behulp van code
Maak een exemplaar van het aangepaste autorisatiebeheer en wijs dit toe aan de ServiceAuthorizationManager eigenschap.
U ServiceAuthorizationBehavior kunt deze openen met behulp van Authorization de eigenschap.
In het volgende codevoorbeeld wordt de
MyServiceAuthorizationManager
aangepaste autorisatiebeheerder geregistreerd.// Add a custom authorization manager to the service authorization behavior. serviceHost.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
' Add a custom authorization manager to the service authorization behavior. serviceHost.Authorization.ServiceAuthorizationManager = _ New MyServiceAuthorizationManager()
Een aangepast autorisatiebeheer registreren met behulp van configuratie
Open het configuratiebestand voor de service.
Voeg een serviceAuthorization> toe aan het< gedrag>.<
Voeg aan serviceAuthorization ><een
serviceAuthorizationManagerType
kenmerk toe en stel de waarde ervan in op het type dat de aangepaste autorisatiebeheerder vertegenwoordigt.Voeg een binding toe waarmee de communicatie tussen de client en de service wordt beveiligd.
De binding die voor deze communicatie wordt gekozen, bepaalt de claims die worden toegevoegd aan de AuthorizationContext, die de aangepaste autorisatiebeheerder gebruikt om autorisatiebeslissingen te nemen. Zie Systeemgebonden bindingen voor meer informatie over de door het systeem geleverde bindingen.
Koppel het gedrag aan een service-eindpunt door een <service-element> toe te voegen en de waarde van het
behaviorConfiguration
kenmerk in te stellen op de waarde van het naamkenmerk voor het< gedragselement>.Zie How to: Create a Service Endpoint in Configuration (Een service-eindpunt maken in configuratie) voor meer informatie over het configureren van een service-eindpunt.
In het volgende codevoorbeeld wordt de aangepaste autorisatiebeheerder
Samples.MyServiceAuthorizationManager
geregistreerd.<configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding_Calculator" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </service> </services> <bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Waarschuwing
Houd er rekening mee dat wanneer u het serviceAuthorizationManagerType opgeeft, de tekenreeks de volledig gekwalificeerde typenaam moet bevatten. een komma en de naam van de assembly waarin het type is gedefinieerd. Als u de assemblynaam weglaat, probeert WCF het type uit System.ServiceModel.dll te laden.
Opmerking
In het volgende codevoorbeeld ziet u een eenvoudige implementatie van een ServiceAuthorizationManager klasse die de CheckAccessCore methode overschrijft. De voorbeeldcode onderzoekt de AuthorizationContext voor een aangepaste claim en retourneert true
wanneer de resource voor die aangepaste claim overeenkomt met de actiewaarde van de OperationContext. Zie Autorisatiebeleid voor een volledigere implementatie van een ServiceAuthorizationManager klasse.
public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
// Extract the action URI from the OperationContext. Match this against the claims
// in the AuthorizationContext.
string action = operationContext.RequestContext.RequestMessage.Headers.Action;
// Iterate through the various claim sets in the AuthorizationContext.
foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
{
// Examine only those claim sets issued by System.
if (cs.Issuer == ClaimSet.System)
{
// Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty))
{
// If the Claim resource matches the action URI then return true to allow access.
if (action == c.Resource.ToString())
return true;
}
}
}
// If this point is reached, return false to deny access.
return false;
}
}
Public Class MyServiceAuthorizationManager
Inherits ServiceAuthorizationManager
Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean
' Extract the action URI from the OperationContext. Match this against the claims.
' in the AuthorizationContext.
Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action
' Iterate through the various claimsets in the AuthorizationContext.
Dim cs As ClaimSet
For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
' Examine only those claim sets issued by System.
If cs.Issuer Is ClaimSet.System Then
' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
Dim c As Claim
For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _
Rights.PossessProperty)
' If the Claim resource matches the action URI then return true to allow access.
If action = c.Resource.ToString() Then
Return True
End If
Next c
End If
Next cs
' If this point is reached, return false to deny access.
Return False
End Function
End Class