Freigeben über


Vorgehensweise: Angeben von Clientanmeldeinformationswerten

Mit Windows Communication Foundation (WCF) kann der Dienst angeben, wie ein Client beim Dienst authentifiziert wird. Beispielsweise kann ein Dienst festlegen, dass der Client mit einem Zertifikat authentifiziert wird.

So bestimmen Sie den Clientanmeldeinformationstyp

  1. Abrufen von Metadaten vom Metadatenendpunkt des Diensts. Die Metadaten bestehen in der Regel aus zwei Dateien: dem Clientcode in der Programmiersprache Ihrer Wahl (der Standardwert ist Visual C#) und eine XML-Konfigurationsdatei. Eine Möglichkeit zum Abrufen von Metadaten besteht darin, das Svcutil.exe Tool zum Zurückgeben des Clientcodes und der Clientkonfiguration zu verwenden. 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, ist der Standardname der Datei Output.config.

  3. Suchen Sie das <Sicherheitselement> mit dem mode Attribut (<Sicherheitsmodus =MessageOrTransport> wo MessageOrTransport auf einen der Sicherheitsmodi festgelegt ist.

  4. Suchen Sie das untergeordnete Element, das dem Moduswert entspricht. Wenn der Modus beispielsweise auf "Nachricht" festgelegt ist, suchen Sie das Nachrichtenelement<, das><im Sicherheitselement> enthalten ist.

  5. Notieren Sie sich den dem clientCredentialType Attribut zugewiesenen Wert. Der tatsächliche Wert hängt davon ab, welcher Modus, Transport oder Nachricht verwendet wird.

Der folgende XML-Code zeigt die Konfiguration für einen Client mithilfe der Nachrichtensicherheit und das Anfordern eines Zertifikats zur Authentifizierung des Clients.

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

Beispiel: TCP-Transportmodus mit Zertifikat als Clientanmeldeinformationen

In diesem Beispiel wird der Sicherheitsmodus auf den Transportmodus festgelegt und der Clientanmeldeinformationswert auf ein X.509-Zertifikat festgelegt. Die folgenden Verfahren veranschaulichen das Festlegen des Clientanmeldeinformationswerts auf dem Client in Code und Konfiguration. Dabei wird davon ausgegangen, dass Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) verwendet haben, um die Metadaten (Code und Konfiguration) aus dem Dienst zurückzugeben. Weitere Informationen finden Sie unter How to: Create a Client.

Um den Client-Credentials-Wert im Code auf dem Client anzugeben

  1. Verwenden Sie das ServiceModel 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 auf der Clientklasse die ClientCredentials Eigenschaft der ClientBase<TChannel> Klasse auf einen geeigneten Wert fest. In diesem Beispiel wird die Eigenschaft mithilfe der Methode SetCertificate der X509CertificateInitiatorClientCredential-Klasse auf ein X.509-Zertifikat 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 eine der Enumerationen der X509FindType Klasse verwenden. Der Subjektname wird hier verwendet, falls das Zertifikat aufgrund eines Ablaufdatums geändert werden muss. Wenn Sie den Betreffnamen verwenden, kann die Infrastruktur das Zertifikat erneut finden.

Geben Sie in der Konfiguration des Clients den Wert der Anmeldeinformationen für den Client an.

  1. Fügen Sie dem <Verhaltens-Element> ein <Verhalten-Element> hinzu.

  2. Fügen Sie dem <behaviors>-Element ein <clientCredentials>-Element hinzu. Stellen Sie sicher, dass Sie das erforderliche name Attribut auf einen geeigneten Wert festlegen.

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

  4. Legen Sie die folgenden Attribute auf geeignete Werte fest: storeLocation, , storeName, x509FindTypeund 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. Geben Sie beim Konfigurieren des Clients das Verhalten an, indem Sie das behaviorConfiguration Attribut des <endpoint> Elements festlegen, wie im folgenden Code gezeigt. Das Endpunkt-Element ist ein untergeordnetes Element des <Client>-Elements. Geben Sie außerdem 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 generiert. 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