Vorgehensweise: Erstellen eines benutzerdefinierten Autorisierungs-Managers für einen DienstHow to: Create a Custom Authorization Manager for a Service

Die Identitätsmodellinfrastruktur in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) unterstützt ein erweiterbares anspruchsbasiertes Autorisierungsmodell.The Identity Model infrastructure in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) supports an extensible claims-based authorization model. Ansprüche werden aus Token extrahiert, wahlweise mit benutzerdefinierten Autorisierungsrichtlinien verarbeitet und dann in einem AuthorizationContext platziert.Claims are extracted from tokens and optionally processed by custom authorization policies and then placed into an AuthorizationContext. Die Ansprüche im AuthorizationContext werden von einem Autorisierungs-Manager geprüft und als Grundlage für Autorisierungsentscheidungen herangezogen.An authorization manager examines the claims in the AuthorizationContext to make authorization decisions.

Standardmäßig werden Autorisierungsentscheidungen von der ServiceAuthorizationManager-Klasse getroffen. Diese Entscheidungen können jedoch durch die Erstellung eines benutzerdefinierten Autorisierungs-Managers außer Kraft gesetzt werden.By default, authorization decisions are made by the ServiceAuthorizationManager class; however these decisions can be overridden by creating a custom authorization manager. Wenn Sie Ihren eigenen Autorisierungs-Manager erstellen möchten, erstellen Sie eine Klasse, die von ServiceAuthorizationManager ableitet, und implementieren die CheckAccessCore-Methode.To create a custom authorization manager, create a class that derives from ServiceAuthorizationManager and implement CheckAccessCore method. Autorisierungsentscheidungen werden in der CheckAccessCore-Methode getroffen, von der true zurückgegeben wird, wenn Zugriff gewährt wurde, und false, wenn der Zugriff verweigert wurde.Authorization decisions are made in the CheckAccessCore method, which returns true when access is granted and false when access is denied.

Wenn die Autorisierungsentscheidung vom Inhalt des Nachrichtentexts abhängt, verwenden Sie die CheckAccess-Methode.If the authorization decision depends on the contents of the message body, use the CheckAccess method.

Um Leistungseinbußen zu vermeiden, sollten Sie soweit möglich Ihre Anwendung neu entwerfen, sodass für die Autorisierungsentscheidung kein Zugriff auf den Nachrichtentext erforderlich ist.Because of performance issues, if possible you should redesign your application so that the authorization decision does not require access to the message body.

Die Registrierung des benutzerdefinierten Autorisierungs-Managers für einen Dienst kann im Code oder in der Konfiguration erfolgen.Registration of the custom authorization manager for a service can be done in code or configuration.

So erstellen Sie einen benutzerdefinierten Autorisierungs-ManagerTo create a custom authorization manager

  1. Leiten Sie eine Klasse von der ServiceAuthorizationManager-Klasse ab.Derive a class from the ServiceAuthorizationManager class.

    public class MyServiceAuthorizationManager : ServiceAuthorizationManager
    {
    
    
    Public Class MyServiceAuthorizationManager
        Inherits ServiceAuthorizationManager
        
    
  2. Überschreiben Sie die CheckAccessCore(OperationContext)-Methode.Override the CheckAccessCore(OperationContext) method.

    Verwenden Sie den an die OperationContext-Methode übergebenen CheckAccessCore(OperationContext), um Autorisierungsentscheidungen zu fällen.Use the OperationContext that is passed to the CheckAccessCore(OperationContext) method to make authorization decisions.

    Im folgenden Codebeispiel wird mit der FindClaims(String, String)-Methode der benutzerdefinierte Anspruch http://www.contoso.com/claims/allowedoperation gesucht, um eine Autorisierungsentscheidung zu treffen.The following code example uses the FindClaims(String, String) method to find the custom claim http://www.contoso.com/claims/allowedoperation to make an authorization decision.

    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 
    

So registrieren Sie einen benutzerdefinierten Autorisierungs-Manager im CodeTo register a custom authorization manager using code

  1. Erstellen Sie eine Instanz des benutzerdefinierten Autorisierungs-Managers, und weisen Sie sie der ServiceAuthorizationManager-Eigenschaft zu.Create an instance of the custom authorization manager and assign it to the ServiceAuthorizationManager property.

    Auf ServiceAuthorizationBehavior kann mit der Authorization-Eigenschaft zugegriffen werden.The ServiceAuthorizationBehavior can be accessed using Authorization property.

    Im folgenden Codebeispiel wird der benutzerdefinierte MyServiceAuthorizationManager-Autorisierungs-Manager registriert.The following code example registers the MyServiceAuthorizationManager custom authorization manager.

    // 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()
    
    

So registrieren Sie einen benutzerdefinierten Autorisierungs-Manager in der KonfigurationTo register a custom authorization manager using configuration

  1. Öffnen Sie die Konfigurationsdatei für den Dienst.Open the configuration file for the service.

  2. Hinzufügen einer <ServiceAuthorization > auf die <Verhalten >.Add a <serviceAuthorization> to the <behaviors>.

    Um die <ServiceAuthorization >, Hinzufügen einer serviceAuthorizationManagerType Attribut, und legen Sie den Wert in den Typ, der vom benutzerdefinierten Autorisierungs-Manager darstellt.To the <serviceAuthorization>, add a serviceAuthorizationManagerType attribute and set its value to the type that represents the custom authorization manager.

  3. Fügen Sie eine Bindung hinzu, durch die die Kommunikation zwischen Client und Dienst gesichert wird.Add a binding that secures the communication between the client and service.

    Die für diese Kommunikation gewählte Bindung bestimmt die Ansprüche, die zum AuthorizationContext hinzugefügt werden, der vom benutzerdefinierten Autorisierungs-Manager verwendet wird, um Autorisierungsentscheidungen zu treffen.The binding that is chosen for this communication determines the claims that are added to the AuthorizationContext, which the custom authorization manager uses to make authorization decisions. Weitere Informationen zu den vom System bereitgestellten Bindungen, finden Sie unter sicherheitsbindungsarten Bindungen.For more details about the system-provided bindings, see System-Provided Bindings.

  4. Ordnen Sie das Verhalten zu einem Dienstendpunkt durch Hinzufügen einer <Service > Element und legen Sie den Wert von der behaviorConfiguration -Attributs auf den Wert des Namensattributs für die <Verhalten > Element.Associate the behavior to a service endpoint, by adding a <service> element and set the value of the behaviorConfiguration attribute to the value of the name attribute for the <behavior> element.

    Weitere Informationen zum Konfigurieren eines Dienstendpunkts finden Sie unter Vorgehensweise: Erstellen eines Dienstendpunkts in der Konfiguration.For more information about configuring a service endpoint, see How to: Create a Service Endpoint in Configuration.

    Im folgenden Codebeispiel wird der benutzerdefinierte Autorisierungs-Manager Samples.MyServiceAuthorizationManager registriert.The following code example registers the custom authorization manager Samples.MyServiceAuthorizationManager.

    <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>  
    

    Warnung

    Beachten Sie, dass die Zeichenfolge den vollqualifizierten Typnamen enthalten muss, wenn Sie serviceAuthorizationManagerType angeben.Note that when you specify the serviceAuthorizationManagerType, the string must contain the fully qualified type name. ein Komma und der Name der Assembly, in der der Typ definiert ist.a comma, and the name of the assembly in which the type is defined. Wenn Sie den Assemblynamen auslassen, versucht WCF, den Typ aus System.ServiceModel.dll zu laden.If you leave out the assembly name, WCF will attempt to load the type from System.ServiceModel.dll.

BeispielExample

Das folgende Codebeispiel zeigt eine grundlegende Implementierung einer ServiceAuthorizationManager-Klasse, bei der auch die CheckAccessCore-Methode außer Kraft gesetzt (überschrieben) wird.The following code example demonstrates a basic implementation of a ServiceAuthorizationManager class that includes overriding the CheckAccessCore method. Im Beispielcode wird der AuthorizationContext auf einen benutzerspezifischen Anspruch hin überprüft und true zurückgegeben, wenn die Ressource für diesen benutzerspezifischen Anspruch zum Aktionswert aus dem OperationContext passt.The example code examines the AuthorizationContext for a custom claim and returns true when the resource for that custom claim matches the action value from the OperationContext. Für eine vollständige Implementierung der eine ServiceAuthorizationManager Klasse, finden Sie unter Autorisierungsrichtlinie.For a more complete implementation of a ServiceAuthorizationManager class, see Authorization Policy.

 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 

Siehe auchSee Also

ServiceAuthorizationManager
AutorisierungsrichtlinieAuthorization Policy
AutorisierungsrichtlinieAuthorization Policy