Como: criar uma credencial de suporte
É possível ter um esquema de segurança personalizado que exija mais de uma credencial. Por exemplo, um serviço pode exigir do cliente não apenas um nome de usuário e senha, mas também uma credencial que prove que o cliente tem mais de 18 anos. A segunda credencial é uma credencial de suporte. Este tópico explica como implementar essas credenciais em um cliente do Windows Communication Foundation (WCF).
Observação
A especificação para dar suporte às credenciais faz parte da especificação WS-SecurityPolicy. Para obter mais informações, consulte As Especificações de Segurança dos Serviços Web.
Tokens com suporte
Resumindo, quando você usa a segurança da mensagem, uma credencial primária é sempre usada para proteger a mensagem (por exemplo, um certificado X.509 ou um tíquete Kerberos).
Conforme definido pela especificação, uma associação de segurança usa tokens para proteger a troca de mensagens. Um token é uma representação de uma credencial de segurança.
A associação de segurança usa um token primário identificado na política de associação de segurança para criar uma assinatura. Essa assinatura é conhecida como a assinatura da mensagem.
Tokens adicionais podem ser especificados para aumentar as declarações fornecidas pelo token associado à assinatura da mensagem.
Endossando, assinando e criptografando
Uma credencial de suporte resulta em um token de suporte transmitido dentro da mensagem. A especificação WS-SecurityPolicy define quatro maneiras de anexar um token de suporte à mensagem, conforme descrito na tabela a seguir.
Finalidade | Descrição |
---|---|
Com sinal | O token de suporte está incluído no cabeçalho de segurança e é assinado pela assinatura da mensagem. |
Endossando | Um token endossador assina a assinatura da mensagem. |
Assinado e endossando | Os tokens assinados e endossados assinam todo o elemento ds:Signature produzido a partir da assinatura da mensagem e são assinados por essa assinatura de mensagem; ou seja, ambos os tokens (o token usado para a assinatura da mensagem e o token endossador assinado) assinam uns aos outros. |
Assinado e criptografando | Tokens de suporte criptografados e assinados são assinados com suporte a tokens que também são criptografados quando aparecem no wsse:SecurityHeader . |
Credenciais de suporte de programação
Para criar um serviço que usa tokens de suporte, você deve criar um <customBinding>. (Para obter mais informações, consulte Como criar uma associação personalizada usando o SecurityBindingElement.)
A primeira etapa ao criar uma associação personalizada é criar um elemento de associação de segurança, que pode ser um dos três tipos:
Todas as classes herdam do SecurityBindingElement, que inclui quatro propriedades relevantes:
Escopos
Existem dois escopos para dar suporte às credenciais:
Os tokens de suporte de ponto de extremidade dão suporte a todas as operações de um ponto de extremidade. Ou seja, a credencial que o token de suporte representa pode ser usada sempre que qualquer operação de ponto de extremidade for invocada.
Os tokens de suporte à operação dão suporte apenas a uma operação de ponto de extremidade específica.
Conforme indicado pelos nomes das propriedades, as credenciais de suporte podem ser necessárias ou opcionais. Ou seja, se a credencial de suporte for usada se ela estiver presente, embora não seja necessária, mas a autenticação não falhará se ela não estiver presente.
Procedimentos
Para criar uma associação personalizada que inclua credenciais de suporte
Crie um elemento de associação de segurança. O exemplo a seguir cria um SymmetricSecurityBindingElement com o modo de autenticação
UserNameForCertificate
. Use o método CreateUserNameForCertificateBindingElement.Adicione o parâmetro de suporte à coleção de tipos retornados pela propriedade apropriada (
Endorsing
,Signed
,SignedEncrypted
ouSignedEndorsed
). Os tipos no namespace System.ServiceModel.Security.Tokens incluem tipos comumente usados, como o X509SecurityTokenParameters.
Exemplo
Descrição
O exemplo a seguir cria uma instância de SymmetricSecurityBindingElement e adiciona uma instância da classe KerberosSecurityTokenParameters à coleção retornada pela propriedade Endossando.
Código
public static Binding CreateMultiFactorAuthenticationBinding()
{
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
// The message security binding element will be configured to require 2 tokens:
// 1) A user name/password encrypted with the service token.
// 2) A client certificate used to sign the message.
// Instantiate a binding element that will require the user name/password token
// in the message (encrypted with the server certificate).
SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
// Create supporting token parameters for the client X.509 certificate.
X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
// Specify that the supporting token is passed in the message send by the client to the service.
clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
// Turn off derived keys.
clientX509SupportingTokenParameters.RequireDerivedKeys = false;
// Augment the binding element to require the client's X.509 certificate as an
// endorsing token in the message.
messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);
// Create a CustomBinding based on the constructed security binding element.
return new CustomBinding(messageSecurity, httpTransport);
}