Como usar a segurança de transporte e credenciais de mensagem
Proteger um serviço com credenciais de transporte e mensagem usa o melhor dos modos de segurança de Transporte e Mensagem no Windows Communication Foundation (WCF). Em suma, a segurança da camada de transporte fornece integridade e confidencialidade, enquanto a segurança da camada de mensagem fornece uma variedade de credenciais que não são possíveis com mecanismos de segurança de transporte rigorosos. Este tópico mostra as etapas básicas para implementar o transporte com credenciais de mensagem usando as WSHttpBinding ligações e NetTcpBinding . Para obter mais informações sobre como definir o modo de segurança, consulte Como definir o modo de segurança.
Ao definir o modo de segurança como TransportWithMessageCredential
, o transporte determina o mecanismo real que fornece a segurança no nível de transporte. Para HTTP, o mecanismo é Secure Sockets Layer (SSL) sobre HTTP (HTTPS); para TCP, é SSL sobre TCP ou Windows.
Se o transporte for HTTP (usando o WSHttpBinding), SSL sobre HTTP fornece a segurança no nível de transporte. Nesse caso, você deve configurar o computador que hospeda o serviço com um certificado SSL vinculado a uma porta, conforme mostrado posteriormente neste tópico.
Se o transporte for TCP (usando o NetTcpBinding), por padrão, a segurança no nível de transporte fornecida é a segurança do Windows ou SSL sobre TCP. Ao usar SSL sobre TCP, você deve especificar o certificado usando o SetCertificate método, conforme mostrado posteriormente neste tópico.
Para usar o WSHttpBinding com um certificado para segurança de transporte (em código)
Use a ferramenta HttpCfg.exe para vincular um certificado SSL a uma porta na máquina. Para obter mais informações, consulte Como configurar uma porta com um certificado SSL.
Crie uma instância da WSHttpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.
Defina a ClientCredentialType propriedade como um valor apropriado. (Para obter mais informações, consulte Selecionando um tipo de credencial.) O código a seguir usa o Certificate valor.
Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "HTTPS" e deve conter o nome real da máquina e o número da porta à qual o certificado SSL está vinculado. (Como alternativa, você pode definir o endereço base na configuração.)
Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.
Crie a instância do e chame ServiceHost o Open método, conforme mostrado no código a seguir.
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()
Para usar o NetTcpBinding com um certificado para segurança de transporte (em código)
Crie uma instância da NetTcpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.
Defina o ClientCredentialType como um valor apropriado. O código a seguir usa o Certificate valor.
Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)
Crie a instância da ServiceHost classe.
Use o SetCertificate método da X509CertificateRecipientServiceCredential classe para definir explicitamente o certificado X.509 para o serviço.
Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.
Chame o Open método, conforme mostrado no código a seguir.
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()
Para usar o NetTcpBinding com o Windows para segurança de transporte (em código)
Crie uma instância da NetTcpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.
Defina a segurança de transporte para usar o Windows definindo como ClientCredentialType Windows. (Observe que esse é o padrão.)
Defina o ClientCredentialType como um valor apropriado. O código a seguir usa o Certificate valor.
Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)
Crie a instância da ServiceHost classe.
Use o SetCertificate método da X509CertificateRecipientServiceCredential classe para definir explicitamente o certificado X.509 para o serviço.
Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.
Chame o Open método, conforme mostrado no código a seguir.
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()
Usando a configuração
Para usar o WSHttpBinding
Configure o computador com um certificado SSL vinculado a uma porta. (Para obter mais informações, consulte Como: Configurar uma porta com um certificado SSL). Não é necessário definir um valor de
<transport>
elemento com essa configuração.Especifique o tipo de credencial do cliente para a segurança no nível da mensagem. O exemplo a seguir define o
clientCredentialType
<message>
atributo do elemento comoUserName
.<wsHttpBinding> <binding name="WsHttpBinding_ICalculator"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="UserName" /> </security> </binding> </wsHttpBinding>
Para usar o NetTcpBinding com um certificado para segurança de transporte
Para SSL sobre TCP, você deve especificar explicitamente o
<behaviors>
certificado no elemento . O exemplo a seguir especifica um certificado por seu emissor no local de armazenamento padrão (máquina local e armazenamentos pessoais).<behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" x509FindType="FindByIssuerName" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
Adicionar um <netTcpBinding> à seção de ligações
Adicione um elemento binding e defina o
name
atributo como um valor apropriado.Adicione um
<security>
elemento e defina omode
atributo comoTransportWithMessageCredential
.Adicione um <
message>
elemento e defina oclientCredentialType
atributo como um valor apropriado.<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings>
Para usar o NetTcpBinding com o Windows para segurança de transporte
Adicione um <netTcpBinding> à seção bindings,
Adicione um
<binding>
elemento e defina oname
atributo para um valor apropriado.Adicione um
<security>
elemento e defina omode
atributo comoTransportWithMessageCredential
.Adicione um
<transport>
elemento e defina oclientCredentialType
atributo comoWindows
.Adicione um
<message>
elemento e defina oclientCredentialType
atributo para um valor apropriado. O código a seguir define o valor como um certificado.<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <transport clientCredentialType="Windows" /> <message clientCredentialType="Certificate" /> </security> </binding> </netTcpBinding> </bindings>