Freigeben über


Gewusst wie: Angeben der Clientanmeldeinformationswerte

Wenn Sie Windows Communication Foundation (WCF) verwenden, kann der Dienst angeben, wie ein Client für den 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**>**, wobei 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 Gewusst wie: Erstellen eines Windows Communication Foundation-Clients.

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

  1. Verwenden Sie das ServiceModel Metadata Utility-Tool (Svcutil.exe), um den Code und die Konfiguration aus dem Dienst zu generieren.

  2. Erstellen Sie mit dem generierten Code eine Instanz des WCF-Clients.

  3. Legen Sie für die Clientklasse die ClientCredentials-Eigenschaft der ClientBase-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.
    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
    
    // 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();
    }          
    

    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 <behaviors>-Element ein <behavior> of <endpointBehaviors>-Element hinzu.

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

  3. Fügen Sie dem <clientCredentials>-Element ein <clientCertificate> of <serviceCredentials>-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 über zu Zertifikaten finden Sie unter Verwenden von 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

Aufgaben

Gewusst wie: Erstellen eines Windows Communication Foundation-Clients

Verweis

NetTcpBinding
SetCertificate
X509CertificateRecipientServiceCredential
ClientBase
X509CertificateInitiatorClientCredential

Konzepte

Programmieren der WCF-Sicherheit
Wählen eines Typs von Anmeldeinformationen
ServiceModel Metadata Utility-Tool (Svcutil.exe)
Verwenden von Zertifikaten

Weitere Ressourcen

<netTcpBinding>
<security> of <netTcpBinding>
<message> element of <netTcpBinding>
<behavior> of <endpointBehaviors>
<behaviors>
<clientCertificate> of <serviceCredentials>
<clientCredentials>