Vorgehensweise: Verwenden von Transportsicherheit und Nachrichtenanmeldeinformationen

Die Sicherung eines Dienstes mit sowohl Transport- als auch Message-Anmeldeinformationen nutzt die Vorteile der beiden Sicherheitsmodi Transport und Message in Windows Communication Foundation (WCF). Während die Transport Layer Security (TLS) Integrität und Vertraulichkeit bietet, stellt die Message Layer Security (MLS) verschiedene Anmeldeinformationen bereit, die bei reinen Transportsicherheitsmechanismen nicht verfügbar sind. In diesem Thema werden die grundlegenden Schritte zur Implementierung des Transports mit Nachrichtenanmeldeinformationen mithilfe der Bindungen WSHttpBinding und NetTcpBinding veranschaulicht. Weitere Informationen zum Festlegen des Sicherheitsmodus finden Sie unter Vorgehensweise: Festlegen des Sicherheitsmodus.

Wenn Sie den Sicherheitsmodus auf TransportWithMessageCredential festlegen, wird der tatsächliche Mechanismus, der die Sicherheitseinstellungen auf Transportebene bereitstellt, vom Transport bestimmt. Der Secure Sockets Layer (SSL)-Mechanismus über HTTP (HTTPS) wird für HTTP verwendet, wohingegen SSL über TCP oder Windows für TCP verwendet wird.

Wenn der Transport HTTP ist (unter Verwendung der WSHttpBinding), dann wird die Sicherheit auf Transportebene von SSL über HTTP bereitgestellt. In diesem Fall müssen Sie den Computer, der als Host für den Dienst fungiert, mit einem SSL-Zertifikat konfigurieren, das an einen Anschluss gebunden ist. Dies wird im weiteren Verlauf des Themas noch näher erläutert.

Wenn der Transport TCP ist (unter Verwendung der NetTcpBinding), wird für die Sicherheit auf Transportebene standardmäßig die Windows-Sicherheit bereitgestellt oder SSL über TCP wird verwendet. Wenn Sie SSL über TCP verwenden, müssen Sie das Zertifikat mit der SetCertificate-Methode angeben. Dies wird im weiteren Verlauf des Themas noch näher erläutert.

So verwenden Sie die WSHttpBinding mit einem Zertifikat für die Transportsicherheit (im Code)

  1. Binden Sie ein SSL-Zertifikat mit dem Tool HttpCfg.exe an einen Anschluss auf dem Computer. Weitere Informationen finden Sie unter Vorgehensweise: Konfigurieren eines Ports mit einem SSL-Zertifikat.

  2. Erstellen Sie eine Instanz der WSHttpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.

  3. Legen Sie für die ClientCredentialType-Eigenschaft einen geeigneten Wert fest. (Weitere Informationen finden Sie unter Auswählen eines Anmeldeinformationstyps.) Der folgende Code verwendet den Certificate-Wert.

  4. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse. Dabei muss das HTTPS-Schema verwendet werden, und die Adresse muss den tatsächlichen Namen des Computers sowie die Nummer des Anschlusses enthalten, an den das SSL-Zertifikat gebunden ist. (Sie können die Basisadresse auch in der Konfiguration festlegen.)

  5. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.

  6. Erstellen Sie eine Instanz des ServiceHost, und rufen Sie die Open-Methode auf, wie im folgenden Code veranschaulicht.

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Uri httpsAddress = new Uri("https://localMachineName:8006/base");
    ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress);
    sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    
    ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Dim httpsAddress As New Uri("https://localMachineName:8006/base")
    Dim sh As New ServiceHost(GetType(Calculator), httpsAddress)
    sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

So verwenden Sie die NetTcpBinding mit einem Zertifikat für die Transportsicherheit (im Code)

  1. Erstellen Sie eine Instanz der NetTcpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.

  2. Legen Sie den ClientCredentialType auf einen geeigneten Wert fest. Im folgenden Code wird der Certificate-Wert verwendet.

  3. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse. Die Adresse muss das NET.TCP-Schema verwenden. (Sie können die Basisadresse auch in der Konfiguration festlegen.)

  4. Erstellen Sie die Instanz der ServiceHost-Klasse.

  5. Legen Sie das X.509-Zertifikat für den Dienst mit der SetCertificate-Methode der X509CertificateRecipientServiceCredential-Klasse explizit fest.

  6. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.

  7. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

So verwenden Sie die NetTcpBinding mit Windows für die Transportsicherheit (im Code)

  1. Erstellen Sie eine Instanz der NetTcpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.

  2. Legen Sie die Transportsicherheit auf Windows fest, indem Sie den ClientCredentialType auf Windows festlegen. (Dabei handelt es sich um die Standardeinstellung.)

  3. Legen Sie den ClientCredentialType auf einen geeigneten Wert fest. Im folgenden Code wird der Certificate-Wert verwendet.

  4. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse. Die Adresse muss das NET.TCP-Schema verwenden. (Sie können die Basisadresse auch in der Konfiguration festlegen.)

  5. Erstellen Sie die Instanz der ServiceHost-Klasse.

  6. Legen Sie das X.509-Zertifikat für den Dienst mit der SetCertificate-Methode der X509CertificateRecipientServiceCredential-Klasse explizit fest.

  7. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.

  8. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Verwenden der Konfiguration

So verwenden Sie die WSHttpBinding

  1. Konfigurieren Sie den Computer mit einem SSL-Zertifikat, das an einen Anschluss gebunden ist. Weitere Informationen finden Sie unter Vorgehensweise: Konfigurieren eines Ports mit einem SSL-Zertifikat. Es ist nicht erforderlich, einen Wert für das <transport>-Element mit der Konfiguration festzulegen.

  2. Geben Sie den Typ der Anmeldeinformationen für den Client bezüglich der Sicherheit auf Nachrichtenebene an. Im folgenden Beispiel wird das clientCredentialType-Attribut des <message>-Elements auf UserName festgelegt.

    <wsHttpBinding>  
    <binding name="WsHttpBinding_ICalculator">  
            <security mode="TransportWithMessageCredential" >  
               <message clientCredentialType="UserName" />  
            </security>  
    </binding>  
    </wsHttpBinding>  
    

So verwenden Sie die NetTcpBinding mit einem Zertifikat für die Transportsicherheit

  1. Bei SSL über TCP müssen Sie das Zertifikat explizit im <behaviors>-Element angeben. Im folgenden Beispiel wird ein Zertifikat vom Aussteller am Standardspeicherort angegeben (lokaler Computer und persönlicher Speicher).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Fügen Sie dem Abschnitt für die Bindungen eine <netTcpBinding>-Datei hinzu.

  3. Fügen Sie ein Bindungselement hinzu, und legen Sie das name-Attribut auf einen geeigneten Wert fest.

  4. Fügen Sie ein <security>-Element hinzu, und legen Sie das mode-Attribut auf TransportWithMessageCredential fest.

  5. Fügen Sie ein <message>-Element hinzu, und legen Sie das clientCredentialType-Attribut auf einen passenden Wert fest.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <message clientCredentialType="Windows" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

So verwenden Sie die NetTcpBinding mit Windows für die Transportsicherheit

  1. Fügen Sie dem Abschnitt für die Bindungen eine <netTcpBinding>-Datei hinzu.

  2. Fügen Sie ein <binding>-Element hinzu, und legen Sie das name-Attribut auf einen passenden Wert fest.

  3. Fügen Sie ein <security>-Element hinzu, und legen Sie das mode-Attribut auf TransportWithMessageCredential fest.

  4. Fügen Sie ein <transport>-Element hinzu, und legen Sie das clientCredentialType-Attribut auf Windows fest.

  5. Fügen Sie ein <message> -Element hinzu, und legen Sie das clientCredentialType-Attribut auf einen passenden Wert fest. Im folgenden Code wird der Wert auf ein Zertifikat festgelegt.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <transport clientCredentialType="Windows" />  
           <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Siehe auch