Dela via


Anvisningar: Använda autentiseringsuppgifter för transportsäkerhet och meddelande

Att skydda en tjänst med både transport- och meddelandeautentiseringsuppgifter använder det bästa av både transport- och meddelandesäkerhetslägen i Windows Communication Foundation (WCF). Sammanfattningsvis ger säkerhet på transportnivå integritet och konfidentialitet, medan säkerhet på meddelandenivå ger en mängd olika autentiseringsuppgifter som inte är möjliga med strikta transportsäkerhetsmekanismer. Det här avsnittet visar de grundläggande stegen för att implementera transport med autentiseringsuppgifter för WSHttpBinding meddelanden med hjälp av bindningarna och NetTcpBinding . Mer information om hur du ställer in säkerhetsläget finns i Så här ställer du in säkerhetsläget.

När du ställer in säkerhetsläget på TransportWithMessageCredentialavgör transporten den faktiska mekanism som ger säkerhet på transportnivå. För HTTP är mekanismen Secure Sockets Layer (SSL) via HTTP (HTTPS); för TCP är det SSL över TCP eller Windows.

Om transporten är HTTP (med hjälp av WSHttpBinding), ger SSL via HTTP säkerheten på transportnivå. I så fall måste du konfigurera datorn som är värd för tjänsten med ett SSL-certifikat som är bundet till en port, vilket visas senare i det här avsnittet.

Om transporten är TCP (med hjälp av NetTcpBinding), är den säkerhet på transportnivå som tillhandahålls som standard Windows-säkerhet eller SSL över TCP. När du använder SSL via TCP måste du ange certifikatet med hjälp av SetCertificate metoden, som du ser senare i det här avsnittet.

Så här använder du WSHttpBinding med ett certifikat för transportsäkerhet (i kod)

  1. Använd verktyget HttpCfg.exe för att binda ett SSL-certifikat till en port på datorn. Mer information finns i Så här konfigurerar du en port med ett SSL-certifikat.

  2. Skapa en instans av WSHttpBinding klassen och ange Mode egenskapen till TransportWithMessageCredential.

  3. Ange egenskapen ClientCredentialType till ett lämpligt värde. (Mer information finns i Välja en typ av autentiseringsuppgifter.) Följande kod använder värdet Certificate .

  4. Skapa en instans av Uri klassen med en lämplig basadress. Observera att adressen måste använda "HTTPS"-schemat och måste innehålla datorns faktiska namn och det portnummer som SSL-certifikatet är bundet till. (Du kan också ange basadressen i konfigurationen.)

  5. Lägg till en tjänstslutpunkt med hjälp av AddServiceEndpoint metoden .

  6. Skapa instansen ServiceHost av och anropa Open metoden enligt följande kod.

    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()
    

Så här använder du NetTcpBinding med ett certifikat för transportsäkerhet (i kod)

  1. Skapa en instans av NetTcpBinding klassen och ange Mode egenskapen till TransportWithMessageCredential.

  2. ClientCredentialType Ange ett lämpligt värde. Följande kod använder värdet Certificate .

  3. Skapa en instans av Uri klassen med en lämplig basadress. Observera att adressen måste använda schemat "net.tcp". (Du kan också ange basadressen i konfigurationen.)

  4. Skapa instansen ServiceHost av klassen.

  5. SetCertificate Använd -metoden för X509CertificateRecipientServiceCredential klassen för att uttryckligen ange X.509-certifikatet för tjänsten.

  6. Lägg till en tjänstslutpunkt med hjälp av AddServiceEndpoint metoden .

  7. Open Anropa metoden enligt följande kod.

    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()
    

Så här använder du NetTcpBinding med Windows för transportsäkerhet (i kod)

  1. Skapa en instans av NetTcpBinding klassen och ange Mode egenskapen till TransportWithMessageCredential.

  2. Ange transportsäkerhet för att använda Windows genom att ange ClientCredentialType till Windows. (Observera att detta är standardinställningen.)

  3. ClientCredentialType Ange ett lämpligt värde. Följande kod använder värdet Certificate .

  4. Skapa en instans av Uri klassen med en lämplig basadress. Observera att adressen måste använda schemat "net.tcp". (Du kan också ange basadressen i konfigurationen.)

  5. Skapa instansen ServiceHost av klassen.

  6. SetCertificate Använd -metoden för X509CertificateRecipientServiceCredential klassen för att uttryckligen ange X.509-certifikatet för tjänsten.

  7. Lägg till en tjänstslutpunkt med hjälp av AddServiceEndpoint metoden .

  8. Open Anropa metoden enligt följande kod.

    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()
    

Använda konfiguration

Så här använder du WSHttpBinding

  1. Konfigurera datorn med ett SSL-certifikat som är bundet till en port. (Mer information finns i Anvisningar: Konfigurera en port med ett SSL-certifikat). Du behöver inte ange ett <transport> elementvärde med den här konfigurationen.

  2. Ange klientens typ av autentiseringsuppgifter för säkerhet på meddelandenivå. I följande exempel anges clientCredentialType attributet för elementet <message> till UserName.

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

Så här använder du NetTcpBinding med ett certifikat för transportsäkerhet

  1. För SSL över TCP måste du uttryckligen ange certifikatet i elementet <behaviors> . I följande exempel anges ett certifikat av utfärdaren på standardlagringsplatsen (lokal dator och personliga arkiv).

    <behaviors>
     <serviceBehaviors>
       <behavior name="mySvcBehavior">
           <serviceCredentials>
             <serviceCertificate findValue="contoso.com"
                                 x509FindType="FindByIssuerName" />
           </serviceCredentials>
       </behavior>
     </serviceBehaviors>
    </behaviors>
    
  2. Lägg till en <netTcpBinding> i avsnittet bindningar

  3. Lägg till ett bindningselement och ange name attributet till ett lämpligt värde.

  4. Lägg till ett <security> element och ange mode attributet till TransportWithMessageCredential.

  5. Lägg till ett <message> element och ange clientCredentialType attributet till ett lämpligt värde.

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

Så här använder du NetTcpBinding med Windows för transportsäkerhet

  1. Lägg till en <netTcpBinding> i avsnittet bindningar,

  2. Lägg till ett <binding> element och ange name attributet till ett lämpligt värde.

  3. Lägg till ett <security> element och ange mode attributet till TransportWithMessageCredential.

  4. Lägg till ett <transport> element och ange attributet clientCredentialType till Windows.

  5. Lägg till ett <message> element och ange clientCredentialType attributet till ett lämpligt värde. Följande kod anger värdet till ett certifikat.

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

Se även