Como: configurar credenciais em um serviço de federação
No Windows Communication Foundation (WCF), a criação de um serviço federado consiste nos seguintes procedimentos principais:
Configurando uma associação personalizada WSFederationHttpBinding ou semelhante. Para obter mais informações sobre como criar uma associação apropriada, consulte Como criar WSFederationHttpBinding.
Configurando IssuedTokenServiceCredential que controla como os tokens emitidos apresentados ao serviço são autenticados.
Este tópico fornece detalhes sobre a segunda etapa. Para obter mais informações sobre como um serviço federado funciona, consulte Federação.
Para definir as propriedades de IssuedTokenServiceCredential no código
Use a propriedade IssuedTokenAuthentication da classe ServiceCredentials para retornar uma referência a uma instância IssuedTokenServiceCredential. A propriedade é acessada a partir da propriedade Credentials da classe ServiceHostBase.
Defina a propriedade AllowUntrustedRsaIssuers como
true
se tokens autoemitidos, como cartões CardSpace, devem ser autenticados. O padrão éfalse
.Preencha a coleção retornada pela propriedade KnownCertificates com instâncias da classe X509Certificate2. Cada instância representa um emissor do qual o serviço autenticará tokens.
Observação
Ao contrário da coleção do lado do cliente retornada pela propriedade ScopedCertificates, a coleção de certificados conhecidos não é uma coleção com chave. O serviço aceita os tokens emitidos pelos certificados especificados, independentemente do endereço do cliente que enviou a mensagem que contém o token emitido (sujeito a outras restrições, descritas posteriormente neste tópico).
Defina a propriedade CertificateValidationMode como um dos valores de enumeração X509CertificateValidationMode. Isso pode ser feito apenas em código. O padrão é ChainTrust.
Se a propriedade CertificateValidationMode estiver definida como Custom, atribua uma instância da classe X509CertificateValidator personalizada à propriedade CustomCertificateValidator.
Se CertificateValidationMode estiver definido como
ChainTrust
ouPeerOrChainTrust
, defina a propriedade RevocationMode para um valor apropriado da enumeração X509RevocationMode. Observe que o modo de revogação não é usado nos modos de validaçãoPeerTrust
ouCustom
.Se necessário, atribua uma instância de uma classe SamlSerializer personalizada à propriedade SamlSerializer. Um serializador de Security Assertions Markup Language (SAML) personalizado é necessário, por exemplo, para analisar asserções SAML personalizadas.
Para definir as propriedades de IssuedTokenServiceCredential na configuração
Crie um elemento
<issuedTokenAuthentication>
como filho de um elemento<serviceCredentials>
.Defina o atributo
allowUntrustedRsaIssuers
do elemento<issuedTokenAuthentication>
comotrue
se estiver autenticando um token autoemitido, como um cartão CardSpace.Crie um elemento
<knownCertificates>
como filho do elemento<issuedTokenAuthentication>
.Crie zero ou mais elementos
<add>
como filhos do elemento<knownCertificates>
e especifique como localizar o certificado usando os atributosstoreLocation
,storeName
,x509FindType
efindValue
.Se necessário, defina o atributo
samlSerializer
do elemento<issuedTokenAuthentication>
para o nome do tipo da classe SamlSerializer personalizada.
Exemplo
O exemplo a seguir define as propriedades de um IssuedTokenServiceCredential no código.
// This method configures the IssuedTokenAuthentication property of a ServiceHost.
public static void ConfigureIssuedTokenServiceCredentials(
ServiceHost sh, bool allowCardspaceTokens, IList<X509Certificate2> knownissuers,
X509CertificateValidationMode certMode, X509RevocationMode revocationMode, SamlSerializer ser )
{
// Allow CardSpace tokens.
sh.Credentials.IssuedTokenAuthentication.AllowUntrustedRsaIssuers = allowCardspaceTokens;
// Set up known issuer certificates.
foreach(X509Certificate2 cert in knownissuers)
sh.Credentials.IssuedTokenAuthentication.KnownCertificates.Add ( cert );
// Set issuer certificate validation and revocation checking modes.
sh.Credentials.IssuedTokenAuthentication.CertificateValidationMode =
X509CertificateValidationMode.PeerOrChainTrust;
sh.Credentials.IssuedTokenAuthentication.RevocationMode = X509RevocationMode.Online;
sh.Credentials.IssuedTokenAuthentication.TrustedStoreLocation = StoreLocation.LocalMachine;
// Set the SamlSerializer, if one is specified.
if ( ser != null )
sh.Credentials.IssuedTokenAuthentication.SamlSerializer = ser;
}
' This method configures the IssuedTokenAuthentication property of a ServiceHost.
Public Shared Sub ConfigureIssuedTokenServiceCredentials( _
ByVal sh As ServiceHost, _
ByVal allowCardspaceTokens As Boolean, _
ByVal knownissuers As IList(Of X509Certificate2), _
ByVal certMode As X509CertificateValidationMode, _
ByVal revocationMode As X509RevocationMode, _
ByVal ser As SamlSerializer _
)
' Allow CardSpace tokens.
sh.Credentials.IssuedTokenAuthentication.AllowUntrustedRsaIssuers = _
allowCardspaceTokens
' Set up known issuer certificates.
Dim cert As X509Certificate2
For Each cert In knownissuers
sh.Credentials.IssuedTokenAuthentication.KnownCertificates.Add(cert)
Next cert
' Set issuer certificate validation and revocation checking modes.
sh.Credentials.IssuedTokenAuthentication.CertificateValidationMode = _
X509CertificateValidationMode.PeerOrChainTrust
sh.Credentials.IssuedTokenAuthentication.RevocationMode = _
X509RevocationMode.Online
' Set the SamlSerializer, if one is specified.
If Not (ser Is Nothing) Then
sh.Credentials.IssuedTokenAuthentication.SamlSerializer = ser
End If
End Sub
Para que um serviço federado autentique um cliente, o seguinte deve ser verdadeiro sobre o token emitido:
Quando a assinatura digital do token emitido usa um identificador de chave de segurança RSA, a propriedade AllowUntrustedRsaIssuers deve ser
true
.Quando a assinatura do token emitido usa um número de série do emissor X.509, identificador de chave de assunto X.509 ou identificador de segurança de impressão digital X.509, o token emitido deve ser assinado por um certificado na coleção retornada pela propriedade KnownCertificates do IssuedTokenServiceCredential classe.
Quando o token emitido é assinado usando um certificado X.509, o certificado deve ser validado de acordo com a semântica especificada pelo valor da propriedade CertificateValidationMode, independentemente de o certificado ter sido enviado à terceira parte confiável como X509RawDataKeyIdentifierClause ou obtido da propriedade KnownCertificates. Para obter mais informações sobre a validação do certificado X.509, consulte Como trabalhar com certificados.
Por exemplo, definir CertificateValidationMode como PeerTrust autenticaria qualquer token emitido cujo certificado de assinatura esteja no repositório de certificados TrustedPeople
. Nesse caso, defina a propriedade TrustedStoreLocation como CurrentUser ou LocalMachine. Você pode selecionar outros modos, incluindo Custom. Quando Custom
é selecionado, você deve atribuir uma instância da classe X509CertificateValidator à propriedade CustomCertificateValidator. O validador personalizado pode validar certificados usando qualquer critério que desejar. Para obter mais informações, consulte Como: criar um serviço que emprega um validador de certificado personalizado.