Sichern von ClientsSecuring Clients

In Windows Communication Foundation (WCF), schreibt der Dienst die sicherheitsanforderungen für Clients vor.In Windows Communication Foundation (WCF), the service dictates the security requirements for clients. d. h. der Dienst legt fest, welcher Sicherheitsmodus verwendet wird und ob der Client Anmeldeinformationen angeben muss oder nicht.That is, the service specifies what security mode to use, and whether or not the client must provide a credential. Der Sicherungsvorgang an einem Client ist also unkompliziert: Man verwendet einfach die vom Dienst erhaltenen Metadaten (sofern diese veröffentlicht wurden) und erstellt einen Client.The process of securing a client, therefore, is simple: use the metadata obtained from the service (if it is published) and build a client. Die Metadaten geben an, wie der Client konfiguriert wird.The metadata specifies how to configure the client. Wenn der Dienst erfordert, dass der Client Anmeldeinformationen angibt, müssen Sie Anmeldeinformationen erhalten, die die Anforderung erfüllen.If the service requires that the client supply a credential, then you must obtain a credential that fits the requirement. Dieses Thema beschreibt den Vorgang ausführlicher.This topic discusses the process in further detail. Weitere Informationen zur Erstellung eines sicheren Diensts finden Sie unter Sichern von Services.For more information about creating a secure service, see Securing Services.

Der Dienst legt die Sicherheit festThe Service Specifies Security

Standardmäßig haben WCF-Bindungen aktivierte Sicherheitsfunktionen auf.By default, WCF bindings have security features enabled. (Die Ausnahme ist BasicHttpBinding.) Wenn der Dienst mithilfe von WCF erstellt wurde, besteht daher möglicherweise, dass sie Sicherheit zur Authentifizierung, Vertraulichkeit und Integrität sicherzustellen implementiert.(The exception is the BasicHttpBinding.) Therefore, if the service was created using WCF, there is a greater chance that it will implement security to ensure authentication, confidentiality, and integrity. In diesem Fall geben die vom Dienst bereitgestellten Metadaten an, was für den Aufbau eines sicheren Kommunikationskanals erforderlich ist.In that case, the metadata the service provides will indicate what it requires to establish a secure communication channel. Wenn die Dienstmetadaten keine Sicherheitsanforderungen enthalten, gibt es keine Möglichkeit, einem Dienst ein Sicherheitsschema wie Secure Sockets Layer (SSL) über HTTP aufzuerlegen.If the service metadata does not include any security requirements, there is no way to impose a security scheme, such as Secure Sockets Layer (SSL) over HTTP, on a service. Wenn jedoch der Dienst erfordert, dass der Client Anmeldeinformationen liefert, muss der Entwickler, Bereitsteller oder Administrator des Clients genau diejenigen Anmeldeinformationen liefern, die der Client zur Authentifizierung gegenüber dem Dienst nutzen wird.If, however, the service requires the client to supply a credential, then the client developer, deployer, or administrator must supply the actual credential that the client will use to authenticate itself to the service.

Erlangen von MetadatenObtaining Metadata

Beim Erstellen eines Clients besteht der erste Schritt darin, die Metadaten für den Dienst zu erlangen, die der Client für die Kommunikation nutzen wird.When creating a client, the first step is to obtain the metadata for the service that the client will communicate with. Dazu gibt es zwei Möglichkeiten.This can be done in two ways. Zuerst, wenn der Dienst einen Metadatenaustausch (MEX)-Endpunkt veröffentlicht oder seine Metadaten über HTTP oder HTTPS verfügbar macht, Sie können die Metadaten mit den ServiceModel Metadata Utility Tool (Svcutil.exe), wodurch generiert sowohl die Codedateien für einen Client als auch eine Konfigurationsdatei.First, if the service publishes a metadata exchange (MEX) endpoint or makes its metadata available over HTTP or HTTPS, you can download the metadata using the ServiceModel Metadata Utility Tool (Svcutil.exe), which generates both code files for a client as well as a configuration file. (Weitere Informationen zur Verwendung des Tools finden Sie unter beim Zugriff auf Dienste, die mithilfe eines WCF-Clients.) Wenn der Dienst keinen MEX-Endpunkt veröffentlicht und keine Metadaten über HTTP oder HTTPS zur Verfügung stellt, müssen Sie den Dienstersteller um Dokumentation bitten, die die Sicherheitsanforderungen und die Metadaten beschreibt.(For more information about using the tool, see Accessing Services Using a WCF Client.) If the service does not publish a MEX endpoint and also does not make its metadata available over HTTP or HTTPS, you must contact the service creator for documentation that describes the security requirements and the metadata.

Wichtig

Sie sollten darauf achten, dass die Metadaten von einer vertrauenswürdigen Quelle stammen und dass sie nicht manipuliert wurden.It is recommended that the metadata come from a trusted source and that it not be tampered with. Über das HTTP-Protokoll abgerufene Metadaten werden im Klartext gesendet und können manipuliert werden.Metadata retrieved using the HTTP protocol is sent in clear text and can be tampered with. Wenn der Dienst die Eigenschaften HttpsGetEnabled und HttpsGetUrl verwendet, verwenden Sie den URL, den der Dienstersteller geliefert hat, um die Daten über das HTTPS-Protokoll herunterzuladen.If the service uses the HttpsGetEnabled and HttpsGetUrl properties, use the URL the service creator supplied to download the data using the HTTPS protocol.

Überprüfen von SicherheitValidating Security

Metadatenquellen können in zwei grundlegende Kategorien aufgeteilt werden: vertrauenswürdige Quellen und nicht vertrauenswürdige Quellen.Metadata sources can be divided into two broad categories: trust sources and untrusted sources. Wenn Sie einer Quelle vertrauen und den Clientcode und andere Metadaten vom sicheren MEX-Endpunkt der Quelle heruntergeladen haben, können Sie den Client erstellen, ihm die korrekten Anmeldeinformationen zuweisen und ihn ohne Bedenken ausführen.If you trust a source and have downloaded the client code and other metadata from that source's secure MEX endpoint, then you can build the client, supply it with the right credentials, and run it with no other concerns.

Wenn Sie sich jedoch für ein Herunterladen eines Clients und von Metadaten von einer Quelle entscheiden, über die Sie nur wenig wissen, sollten Sie die vom Code verwendetenSicherheitsmaßnahmen überprüfen.However, if you elect to download a client and metadata from a source that you know little about, be sure to validate the security measures the code uses. Sie dürfen beispielsweise nicht einfach einen Client erstellen, der Ihre persönlichen oder finanziellen Daten an einen Dienst sendet, sofern der Dienst nicht zumindesten Vertraulichkeit und Integrität erfordert.For example, you must not simply create a client that sends your personal or financial information to a service unless the service demands confidentiality and integrity (at the very least). Sie sollten dem Besitzer des Diensts soweit vertrauen, dass Sie bereit sind, Daten dieser Art an ihn weiterzugeben, da er auf sie zugreifen kann.You should trust the owner of the service to the extent that you are willing to disclose such information because such information will be visible to him or her.

Als Regel sollten Sie daher, wenn Sie Code und Metadaten von einer nicht vertrauenswürdigen Quelle verwenden, den Code und die Metadaten überprüfen, um sicherzustellen, dass sie das von Ihnen benötigte Sicherheitsniveau erfüllen.As a rule, therefore, when using code and metadata from an untrusted source, check the code and metadata to ensure that it meets the security level that you require.

Festlegen von ClientanmeldeinformationenSetting a Client Credential

Das Festlegen von Clientanmeldeinformationen auf einem Client erfolgt in zwei Schritten:Setting a client credential on a client consists of two steps:

  1. Bestimmen der Clientanmeldeinformationstyp den Dienst erforderlich sind.Determine the client credential type the service requires. Dies wird durch eine der folgenden beiden Methoden erreicht.This is accomplished by one of two methods. Erstens: Wenn Sie Dokumentation vom Dienstersteller besitzen, sollte diese den Typ der Clientanmeldeinformation (sofern vorhanden) angeben, der vom Dienst gefordert wird.First, if you have documentation from the service creator, it should specify the client credential type (if any) the service requires. Zweitens: Wenn Sie nur eine vom Svcutil.exe-Tool erstellte Konfigurationsdatei besitzen, können Sie die einzelnen Bindungen untersuchen, um herauszufinden, welcher Typ von Anmeldeinformationen benötigt wird.Second, if you have only a configuration file generated by the Svcutil.exe tool, you can examine the individual bindings to determine what credential type is required.

  2. Geben Sie tatsächliche Clientanmeldeinformationen an.Specify an actual client credential. Die tatsächlichen Clientanmeldeinformationen heißt ein clientanmeldeinformationswert zur Unterscheidung von den Typ.The actual client credential is called a client credential value to distinguish it from the type. Wenn der Typ der Clientanmeldeinformationen beispielsweise ein Zertifikat angibt, müssen Sie ein X.509-Zertifikat bereitstellen, das von einer Zertifizierungsstelle ausgestellt wurde, der der Dienst vertraut.For example, if the client credential type specifies a certificate, you must supply an X.509 certificate that is issued by a certification authority the service trusts.

Bestimmen des Typs der ClientanmeldeinformationenDetermining the Client Credential Type

Wenn Sie die Konfiguration, sehen Sie das Tool Svcutil.exe generierten Datei haben die <Bindungen > Abschnitt aus, um zu bestimmen, welcher Typ von Anmeldeinformationen erforderlich ist.If you have the configuration file the Svcutil.exe tool generated, examine the <bindings> section to determine what client credential type is required. Innerhalb des Abschnitts befinden sich Bindungselemente, die die Sicherheitsanforderungen angeben.Within the section are binding elements that specify the security requirements. Untersuchen Sie besonders die <Sicherheit >-Element jeder Bindung.Specifically, examine the <security> Element of each binding. Zu diesem Element gehört das Attribut mode, das Sie auf einen von drei möglichen Werten festlegen können (Message, Transport oder TransportWithMessageCredential).That element includes the mode attribute, which you can set to one of three possible values (Message, Transport, or TransportWithMessageCredential). Der Wert des Attributs bestimmt den Modus, und der Modus legt fest, welches der untergeordneten Elemente von Bedeutung ist.The value of the attribute determines the mode, and the mode determines which of the child elements is significant.

Die <security> Element kann entweder enthalten eine <transport> oder <message> -Element oder beides.The <security> element can contain either a <transport> or <message> element, or both. Das bedeutende Element ist dasjenige, das dem Sicherheitsmodus entspricht.The significant element is the one that matches the security mode. Der folgende Code gibt beispielsweise an, dass der Sicherheitsmodus "Message" und der Typ der Clientanmeldeinformationen für das Element <message> "Certificate" ist.For example, the following code specifies that the security mode is "Message", and the client credential type for the <message> element is "Certificate". In diesem Fall kann das Element <transport> ignoriert werden.In this case, the <transport> element can be ignored. Das Element <message> legt jedoch fest, dass ein X.509-Zertifikat angegeben werden muss.However, the <message> element specifies that an X.509 certificate must be supplied.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"   
                      realm="" />  
           <message clientCredentialType="Certificate"   
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"   
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Wenn das Attribut clientCredentialType auf "Windows" festgelegt ist (siehe folgendes Beispiel), müssen Sie keinen tatsächlichen Wert der Anmeldeinformationen liefern.Note that if the clientCredentialType attribute is set to "Windows", as shown in the following example, you do not need to supply an actual credential value. Dies liegt daran, dass die in Windows integrierte Sicherheit die tatsächlichen Anmeldeinformationen (ein Kerberos-Token) der Person liefert, die den Client ausführt.This is because the Windows integrated security provides the actual credential (a Kerberos token) of the person who is running the client.

<security mode="Message">  
    <transport clientCredentialType="Windows "   
        realm="" />  
</security>  

Festlegen des Werts der ClientanmeldeinformationenSetting the Client Credential Value

Wenn bestimmt wird, dass der Client Anmeldeinformationen liefern muss, müssen Sie die richtige Methode zum Konfigurieren des Clients verwenden.If it is determined that the client must supply a credential, use the appropriate method to configure the client. Wenden Sie z. B. zum Festlegen eines Clientzertifikats die Methode SetCertificate an.For example, to set a client certificate, use the SetCertificate method.

Eine gebräuchliche Form von Anmeldeinformationen ist das X.509-Zertifikat.A common form of credential is the X.509 certificate. Sie können die Anmeldeinformationen auf zwei Arten bereitstellen:You can supply the credential in two ways:

  • Durch Programmieren in Ihren Clientcode (über die Methode SetCertificate).By programming it in your client code (using the SetCertificate method).

Durch Hinzufügen einer <Verhalten > Abschnitt der Konfigurationsdatei für den Client und Verwenden der clientCredentials Element (siehe unten).By adding a <behaviors> section of the configuration file for the client and using the clientCredentials element (shown below).

Festlegen einer <ClientCredentials > Werts in CodeSetting a <clientCredentials> Value in Code

Festlegen einer <ClientCredentials > Wert in Code können Sie Zugriff auf die ClientCredentials Eigenschaft des der ClientBase<TChannel> Klasse.To set a <clientCredentials> value in code, you must access the ClientCredentials property of the ClientBase<TChannel> class. Die Eigenschaft gibt ein ClientCredentials-Objekt zurück, das Zugriff auf verschiedene Typen von Anmeldeinformationen zulässt (siehe Tabelle unten).The property returns a ClientCredentials object that allows access to various credential types, as shown in the following table.

ClientCredential-EigenschaftClientCredential Property BeschreibungDescription HinweiseNotes
ClientCertificate Gibt X509CertificateInitiatorClientCredential zurück.Returns an X509CertificateInitiatorClientCredential Stellt ein X.509-Zertifikat dar, das vom Client geliefert wird, um sich selbst am Dienst zu authentifizieren.Represents an X.509 certificate provided by the client to authenticate itself to the service.
HttpDigest Gibt HttpDigestClientCredential zurück.Returns an HttpDigestClientCredential Stellt HTTP-Hashwert-Anmeldeinformationen dar.Represents an HTTP digest credential. Die Anmeldeinformationen sind ein Hash des Benutzernamens und des Kennworts.The credential is a hash of the user name and password.
IssuedToken Gibt IssuedTokenClientCredential zurück.Returns an IssuedTokenClientCredential Stellt ein benutzerdefiniertes Sicherheitstoken dar, das von einem Sicherheitstokendienst ausgegeben wird und normalerweise in Verbundszenarien verwendet wird.Represents a custom security token issued by a Security Token Service, commonly used in federation scenarios.
Peer Gibt PeerCredential zurück.Returns a PeerCredential Stellt auf einer Windows-Domäne Peeranmeldeinformationen für die Teilnahme in einem Peernetz dar.Represents a Peer credential for participation in a Peer mesh on a Windows domain.
ServiceCertificate Gibt X509CertificateRecipientClientCredential zurück.Returns an X509CertificateRecipientClientCredential Stellt ein X.509-Zertifikat dar, das vom Dienst in einer Out-of-Band-Aushandlung geliefert wurde.Represents an X.509 certificate provided by the service in an out-of-band negotiation.
UserName Gibt UserNamePasswordClientCredential zurück.Returns a UserNamePasswordClientCredential Stellt eine Kombination aus Benutzername und Kennwort dar.Represents a user name and password pair.
Windows Gibt WindowsClientCredential zurück.Returns a WindowsClientCredential Stellt Windows-Clientanmeldeinformationen (Kerberos-Anmeldeinformationen) dar.Represents a Windows client credential (a Kerberos credential). Die Eigenschaften der Klasse sind schreibgeschützt.The properties of the class are read-only.

Festlegen einer <ClientCredentials > Wert in der KonfigurationSetting a <clientCredentials> Value in Configuration

Anmeldeinformationswerte gemäß unter Verwendung eines Endpunktverhaltens als untergeordnete Elemente von der <ClientCredentials > Element.Credential values are specified by using an endpoint behavior as child elements of the <clientCredentials> element. Das verwendete Element hängt vom Typ der Clientanmeldeinformationen ab.The element used depends on the client credential type. Das folgende Beispiel zeigt z. B. die Konfiguration festzulegende ein x. 509-Zertifikat mit dem <<ClientCertificate >.For example, the following example shows the configuration to set an X.509 certificate using the <<clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>  
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"   
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>              
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Um die Clientanmeldeinformationen in der Konfiguration festzulegen, fügen eine <EndpointBehaviors > Element der Konfigurationsdatei.To set the client credential in configuration, add an <endpointBehaviors> element to the configuration file. Darüber hinaus muss die hinzugefügte verhaltenselement verknüpft werden, an den Dienst-Endpunkt mithilfe der behaviorConfiguration Attribut des der <Endpunkt > Element, wie im folgenden Beispiel gezeigt.Additionally, the added behavior element must be linked to the service's endpoint using the behaviorConfiguration attribute of the <endpoint> element as shown in the following example. Der Wert des behaviorConfiguration-Attributs muss dem Wert des Verhaltensattributs name entsprechen.The value of the behaviorConfiguration attribute must match the value of the behavior name attribute.

<configuration>

<system.serviceModel>

<client>

<endpoint address="http://localhost/servicemodelsamples/service.svc"

binding="wsHttpBinding"

bindingConfiguration="Binding1"

behaviorConfiguration="myEndpointBehavior"

contract="Microsoft.ServiceModel.Samples.ICalculator" />

</client>

</system.serviceModel>

</configuration>

Hinweis

Einige der Werte der Clientanmeldeinformationen können nicht über Anwendungskonfigurationsdateien festgelegt werden, u. a. der Benutzername und das Kennwort oder die Werte für den Windows-Benutzer und das Windows-Kennwort.Some of the client credential values cannot be set using application configuration files, for example, user name and password, or Windows user and password values. Solche Werte für die Anmeldeinformationen können nur im Code angegeben werden.Such credential values can be specified only in code.

Weitere Informationen zu den Clientanmeldeinformationen festlegen, finden Sie unter Vorgehensweise: Angeben der Clientanmeldeinformationswerte.For more information about setting the client credential, see How to: Specify Client Credential Values.

Hinweis

ClientCredentialType wird ignoriert, wenn SecurityMode auf "TransportWithMessageCredential", festgelegt wird (siehe Beispielkonfiguration unten).ClientCredentialType is ignored when SecurityMode is set to "TransportWithMessageCredential", as shown in the following sample configuration.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"   
               establishSecurityContext="false"    
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Siehe auchSee Also

ClientCredentials
ClientBase<TChannel>
ClientCredentials
HttpsGetEnabled
HttpsGetUrl
<bindings><bindings>
Configuration Editor-Tool (SvcConfigEditor.exe)Configuration Editor Tool (SvcConfigEditor.exe)
Sichern von DienstenSecuring Services
Zugreifen auf Dienste mithilfe eines WCF-ClientsAccessing Services Using a WCF Client
Vorgehensweise: Angeben der ClientanmeldeinformationswerteHow to: Specify Client Credential Values
ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)
Vorgehensweise: Angeben des Typs von ClientanmeldeinformationenHow to: Specify the Client Credential Type