如何:在联合身份验证服务上配置凭据
在 Windows Communication Foundation (WCF) 中,创建联合服务涉及以下主要过程:
配置 WSFederationHttpBinding 或类似的自定义绑定。 有关创建适当绑定的详细信息,请参阅如何:创建 WSFederationHttpBinding。
配置 IssuedTokenServiceCredential,它控制如何对提供给服务的已颁发令牌进行身份验证。
本主题提供有关第二个步骤的详细信息。 有关联合服务工作方式的详细信息,请参阅联合。
在代码中设置 IssuedTokenServiceCredential 的属性
使用 IssuedTokenAuthentication 类的 ServiceCredentials 属性返回对 IssuedTokenServiceCredential 实例的引用。 该属性可从 Credentials 类的 ServiceHostBase 属性访问。
如果要对自行颁发的令牌(比如 CardSpace 卡)进行身份验证,则将 AllowUntrustedRsaIssuers 属性设置为
true
。 默认为false
。用 KnownCertificates 类的实例填充由 X509Certificate2 属性返回的集合。 每个实例表示一个颁发者,服务将从该颁发者对令牌进行身份验证。
注意
与 ScopedCertificates 属性返回的客户端集合不同,已知证书集合不是键控集合。 不管发送包含已颁发令牌的消息的客户端地址是什么,服务都接受指定证书颁发的令牌(还受其他限制,这一点将在本主题的后面说明)。
将 CertificateValidationMode 属性设置为 X509CertificateValidationMode 枚举值之一。 这只能在代码中完成。 默认为 ChainTrust。
如果 CertificateValidationMode 属性设置为 Custom,则将自定义 X509CertificateValidator 类的一个实例分配给 CustomCertificateValidator 属性。
如果 CertificateValidationMode 设置为
ChainTrust
或PeerOrChainTrust
,则将 RevocationMode 属性设置为 X509RevocationMode 枚举中的适当值。 请注意,在PeerTrust
或Custom
验证模式中不使用吊销模式。如果需要,将自定义 SamlSerializer 类的一个实例分配给 SamlSerializer 属性。 例如,如果要分析自定义 SAML 断言,则需要自定义安全断言标记语言 (SAML) 序列化程序。
在配置中设置 IssuedTokenServiceCredential 的属性
创建一个
<issuedTokenAuthentication>
元素,作为<serviceCredentials>
元素的子元素。如果要验证自行颁发的令牌(比如 CardSpace 卡),则将
<issuedTokenAuthentication>
元素的allowUntrustedRsaIssuers
属性设置为true
。创建一个
<knownCertificates>
元素,作为<issuedTokenAuthentication>
元素的子元素。创建零个或多个
<add>
元素作为<knownCertificates>
元素的子项,并指定如何使用storeLocation
、storeName
、x509FindType
和findValue
属性来定位证书。必要时,将
<issuedTokenAuthentication>
元素的samlSerializer
属性设置为自定义 SamlSerializer 类的类型名称。
示例
下面的示例在代码中设置 IssuedTokenServiceCredential 的属性。
// 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
为了使联合服务能够对客户端进行身份验证,必须满足有关已颁发令牌的下列各项条件:
如果已颁发令牌的数字签名使用 RSA 安全密钥标识符,则 AllowUntrustedRsaIssuers 属性必须为
true
。如果已颁发令牌的签名使用 X.509 颁发者序列号、X.509 主题密钥标识符或 X.509 指纹安全标识符,则已颁发的令牌必须由 KnownCertificates 类的 IssuedTokenServiceCredential 属性返回的集合中的证书进行签名。
如果使用 X.509 证书对已颁发的令牌进行签名,该证书必须按照由 CertificateValidationMode 属性的值指定的语义进行验证,无论该证书是作为 X509RawDataKeyIdentifierClause 发送给依赖方还是从 KnownCertificates 属性获取。 有关 X.509 证书验证的详细信息,请参阅使用证书。
例如,将 CertificateValidationMode 设置为 PeerTrust 将对签名证书位于 TrustedPeople
证书存储中的任何已颁发令牌进行身份验证。 在这种情况下,请将 TrustedStoreLocation 属性设置为 CurrentUser 或 LocalMachine。 您可以选择其他模式,包括 Custom。 如果选择了 Custom
,则必须将 X509CertificateValidator 类的一个实例分配给 CustomCertificateValidator 属性。 自定义验证程序可以使用它喜欢的任何条件来验证证书。 有关详细信息,请参见如何:创建使用自定义证书验证程序的服务。