Delegierung und Identitätswechsel mit WCFDelegation and Impersonation with WCF

DerIdentitätswechsel ist ein gängiges Verfahren, das Dienste verwenden, um den Clientzugriff auf die Ressourcen einer Dienstdomäne zu beschränken.Impersonation is a common technique that services use to restrict client access to a service domain's resources. Dienstdomänenressourcen können entweder Computerressourcen, wie lokale Dateien (Identitätswechsel), oder eine Ressource auf einem anderen Computer, z. B. eine Dateifreigabe (Delegierung), sein.Service domain resources can either be machine resources, such as local files (impersonation), or a resource on another machine, such as a file share (delegation). Eine Beispielanwendung finden Sie unter Impersonating the Client.For a sample application, see Impersonating the Client. Ein Beispiel zur Verwendung von Identitätswechsel finden Sie unter How to: Impersonate a Client on a Service.For an example of how to use impersonation, see How to: Impersonate a Client on a Service.

Wichtig

Beim Identitätswechsel eines Clients in einem Dienst wird der Dienst mit den Anmeldeinformationen des Clients ausgeführt, die höhere Rechte besitzen können als der Serverprozess.Be aware that when impersonating a client on a service, the service runs with the client's credentials, which may have higher privileges than the server process.

ÜbersichtOverview

In der Regel ruft ein Client einen Dienst auf, damit dieser eine Aktion für ihn ausführt.Typically, clients call a service to have the service perform some action on the client’s behalf. Der Identitätswechsel ermöglicht es dem Dienst, während der Ausführung der Aktion als Client zu fungieren.Impersonation allows the service to act as the client while performing the action. Die Delegierung ermöglicht es einem Front-End-Dienst, die Clientanforderung so an einen Back-End-Dienst weiterzuleiten, dass auch der Back-End-Dienst die Identität des Clients annehmen kann.Delegation allows a front-end service to forward the client’s request to a back-end service in such a way that the back-end service can also impersonate the client. Der Identitätswechsel wird meist als Möglichkeit verwendet, mit der überprüft werden kann, ob ein Client zur Durchführung einer bestimmten Aktion berechtigt ist. Die Delegierung stellt dagegen eine Möglichkeit dar, die Fähigkeit zum Identitätswechsel und die Clientidentität an einen Back-End-Dienst zu übertragen.Impersonation is most commonly used as a way of checking whether a client is authorized to perform a particular action, while delegation is a way of flowing impersonation capabilities, along with the client’s identity, to a back-end service. Die Delegierung ist eine Windows-Domänenfunktion, die verwendet werden kann, wenn eine auf Kerberos basierende Authentifizierung durchgeführt wird.Delegation is a Windows domain feature that can be used when Kerberos-based authentication is performed. Delegierung und Identitätsübergabe sind zwei verschiedene Dinge. Weil bei der Delegierung die Fähigkeit zur Annahme der Identität des Clients übertragen wird, ohne das Kennwort des Clients zu besitzen, handelt es sich um einen Vorgang mit höheren Sicherheitsberechtigungen als die Identitätsübergabe.Delegation is distinct from identity flow and, because delegation transfers the ability to impersonate the client without possession of the client’s password, it is a much higher privileged operation than identity flow.

Sowohl Identitätswechsel als auch Delegierung erfordern, dass der Client eine Windows-Identität besitzt.Both impersonation and delegation require that the client have a Windows identity. Wenn der Client keine Windows-Identität besitzt, dann besteht nur die Möglichkeit, die Identität des Clients dem zweiten Dienst zu übertragen.If a client does not possess a Windows identity, then the only option available is to flow the client’s identity to the second service.

Grundlagen des IdentitätswechselsImpersonation Basics

Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) unterstützt den Identitätswechsel für eine Vielzahl von Clientanmeldeinformationen. supports impersonation for a variety of client credentials. In diesem Thema wird die Dienstmodellunterstützung für den Identitätswechsel des Aufrufers während der Implementierung einer Dienstmethode beschrieben.This topic describes service model support for impersonating the caller during the implementation of a service method. Außerdem werden allgemeine Bereitstellungsszenarien erörtert, die Identitätswechsel und SOAP-Sicherheit und WCFWCF -Optionen in diesen Szenarien beinhalten.Also discussed are common deployment scenarios involving impersonation and SOAP security and WCFWCF options in these scenarios.

Der Schwerpunkt dieses Themas liegt auf dem Identitätswechsel und der Delegierung in WCFWCF bei Verwendung der SOAP-Sicherheit.This topic focuses on impersonation and delegation in WCFWCF when using SOAP security. Sie können den Identitätswechsel und die Delegierung auch mit WCFWCF verwenden, wenn Sie die Transportsicherheit nutzen, wie unter Using Impersonation with Transport Security.You can also use impersonation and delegation with WCFWCF when using transport security, as described in Using Impersonation with Transport Security.

Zwei MethodenTwo Methods

WCFWCF -SOAP-Sicherheit verfügt über zwei verschiedene Methode zum Durchführen von Identitätswechsel. SOAP security has two distinct methods for performing impersonation. Die verwendete Methode hängt von der Bindung ab.The method used depends on the binding. Die eine Methode besteht im Identitätswechsel von einem Windows-Token aus, das von SSPI (Security Support Provider Interface) oder der Kerberos-Authentifizierung stammt, die dann im Cache des Diensts gespeichert wird.One is impersonation from a Windows token obtained from the Security Support Provider Interface (SSPI) or Kerberos authentication, which is then cached on the service. Die zweite Methode besteht im Identitätswechsel von einem Windows-Token aus, das von Kerberos-Erweiterungen stammt, insgesamt als Service-for-User (S4U) bezeichnet.The second is impersonation from a Windows token obtained from the Kerberos extensions, collectively called Service-for-User (S4U).

Identitätswechsel mit im Cache gespeichertem TokenCached Token Impersonation

Sie können einen Identitätswechsel mit einem im Cache gespeicherten Token folgendermaßen ausführen:You can perform cached-token impersonation with the following:

Auf S4U basierender IdentitätswechselS4U-Based Impersonation

Sie können einen auf S4U basierenden Identitätswechsel folgendermaßen ausführen:You can perform S4U-based impersonation with the following:

  • MitWSHttpBinding, WSDualHttpBindingund NetTcpBinding mit Zertifikatclient-Anmeldeinformationen, die der Dienst einem gültigen Windows-Konto zuordnen kann.WSHttpBinding, WSDualHttpBinding, and NetTcpBinding with a certificate client credential that the service can map to a valid Windows account.

  • Mit jeder CustomBinding , die Windows-Clientanmeldeinformationen verwendet, bei denen die requireCancellation -Eigenschaft auf falseeingestellt ist.Any CustomBinding that uses a Windows client credential with the requireCancellation property set to false.

  • Mit jeder CustomBinding , die einen Benutzernamen oder Windows-Clientanmeldeinformationen und eine sichere Konversation verwendet, wobei die requireCancellation -Eigenschaft auf falseeingestellt ist.Any CustomBinding that uses a user name or Windows client credential and secure conversation with the requireCancellation property set to false.

Inwieweit der Dienst die Identität des Clients annehmen kann, hängt von den Rechten ab, die das Dienstkonto beim Versuch des Identitätswechsels besitzt, vom verwendeten Typ des Identitätswechsels und möglicherweise vom Ausmaß des Identitätswechsels, den der Client zulässt.The extent to which the service can impersonate the client depends on the privileges the service account holds when it attempts impersonation, the type of impersonation used, and possibly the extent of impersonation the client permits.

Hinweis

Wenn Client und Dienst auf demselben Computer ausgeführt werden und der Client unter einem Systemkonto (z. B. unter Local System oder Network Service) ausgeführt wird, kann kein Clientidentitätswechsel vorgenommen werden, wenn mit Token für den Sicherheitszustandskontext eine Sicherheitsverbindung hergestellt wird.When the client and service are running on the same computer and the client is running under a system account (for example, Local System or Network Service), the client cannot be impersonated when a secure session is established with stateful Security Context tokens. Eine Windows Forms- oder Konsolenanwendung wird in der Regel unter dem derzeit angemeldeten Konto ausgeführt, sodass für dieses Konto standardmäßig ein Identitätswechsel durchgeführt werden kann.A Windows Form or console application typically runs under the currently logged-in account, so that account can be impersonated by default. Wenn es sich bei dem Client jedoch um eine ASP.NETASP.NET -Seite handelt, die auf IIS 6.0IIS 6.0 oder IIS 7.0IIS 7.0gehostet wird, wird der Client standardmäßig unter dem Network Service -Konto ausgeführt.However, when the client is an ASP.NETASP.NET page and that page is hosted in IIS 6.0IIS 6.0 or IIS 7.0IIS 7.0, then the client does run under the Network Service account by default. Alle vom System bereitgestellten Bindungen, die Sicherheitssitzungen unterstützen, verwenden standardmäßig ein zustandsloses Token für den Sicherheitskontext.All of the system-provided bindings that support secure sessions use a stateless security context token (SCT) by default. Wenn es sich bei dem Client jedoch um eine ASP.NETASP.NET -Seite handelt und sichere Sitzungen mit zustandsbehafteten SCTs verwendet werden, kann kein Clientidentitätswechsel durchgeführt werden.However, if the client is an ASP.NETASP.NET page, and secure sessions with stateful SCTs are used, the client cannot be impersonated. Weitere Informationen finden Sie unterFor more information aboutVerwendung von zustandsbehafteten SCTs in einer sicheren Sitzung finden Sie unter Vorgehensweise: Erstellen Sie ein Sicherheitskontexttoken für eine Sicherheitssitzung. using stateful SCTs in a secure session, see How to: Create a Security Context Token for a Secure Session.

Identitätswechsel in einer Dienstmethode: Deklaratives ModellImpersonation in a Service Method: Declarative Model

Die meisten Identitätswechselszenarien umfassen das Ausführen der Dienstmethode im Aufruferkontext.Most impersonation scenarios involve executing the service method in the caller context. WCFWCF bietet eine Identitätswechselfunktion, die dies erleichtert, indem der Benutzer die Anforderung für den Identitätswechsel im OperationBehaviorAttribute -Attribut festlegen kann. provides an impersonation feature that makes this easy to do by allowing the user to specify the impersonation requirement in the OperationBehaviorAttribute attribute. Im folgenden Codebeispiel nimmt die WCFWCF -Infrastruktur die Identität des Aufrufers an, bevor die Hello -Methode ausgeführt wird.For example, in the following code, the WCFWCF infrastructure impersonates the caller before executing the Hello method. Jeder Versuch, auf die systemeigenen Ressourcen innerhalb der Hello -Methode zuzugreifen, ist nur erfolgreich, wenn die Zugriffsteuerungsliste der Ressource dem Aufrufer Zugriffsrechte erlaubt.Any attempt to access native resources inside the Hello method succeed only if the access control list (ACL) of the resource allows the caller access privileges. Zum Aktivieren des Identitätswechsels legen Sie die Impersonation-Eigenschaft auf einen der ImpersonationOption-Enumerationswerte fest, entweder auf ImpersonationOption.Required oder auf ImpersonationOption.Allowed, wie im folgenden Beispiel dargestellt.To enable impersonation, set the Impersonation property to one of the ImpersonationOption enumeration values, either ImpersonationOption.Required or ImpersonationOption.Allowed, as shown in the following example.

Hinweis

Wenn ein Dienst höhere Anmeldeinformationen besitzt als der Remoteclient, werden die Anmeldeinformationen des Diensts verwendet, wenn die Impersonation -Eigenschaft auf Allowedeingestellt ist.When a service has higher credentials than the remote client, the credentials of the service are used if the Impersonation property is set to Allowed. Wenn also ein Benutzer mit niedrigen Rechten seine Anmeldeinformationen angibt, führt ein Dienst mit höheren Rechten die Methode mit den Anmeldeinformationen des Diensts aus und kann Ressourcen verwenden, die der Benutzer mit den niedrigen Rechten sonst keinesfalls verwenden könnte.That is, if a low-privileged user provides its credentials, a higher-privileged service executes the method with the credentials of the service, and can use resources that the low-privileged user would otherwise not be able to use.

[ServiceContract]
public interface IHelloContract
{
    [OperationContract]
    string Hello(string message);
}

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        return "hello";
    }
}

<ServiceContract()>  _
Public Interface IHelloContract
    <OperationContract()>  _
    Function Hello(ByVal message As String) As String 
End Interface


Public Class HelloService
    Implements IHelloService
    
    <OperationBehavior(Impersonation := ImpersonationOption.Required)>  _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Return "hello"
    End Function 
End Class 

Die WCFWCF -Infrastruktur kann die Identität des Aufrufers nur annehmen, wenn der Aufrufer mit Anmeldeinformationen authentifiziert wird, die einem Windows-Benutzerkonto zugeordnet werden können.The WCFWCF infrastructure can impersonate the caller only if the caller is authenticated with credentials that can be mapped to a Windows user account. Wenn der Dienst für die Authentifizierung mit Anmeldeinformationen konfiguriert ist, die keinem Windows-Konto zugeordnet werden können, wird die Dienstmethode nicht ausgeführt.If the service is configured to authenticate using a credential that cannot be mapped to a Windows account, the service method is not executed.

Hinweis

Unter Windows XPWindows XPschlägt der Identitätswechsel beim Erstellen eines zustandsbehafteten SCT fehl, was zu einer InvalidOperationExceptionführt.On Windows XPWindows XP, impersonation fails if a stateful SCT is created, resulting in an InvalidOperationException. Weitere Informationen finden Sie unterFor more information, seeNicht unterstützte Szenarien. Unsupported Scenarios.

Identitätswechsel in einer Dienstmethode: Imperatives ModellImpersonation in a Service Method: Imperative Model

Mitunter benötigt ein Aufrufer nicht die gesamte Dienstmethode für den Identitätswechsel, sondern nur einen Teil der Methode.Sometimes a caller does not need to impersonate the entire service method to function, but for only a portion of it. In diesem Fall rufen Sie die Windows-Identität des Aufrufers innerhalb der Dienstmethode ab, und führen Sie den Identitätswechsel imperativ durch.In this case, obtain the Windows identity of the caller inside the service method and imperatively perform the impersonation. Verwenden Sie dazu die WindowsIdentity -Eigenschaft des ServiceSecurityContext , um eine Instanz der WindowsIdentity -Klasse zurückzugeben und die Impersonate -Methode vor dem Verwenden der Instanz aufzurufen.Do this by using the WindowsIdentity property of the ServiceSecurityContext to return an instance of the WindowsIdentity class and calling the Impersonate method before using the instance.

Hinweis

Stellen Sie sicher, dass Sie die Visual BasicVisual BasicUsing -Anweisung oder die C# using -Anweisung verwenden, um den Identitätswechsel automatisch rückgängig zu machen.Be sure to use the Visual BasicVisual BasicUsing statement or the C# using statement to automatically revert the impersonation action. Wenn Sie die Anweisung nicht verwenden oder wenn Sie eine andere Programmiersprache als Visual BasicVisual Basic oder C# verwenden, müssen Sie die Identitätswechselebene zurücksetzen.If you do not use the statement, or if you use a programming language other than Visual BasicVisual Basic or C#, be sure to revert the impersonation level. Wird dies versäumt, kann dies die Grundlage für Denial-of-Service-Angriffe und Rechteerweiterungsangriffe bilden.Failure to do this can form the basis for denial of service and elevation of privilege attacks.

public class HelloService : IHelloService
{
    [OperationBehavior]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity =
        ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
           ("The caller cannot be mapped to a WindowsIdentity");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            // Access a file as the caller.
        }
        return "Hello";
    }
}
Public Class HelloService
    Implements IHelloService
    
    <OperationBehavior()>  _
    Public Function Hello(ByVal message As String) As String _
       Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = _
            ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException( _
              "The caller cannot be mapped to a WindowsIdentity")
        End If
        Dim cxt As WindowsImpersonationContext = callerWindowsIdentity.Impersonate()
        Using (cxt)
             ' Access a file as the caller.
        End Using

        Return "Hello"
    
    End Function
End Class 

Identitätswechsel für alle DienstmethodenImpersonation for All Service Methods

In einigen Fällen müssen Sie alle Methoden eines Diensts im Kontext eines Aufrufers ausführen.In some cases, you must perform all the methods of a service in the caller’s context. Statt diese Funktion explizit für jede Methode einzeln zu aktivieren, verwenden Sie das ServiceAuthorizationBehavior.Instead of explicitly enabling this feature on a per-method basis, use the ServiceAuthorizationBehavior. Wie im folgenden Code dargestellt, legen Sie die ImpersonateCallerForAllOperations -Eigenschaft auf truefest.As shown in the following code, set the ImpersonateCallerForAllOperations property to true. Das ServiceAuthorizationBehavior wird aus den Verhaltenssammlungen der ServiceHost -Klasse abgerufen.The ServiceAuthorizationBehavior is retrieved from the collections of behaviors of the ServiceHost class. Beachten Sie außerdem, dass die Impersonation -Eigenschaft des auf jede Methode angewendeten OperationBehaviorAttribute ebenfalls entweder auf Allowed oder Requiredeingestellt sein muss.Also note that the Impersonation property of the OperationBehaviorAttribute applied to each method must also be set to either Allowed or Required.

// Code to create a ServiceHost not shown.
ServiceAuthorizationBehavior MyServiceAuthoriationBehavior = 
    serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
MyServiceAuthoriationBehavior.ImpersonateCallerForAllOperations = true;
' Code to create a ServiceHost not shown.
Dim MyServiceAuthoriationBehavior As ServiceAuthorizationBehavior 
MyServiceAuthoriationBehavior= serviceHost.Description.Behaviors.Find _
(Of ServiceAuthorizationBehavior)()
MyServiceAuthoriationBehavior.ImpersonateCallerForAllOperations = True

In der folgenden Tabelle wird das WCFWCF -Verhalten für alle möglichen Kombinationen aus ImpersonationOption und ImpersonateCallerForAllServiceOperationsbeschrieben.The following table describes WCFWCF behavior for all possible combinations of ImpersonationOption and ImpersonateCallerForAllServiceOperations.

ImpersonationOption ImpersonateCallerForAllServiceOperations VerhaltenBehavior
ErforderlichRequired n/vn/a WCFWCF nimmt die Identität des Aufrufers an impersonates the caller
AllowedAllowed Falsefalse WCFWCF nimmt die Identität des Aufrufers nicht an does not impersonate the caller
AllowedAllowed truetrue WCFWCF nimmt die Identität des Aufrufers an impersonates the caller
NotAllowedNotAllowed Falsefalse WCFWCF nimmt die Identität des Aufrufers nicht an does not impersonate the caller
NotAllowedNotAllowed truetrue Disallowed.Disallowed. (Eine InvalidOperationException wird ausgelöst.)(An InvalidOperationException is thrown.)

Identitätswechselebene aus Windows-Anmeldeinformationen und Identitätswechsel mit im Cache gespeichertem TokenImpersonation Level Obtained from Windows Credentials and Cached Token Impersonation

In einigen Szenarien besitzt der Client eine Teilkontrolle über die Ebene des Identitätswechsels, den der Dienst bei Verwendung von Windows-Clientanmeldeinformationen ausführt.In some scenarios the client has partial control over the level of impersonation the service performs when a Windows client credential is used. Ein Szenario tritt auf, wenn der Client die Identitätswechselebene "Anonymous" angibt.One scenario occurs when the client specifies an Anonymous impersonation level. Das andere Szenario liegt vor, wenn Sie einen Identitätswechsel mit einem im Cache gespeicherten Token ausführen.The other occurs when performing impersonation with a cached token. Legen Sie hierfür die AllowedImpersonationLevel -Eigenschaft der WindowsClientCredential -Klasse fest, auf die als Eigenschaft der generischen ChannelFactory<TChannel> -Klasse zugegriffen wird.This is done by setting the AllowedImpersonationLevel property of the WindowsClientCredential class, which is accessed as a property of the generic ChannelFactory<TChannel> class.

Hinweis

Durch Angeben der Identitätswechselebene "Anonymous" meldet sich der Client anonym beim Dienst an.Specifying an impersonation level of Anonymous causes the client to log on to the service anonymously. Der Dienst muss daher anonyme Anmeldungen zulassen, unabhängig davon, ob ein Identitätswechsel durchgeführt wird.The service must therefore allow anonymous logons, regardless of whether impersonation is performed.

Der Client kann die Identitätswechselebene als Anonymous, Identification, Impersonationoder Delegationangeben.The client can specify the impersonation level as Anonymous, Identification, Impersonation, or Delegation. Es wird nur ein Token auf der angegebenen Ebene erstellt, wie im folgenden Code veranschaulicht.Only a token at the specified level is produced, as shown in the following code.

ChannelFactory<IEcho> cf = new ChannelFactory<IEcho>("EchoEndpoint");
cf.Credentials.Windows.AllowedImpersonationLevel  = 
    System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim cf As ChannelFactory(Of IEcho) = New ChannelFactory(Of IEcho)("EchoEndpoint")
cf.Credentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Impersonation

In der folgenden Tabelle wird die Identitätswechselebene angegeben, die der Dienst bei einem Identitätswechsel mit einem im Cache gespeicherten Token erhält.The following table specifies the impersonation level the service obtains when impersonating from a cached token.

AllowedImpersonationLevel -WertAllowedImpersonationLevel value Der Dienst hat das SeImpersonatePrivilegeService has SeImpersonatePrivilege Dienst und Client sind delegierungsfähig.Service and client are capable of delegation ImpersonationLevelCached token ImpersonationLevel
AnonymAnonymous JaYes n/vn/a IdentitätswechselImpersonation
AnonymAnonymous NeinNo n/vn/a IdentifikationIdentification
IdentifikationIdentification n/vn/a n/vn/a IdentifikationIdentification
IdentitätswechselImpersonation JaYes n/vn/a IdentitätswechselImpersonation
IdentitätswechselImpersonation NeinNo n/vn/a IdentifikationIdentification
DelegierungDelegation JaYes JaYes DelegierungDelegation
DelegierungDelegation JaYes NeinNo IdentitätswechselImpersonation
DelegierungDelegation NeinNo n/vn/a IdentifikationIdentification

Identitätswechselebene aus Benutzernamen-Anmeldeinformationen und Identitätswechsel mit im Cache gespeichertem TokenImpersonation Level Obtained from User Name Credentials and Cached Token Impersonation

Durch Weitergabe des Benutzernamens und Kennworts an den Dienst ermöglicht ein Client WCFWCF, sich als dieser Benutzer anzumelden. Dies entspricht einem Festlegen der AllowedImpersonationLevel-Eigenschaft auf Delegation.By passing the service its user name and password, a client enables WCFWCF to log on as that user, which is equivalent to setting the AllowedImpersonationLevel property to Delegation. (Die AllowedImpersonationLevel ist in der WindowsClientCredential-Klasse und in der HttpDigestClientCredential-Klasse verfügbar.) In der folgenden Tabelle wird die Identitätswechselebene angegeben, die erhalten wird, wenn der Dienst Benutzernamen-Anmeldeinformationen empfängt.(The AllowedImpersonationLevel is available on the WindowsClientCredential and HttpDigestClientCredential classes.) The following table provides the impersonation level obtained when the service receives user name credentials.

AllowedImpersonationLevel Der Dienst hat das SeImpersonatePrivilegeService has SeImpersonatePrivilege Dienst und Client sind delegierungsfähig.Service and client are capable of delegation ImpersonationLevelCached token ImpersonationLevel
n/vn/a JaYes JaYes DelegierungDelegation
n/vn/a JaYes NeinNo IdentitätswechselImpersonation
n/vn/a NeinNo n/vn/a IdentifikationIdentification

Identitätswechselebene aus einem auf S4U basierenden IdentitätswechselImpersonation Level Obtained from S4U-Based Impersonation

Der Dienst hat das SeTcbPrivilegeService has SeTcbPrivilege Der Dienst hat das SeImpersonatePrivilegeService has SeImpersonatePrivilege Dienst und Client sind delegierungsfähig.Service and client are capable of delegation ImpersonationLevel mit im Cache gespeichertem TokenCached token ImpersonationLevel
JaYes JaYes n/vn/a IdentitätswechselImpersonation
JaYes NeinNo n/vn/a IdentifikationIdentification
NeinNo n/vn/a n/vn/a IdentifikationIdentification

Zuordnen eines Clientzertifikats zu einem Windows-KontoMapping a Client Certificate to a Windows Account

Ein Client kann sich gegenüber einem Dienst mithilfe eines Zertifikats ausweisen; der Dienst kann angewiesen werden, den Client mittels Active Directory einem vorhandenen Konto zuzuordnen.It is possible for a client to authenticate itself to a service using a certificate, and to have the service map the client to an existing account through Active Directory. Im folgenden XML wird gezeigt, wie der Dienst so konfiguriert wird, dass er das Zertifikat zuordnet:The following XML shows how to configure the service to map the certificate.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="MapToWindowsAccount">  
      <serviceCredentials>  
        <clientCertificate>  
          <authentication mapClientCertificateToWindowsAccount="true" />  
        </clientCertificate>  
      </serviceCredentials>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Im folgenden Code wird gezeigt, wie der Dienst konfiguriert wird:The following code shows how to configure the service.

// Create a binding that sets a certificate as the client credential type.  
WSHttpBinding b = new WSHttpBinding();  
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;  

// Create a service host that maps the certificate to a Windows account.  
Uri httpUri = new Uri("http://localhost/Calculator");  
ServiceHost sh = new ServiceHost(typeof(HelloService), httpUri);  
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = true;  

DelegierungDelegation

Damit ein Dienst an einen Back-End-Dienst delegiert werden kann, muss er sich gegenüber dem Back-End-Dienst mittels bilateraler (SSPI ohne Rückgriff auf NTLM) oder direkter Kerberos-Authentifizierung unter Verwendung der Windows-Identität des Clients authentifizieren.To delegate to a back-end service, a service must perform Kerberos multi-leg (SSPI without NTLM fallback) or Kerberos direct authentication to the back-end service using the client’s Windows identity. Um einen Dienst an einen Back-End-Dienst zu delegieren, erstellen Sie eine ChannelFactory<TChannel> und einen Kanal und leiten die Kommunikation über diesen Kanal, solange die Identität des Clients angenommen wird.To delegate to a back-end service, create a ChannelFactory<TChannel> and a channel, and then communicate through the channel while impersonating the client. Bei dieser Form der Delegierung hängt die maximale Entfernung zwischen Back-End-Dienst und Front-End-Dienst von der Identitätswechselebene des Front-End-Diensts ab.With this form of delegation, the distance at which the back-end service can be located from the front-end service depends on the impersonation level achieved by the front-end service. Wenn die Identitätswechselebene Impersonationfestgelegt wird, müssen Front-End- und Back-End-Dienst auf dem gleichen Computer ausgeführt werden.When the impersonation level is Impersonation, the front-end and back-end services must be running on the same machine. Wenn die Identitätswechselebene Delegationverwendet wird, können Front-End- und Back-End-Dienst auf unterschiedlichen Computern oder dem gleichen Computer ausgeführt werden.When the impersonation level is Delegation, the front-end and back-end services can be on separate machines or on the same machine. Ein Identitätswechsel auf Delegierungsebene erfordert, dass die Windows-Domänenrichtlinie entsprechend konfiguriert wurde, um eine Delegierung zuzulassen.Enabling delegation-level impersonation requires that Windows domain policy be configured to permit delegation. Weitere Informationen zum Konfigurieren von Active Directory für die Delegierung finden Sie unter Enabling Delegated Authentication.For more information about configuring Active Directory for delegation support, see Enabling Delegated Authentication.

Hinweis

Wenn sich der Client dem Front-End-Dienst gegenüber mit einem Benutzernamen und einem Kennwort authentifiziert, die einem Windows-Konto für den Back-End-Dienst entsprechen, dann kann sich der Front-End-Dienst durch erneute Angabe des Benutzernamens und des Kennworts des Clients dem Back-End-Dienst gegenüber authentifizieren.When a client authenticates to the front-end service using a user name and password that correspond to a Windows account on the back-end service, the front-end service can authenticate to the back-end service by reusing the client’s user name and password. Dies ist eine besonders mächtige Form der Identitätsübergabe, weil die Weitergabe von Benutzernamen und Kennwort an den Back-End-Dienst diesen in die Lage versetzt, einen Identitätswechsel durchzuführen. Weil Kerberos nicht verwendet wird, stellt dieser Vorgang jedoch keine Delegierung dar.This is a particularly powerful form of identity flow, because passing user name and password to the back-end service enables the back-end service to perform impersonation, but it does not constitute delegation because Kerberos is not used. Die Delegierung betreffende Active Directory-Steuerelemente gelten nicht für die Authentifizierung durch Benutzername und Kennwort.Active Directory controls on delegation do not apply to user name and password authentication.

Delegierungsfähigkeit als Funktion der IdentitätswechselebeneDelegation Ability as a Function of Impersonation Level

Ebene des IdentitätswechselsImpersonation level Dienst kann eine prozessübergreifende Delegierung ausführenService can perform cross-process delegation Dienst kann eine computerübergreifende Delegierung ausführenService can perform cross-machine delegation
Identification NeinNo NeinNo
Impersonation JaYes NeinNo
Delegation JaYes JaYes

Im folgenden Codebeispiel wird die Verwendung der Delegierung veranschaulicht.The following code example demonstrates how to use delegation.

public class HelloService : IHelloService
{
    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string Hello(string message)
    {
        WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
        if (callerWindowsIdentity == null)
        {
            throw new InvalidOperationException
             ("The caller cannot be mapped to a Windows identity.");
        }
        using (callerWindowsIdentity.Impersonate())
        {
            EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
            // Any binding that performs Windows authentication of the client can be used.
            ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
            IHelloService channel = channelFactory.CreateChannel();
            return channel.Hello(message);
        }
    }
}
Public Class HelloService
    Implements IHelloService

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
        Dim callerWindowsIdentity As WindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity
        If (callerWindowsIdentity Is Nothing) Then
            Throw New InvalidOperationException("The caller cannot be mapped to a Windows identity.")
        End If

        Dim backendServiceAddress As EndpointAddress = New EndpointAddress("http://localhost:8000/ChannelApp")
        ' Any binding that performs Windows authentication of the client can be used.
        Dim channelFactory As ChannelFactory(Of IHelloService) = _
          New ChannelFactory(Of IHelloService)(New NetTcpBinding(), backendServiceAddress)
        Dim channel As IHelloService = channelFactory.CreateChannel()
        Return channel.Hello(message)
    End Function
End Class

Konfigurieren einer Anwendung für die Verwendung der eingeschränkten DelegierungHow to Configure an Application to Use Constrained Delegation

Die eingeschränkte Delegierung kann erst verwendet werden, nachdem Absender, Empfänger und Domänencontroller entsprechend konfiguriert wurden.Before you can use constrained delegation, the sender, receiver, and the domain controller must be configured to do so. Die folgende Prozedur listet die Schritte auf, die eine eingeschränkte Delegierung ermöglichen.The following procedure lists the steps that enable constrained delegation. Nähere Angaben zu den Unterschieden zwischen Delegierung und eingeschränkter Delegierung finden Sie in dem Abschnitt unter Windows Server 2003 Kerberos Extensions , der sich mit eingeschränkter Delegierung befasst (Seite möglicherweise auf Englisch).For details about the differences between delegation and constrained delegation, see the portion of Windows Server 2003 Kerberos Extensions that discusses constrained discussion.

  1. Deaktivieren Sie auf dem Domänencontroller das Kontrollkästchen Konto ist vertraulich und kann nicht delegiert werden für das Konto, unter dem die Clientanwendung ausgeführt wird.On the domain controller, clear the Account is sensitive and cannot be delegated check box for the account under which the client application is running.

  2. Aktivieren Sie auf dem Domänencontroller das Kontrollkästchen Konto wird für Delegierungszwecke vertraut für das Konto, unter dem die Clientanwendung ausgeführt wird.On the domain controller, select the Account is trusted for delegation check box for the account under which the client application is running.

  3. Konfigurieren Sie auf dem Domänencontroller den Computer der mittleren Schicht, sodass diesem für Delegierungszwecke vertraut wird, indem Sie auf die Option Computer für Delegierungszwecke vertrauen klicken.On the domain controller, configure the middle tier computer so that it is trusted for delegation, by clicking the Trust computer for delegation option.

  4. Konfigurieren Sie auf dem Domänencontroller den Computer der mittleren Schicht für die Verwendung der eingeschränkten Delegierung, indem Sie auf die Option Computer nur für Delegierungszwecke angegebener Dienste vertrauen klicken.On the domain controller, configure the middle tier computer to use constrained delegation, by clicking the Trust this computer for delegation to specified services only option.

Ausführlichere Anweisungen zum Konfigurieren der eingeschränkten Delegierung finden Sie in den folgenden MSDN-Themen:For more detailed instructions about configuring constrained delegation, see the following topics on MSDN:

Siehe auchSee Also

OperationBehaviorAttribute
Impersonation
ImpersonationOption
WindowsIdentity
ServiceSecurityContext
WindowsIdentity
ServiceAuthorizationBehavior
ImpersonateCallerForAllOperations
ServiceHost
AllowedImpersonationLevel
WindowsClientCredential
ChannelFactory<TChannel>
Identification
Verwenden von Identitätswechsel mit TransportsicherheitUsing Impersonation with Transport Security
Durchführen eines Identitätswechsels für den ClientImpersonating the Client
Vorgehensweise: Annahme der Clientidentität durch einen DienstHow to: Impersonate a Client on a Service
ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)