Vorgehensweise: Angeben der Clientanmeldeinformationswerte

Mithilfe von Windows Communication Foundation (WCF) kann der Dienst angeben, wie ein Client beim Dienst authentifiziert wird. Ein Dienst kann beispielsweise festlegen, dass der Client mit einem Zertifikat authentifiziert wird.

So bestimmen Sie den Typ der Clientanmeldeinformationen

  1. Rufen Sie die Metadaten aus dem Metadatenendpunkt des Diensts ab. Die Metadaten umfassen in der Regel zwei Dateien: den Clientcode in der Programmiersprache Ihrer Wahl (die Standardeinstellung ist Visual C#) und eine XML-Konfigurationsdatei. Eine Möglichkeit zum Abrufen der Metadaten ist, das Tool "Svcutil.exe" zu verwenden, um den Clientcode und die Clientkonfiguration zurückzugeben. Weitere Informationen finden Sie unter Abrufen von Metadaten und ServiceModel Metadata Utility Tool (Svcutil.exe).

  2. Öffnen Sie die XML-Konfigurationsdatei. Wenn Sie das Tool "Svcutil.exe" verwenden, lautet der Standardname der Datei "Output.config".

  3. Suchen Sie nach dem <security>-Element mit dem mode-Attribut (<security mode =MessageOrTransport> where MessageOrTransport auf einen der Sicherheitsmodi festgelegt ist.

  4. Suchen Sie nach dem untergeordneten Element, das dem Moduswert entspricht. Wenn der Modus beispielsweise auf Nachricht festgelegt ist, suchen Sie nach dem <message>-Element, das im <security>-Element enthalten ist.

  5. Beachten Sie den Wert, der dem clientCredentialType-Attribut zugeordnet ist. Der tatsächliche Wert hängt davon ab, welcher Modus verwendet wird: Transport oder Nachricht.

Der folgende XML-Code veranschaulicht die Konfiguration für einen Client, der die Nachrichtensicherheit verwendet und ein Zertifikat zum Authentifizieren des Clients erfordert.

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
     <message clientCredentialType="Certificate" negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
</security>

Beispiel: TCP-Transportmodus mit einem Zertifikat als Clientanmeldeinformationen

In diesem Beispiel wird der Sicherheitsmodus auf "Transport" und der Clientanmeldeinformationswert auf ein X.509-Zertifikat festgelegt. Die folgenden Vorgänge zeigen, wie Sie den Clientanmeldeinformationswert für den Client im Code und in der Konfiguration festlegen können. Dabei wird davon ausgegangen, dass Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) verwendet haben, um die Metadaten (Code und Konfiguration) vom Dienst zurückzugeben. Weitere Informationen finden Sie unter Erstellen eines Clients.

So legen Sie den Clientanmeldeinformationswert für den Client im Code fest

  1. Verwenden Sie dasServiceModel Metadata Utility Tool (Svcutil.exe), um Code und Konfiguration aus dem Dienst zu generieren.

  2. Erstellen Sie eine Instanz des WCF-Clients mithilfe des generierten Codes.

  3. Legen Sie für die Clientklasse die ClientCredentials-Eigenschaft der ClientBase<TChannel>-Klasse auf einen geeigneten Wert fest. In diesem Beispiel wird die Eigenschaft auf ein X.509-Zertifikat mit der SetCertificate-Methode der X509CertificateInitiatorClientCredential-Klasse festgelegt.

    // Create a binding using Transport and a certificate.
    NetTcpBinding b = new NetTcpBinding();
    b.Security.Mode = SecurityMode.Transport;
    b.Security.Transport.ClientCredentialType =
        TcpClientCredentialType.Certificate;
    
    // Create an EndPointAddress.
    EndpointAddress ea = new EndpointAddress(
        "net.tcp://localHost:8036/Calculator/MyCalculator");
    
    // Create the client.
    CalculatorClient cc = new CalculatorClient(b, ea);
    
    // Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate(
        StoreLocation.LocalMachine,
        StoreName.My,
        X509FindType.FindBySubjectName,
        "cohowinery.com");
    try
    {
        cc.Open();
        // Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2));
        cc.Close();
    }
    catch (AddressAccessDeniedException adExc)
    {
        Console.WriteLine(adExc.Message);
        Console.ReadLine();
    }
    catch (System.Exception exc)
    {
        Console.WriteLine(exc.Message);
        Console.ReadLine();
    }
    
    ' Create a binding using Transport and a certificate.
    Dim b As New NetTcpBinding()
    b.Security.Mode = SecurityMode.Transport
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
    
    ' Create an EndPointAddress.
    Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator")
    
    ' Create the client.
    Dim cc As New CalculatorClient(b, ea)
    
    ' Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com")
    Try
        cc.Open()
        ' Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2))
        cc.Close()
    Catch adExc As AddressAccessDeniedException
        Console.WriteLine(adExc.Message)
        Console.ReadLine()
    Catch exc As System.Exception
        Console.WriteLine(exc.Message)
        Console.ReadLine()
    End Try
    

    Sie können jede beliebige Enumeration der X509FindType-Klasse verwenden. Der Betreffname wird hier verwendet, für den Fall, dass das Zertifikat (aufgrund des Ablaufdatums) geändert wird. Anhand des Betreffnamens kann die Infrastruktur das Zertifikat wieder suchen.

So legen Sie den Clientanmeldeinformationswert für den Client in der Konfiguration fest

  1. Fügen Sie dem <Verhaltenselement> ein <Verhaltenselement> hinzu.

  2. Fügen Sie ein <clientCredentials>-Element zum <behaviors>-Element hinzu. Achten Sie darauf, für das erforderliche name-Attribut einen geeigneten Wert festzulegen.

  3. Fügen Sie dem <clientCredentials-Element> ein <clientCertificate-Element> hinzu.

  4. Legen Sie für die folgenden Attribute geeignete Werte fest: storeLocation, storeName, x509FindType und findValue, wie im folgenden Code dargestellt. Weitere Informationen zu Zertifikaten finden Sie unter Arbeiten mit Zertifikaten.

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. Wenn Sie den Client konfigurieren, legen Sie das Verhalten fest, indem Sie das behaviorConfiguration-Attribut des <endpoint>-Elements festlegen, wie im folgenden Code dargestellt. Das Endpunktelement ist dem <client>-Element untergeordnet. Geben Sie auch den Namen der Bindungskonfiguration an, indem Sie das bindingConfiguration-Attribut auf die Bindung für den Client festlegen. Wenn Sie eine generierte Konfigurationsdatei verwenden, wird der Name der Bindung automatisch erstellt. In diesem Beispiel lautet der Name "tcpBindingWithCredential".

    <client>
      <endpoint name =""
                address="net.tcp://contoso.com:8036/aloha"
                binding="netTcpBinding"
                bindingConfiguration="tcpBindingWithCredential"
                behaviorConfiguration="endpointCredentialBehavior" />
    </client>
    

Siehe auch