Como: usar credenciais de mensagem e segurança do transporte
Proteger um serviço com credenciais de transporte e mensagem usa o melhor dos modos de segurança de transporte e mensagem no WCF (Windows Communication Foundation). Além disso, a segurança da camada de transporte fornece integridade e confidencialidade, enquanto a segurança da camada de mensagens fornece uma variedade de credenciais que não são possíveis com mecanismos de segurança de transporte estritos. Este tópico mostra as etapas básicas para implementar o transporte com credenciais de mensagem usando as associações WSHttpBinding e NetTcpBinding. Para obter mais informações sobre como definir o modo de segurança, confira 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 do transporte. Para HTTP, o mecanismo é a SSL (Secure Sockets Layer) via HTTP (HTTPS); para TCP, é SSL por TCP ou Windows.
Se o transporte for HTTP (usando o WSHttpBinding), a SSL via HTTP fornecerá a segurança no nível do transporte. Nesse caso, você deve configurar o computador que hospeda o serviço com um certificado SSL associado a uma porta, conforme mostrado posteriormente neste tópico.
Se o transporte for TCP (usando o NetTcpBinding), por padrão, a segurança de nível de transporte fornecida será a segurança do Windows ou SSL por TCP. Ao usar o SSL no TCP, você deve especificar o certificado usando o método SetCertificate, 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 associar um certificado SSL a uma porta no computador. Para obter mais informações, confira Como configurar uma porta com um certificado SSL.
Crie uma instância da classe WSHttpBinding e defina a propriedade Mode como TransportWithMessageCredential.
Defina a propriedade ClientCredentialType com um valor apropriado. (Para obter mais informações, confira Selecionar um tipo de credencial.) O código a seguir usa o valor Certificate.
Crie uma instância da classe Uri com um endereço base apropriado. Observe que o endereço deve usar o esquema "HTTPS" e deve conter o nome real do computador e o número da porta ao qual o certificado SSL está associado. (Como alternativa, você pode definir o endereço base na configuração.)
Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.
Crie a instância do método ServiceHost e chame o método Open, 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 classe NetTcpBinding e defina a propriedade Mode como TransportWithMessageCredential.
Defina o ClientCredentialType com um valor apropriado. O código a seguir usa o valor Certificate.
Crie uma instância da classe Uri 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 uma instância da classe ServiceHost.
Use o método SetCertificate da classe X509CertificateRecipientServiceCredential para definir explicitamente o certificado X.509 para o serviço.
Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.
Chame o método Open, conforme mostrado no exemplo 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 Windows para segurança de transporte (em código)
Crie uma instância da classe NetTcpBinding e defina a propriedade Mode como TransportWithMessageCredential.
Defina a segurança de transporte para usar o Windows definindo o ClientCredentialType como Windows. (Observe que esse é o padrão.)
Defina o ClientCredentialType com um valor apropriado. O código a seguir usa o valor Certificate.
Crie uma instância da classe Uri 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 uma instância da classe ServiceHost.
Use o método SetCertificate da classe X509CertificateRecipientServiceCredential para definir explicitamente o certificado X.509 para o serviço.
Adicione um ponto de extremidade de serviço usando o método AddServiceEndpoint.
Chame o método Open, conforme mostrado no exemplo 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 associado a uma porta. (Para obter mais informações, confira Como configurar uma porta com um certificado SSL). Você não precisa definir um valor de elemento
<transport>
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 atributo
clientCredentialType
do elemento<message>
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 por TCP, você deve especificar explicitamente o certificado no elemento
<behaviors>
. O exemplo a seguir especifica um certificado por seu emissor no local do repositório padrão (computador local e repositórios pessoais).<behaviors> <serviceBehaviors> <behavior name="mySvcBehavior"> <serviceCredentials> <serviceCertificate findValue="contoso.com" x509FindType="FindByIssuerName" /> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
Adicionar um <netTcpBinding> à seção de associações
Adicione um elemento de associação e defina o atributo
name
a um valor apropriado.Adicione um elemento
<security>
e defina o atributomode
comoTransportWithMessageCredential
.Adicione um elemento <
message>
e defina o atributoclientCredentialType
como um valor apropriado.<bindings> <netTcpBinding> <binding name="myTcpBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings>
Para usar o NetTcpBinding com Windows para segurança de transporte
Adicione um <netTcpBinding> à seção de associações.
Adicione um elemento
<binding>
e defina o atributoname
como um valor apropriado.Adicione um elemento
<security>
e defina o atributomode
comoTransportWithMessageCredential
.Adicione um elemento
<transport>
e defina o atributoclientCredentialType
comoWindows
.Adicione um elemento
<message>
e defina o atributoclientCredentialType
como 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>