如何:创建 WSFederationHttpBinding
在 Windows Communication Foundation (WCF) 中,WSFederationHttpBinding 类(配置中的 wsFederationHttpBinding element)提供一种用于公开联合服务的机制。即,服务要求客户端使用安全令牌服务颁发的安全令牌进行身份验证。本主题演示如何通过代码和配置来设置 WSFederationHttpBinding。绑定一经创建,您就可以设置一个终结点来使用该绑定。
基本步骤概述如下:
选择一种安全模式。WSFederationHttpBinding 支持 Message,它在消息级提供端对端的安全(即使跨多个跃点也是如此),还支持 TransportWithMessageCredential,它在客户端和服务可以通过 HTTPS 直接连接的情况下提供较好的性能。
注意: WSFederationHttpBinding 还支持 None 作为安全模式。此模式不安全,仅用于调试目的。如果服务终结点是利用其安全模式设置为 None 的 WSFederationHttpBinding 来部署的,则得到的客户端绑定(由 ServiceModel 元数据实用工具 (Svcutil.exe) 生成)为 WsHttpBinding,其安全模式为 None。 与其他系统提供的绑定不同,使用 WSFederationHttpBinding 时无需选择客户端凭据类型。这是因为客户端凭据类型始终为已颁发令牌。WCF 从指定的颁发者获取一个令牌,并将该令牌提供给服务以对客户端进行身份验证。
在联合客户端上,将 IssuerAddress 属性设置为安全令牌服务的 URL。将 IssuerBinding 设置为要使用的绑定,以便与安全令牌服务进行通信。
可选。将 IssuedTokenType 属性设置为令牌类型的统一资源标识符 (URI)。在联合服务上,指定服务期望使用的令牌类型。在联合客户端上,指定客户端向安全令牌服务请求的令牌类型。
如果未指定令牌类型,则默认情况下,客户端将在无令牌类型 URI 的情况下生成 WS-Trust 请求安全令牌 (RST),而服务希望使用安全断言标记语言 (SAML) 1.1 令牌进行客户端身份验证。
SAML 1.1 令牌的 URI 为“http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1”。
可选。在联合服务上,将 IssuerMetadataAddress 属性设置为安全令牌服务的元数据 URL。使用元数据终结点,服务的客户端可以选择一个适合的绑定/终结点对,前提是将服务配置为发布元数据。有关发布元数据的更多信息,请参见发布元数据。
您还可以设置其他属性,包括已颁发令牌中用作校验密钥的密钥类型、在客户端和服务之间使用的算法套件、是协商还是显式指定服务凭据、服务期望已颁发令牌中包含的任何特定声明,以及必须添加到由客户端发送到安全令牌服务的请求的其他 XML 元素。
注意: |
---|
仅当 SecurityMode 设置为 Message 时,NegotiateServiceCredential 属性才是相关的。如果将 SecurityMode 设置为 TransportWithMessageCredential,则将忽略 NegotiateServiceCredential 属性。 |
以代码方式配置 WSFederationHttpBinding
创建 WSFederationHttpBinding 的一个实例。
根据需要将 Mode 属性设置为 Message 或 TransportWithMessageCredential。如果需要非 Basic256 的算法套件,请将 AlgorithmSuite 属性设置为从 SecurityAlgorithmSuite 中获取的值。
根据需要设置 NegotiateServiceCredential 属性。
根据需要将 IssuedKeyType 属性设置为 SecurityKeyType SymmetricKey 或 AsymmetricKey。
将 IssuedTokenType 属性设置为适当的值。如果未设置任何值,WCF 默认为“http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1”,指示 SAML 1.1 令牌。
如果未指定本地颁发者则在客户端上是必需的;在服务上是可选的。创建一个包含安全令牌服务的地址和标识信息的 EndpointAddress,然后将 EndpointAddress 实例分配给 IssuerAddress 属性。
如果未指定本地颁发者则在客户端上是必需的;不能在服务上使用。为 SecurityTokenService 创建一个 Binding,并将 Binding 实例分配给 IssuerBinding 属性。
不能在客户端上使用;在服务上可选。为安全令牌服务的元数据创建一个 EndpointAddress 实例,然后将其分配给 IssuerMetadataAddress 属性。
在客户端和服务上都是可选的。创建一个或多个 ClaimTypeRequirement 实例,并将其添加到 ClaimTypeRequirements 属性返回的集合中。
在客户端和服务上都是可选的。创建一个或多个 XmlElement 实例,并将其添加到 TokenRequestParameters 属性返回的集合中。
在配置中创建联合终结点
创建一个 wsFederationHttpBinding element,作为应用程序配置文件中 <bindings> 元素的子元素。
创建一个 binding 元素,作为 wsFederationHttpBinding element的子元素,并将 name 属性设置为适当的值。
创建一个 <security> 元素,作为 binding 元素的子元素。
根据需要将 <security> 元素的 mode 属性设置为 Message 或 TransportWithMessageCredential 的一个值。
创建一个 <message> 元素,作为 <security> 元素的子元素。
可选。将 <message> 元素的 algorithmSuite 属性设置为适当的值。默认值为 Basic256。
可选。如果需要非对称校验密钥,请将 <message> 元素的 issuedKeyType 属性设置为 AsymmetricKey。默认值为 SymmetricKey。
可选。设置 <message> 元素的 issuedTokenType 属性。
如果未指定本地颁发者则在客户端上是必需的;在服务上是可选的。创建一个 <issuer> 元素,作为 <message> 元素的子元素。
将 address 属性设置为 <issuer> 元素,并指定安全令牌服务接受令牌请求的地址。
可选。添加一个 <identity> 子元素,并指定安全令牌服务的标识。
有关更多信息,请参见 服务标识和身份验证.
如果未指定本地颁发者则在客户端上是必需的;不能在服务上使用。在可以用于与安全令牌服务进行通信的绑定部分创建一个 <binding> 元素。有关创建绑定的更多信息,请参见如何:在配置中指定服务绑定。
通过设置 <issuer> 元素的 binding 和 bindingConfiguration 属性,来指定在上一步创建的绑定。
不能在客户端上使用;在服务上可选。创建一个 <issuerMetadata> 元素,作为 <message> 元素的子元素。然后,在 <issuerMetadata> 元素的 address 属性中,指定安全令牌服务将要发布其元数据的地址。还可以选择添加一个 <identity> 子元素,并指定安全令牌服务的标识。
在客户端和服务上都是可选的。添加一个 <claimTypeRequirements> 元素,将其作为 <message> 元素的子元素。通过将 <add> of <claimTypeRequirements> 元素添加到 <claimTypeRequirements> 元素并利用 claimType 属性指定声明类型,来指定服务所依赖的必选和可选声明。通过设置 isOptional 属性来指定给定的声明是必选的还是可选的。
示例
下面的代码示例演示强制设置 WSFederationHttpBinding 的代码。
// This method creates a WSFederationHttpBinding.
public static WSFederationHttpBinding
CreateWSFederationHttpBinding(bool isClient)
{
// Create an instance of the WSFederationHttpBinding.
WSFederationHttpBinding b = new WSFederationHttpBinding();
// Set the security mode to Message.
b.Security.Mode = WSFederationHttpSecurityMode.Message;
// Set the Algorithm Suite to Basic256Rsa15.
b.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15;
// Set NegotiateServiceCredential to true.
b.Security.Message.NegotiateServiceCredential = true;
// Set IssuedKeyType to Symmetric.
b.Security.Message.IssuedKeyType = SecurityKeyType.SymmetricKey;
// Set IssuedTokenType to SAML 1.1
b.Security.Message.IssuedTokenType =
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1";
// Extract the STS certificate from the certificate store.
X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(
X509FindType.FindByThumbprint, "0000000000000000000000000000000000000000", false);
store.Close();
// Create an EndpointIdentity from the STS certificate.
EndpointIdentity identity = EndpointIdentity.CreateX509CertificateIdentity ( certs[0] );
// Set the IssuerAddress using the address of the STS and the previously created
// EndpointIdentity.
b.Security.Message.IssuerAddress =
new EndpointAddress(new Uri("https://localhost:8000/sts/x509"), identity);
// Set the IssuerBinding to a WSHttpBinding loaded from configuration.
// The IssuerBinding is only used on federated clients.
if (isClient)
{
b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
}
// Set the IssuerMetadataAddress using the metadata address of the STS and the
// previously created EndpointIdentity. The IssuerMetadataAddress is only used
// on federated services.
else
{
b.Security.Message.IssuerMetadataAddress =
new EndpointAddress(new Uri("https://localhost:8001/sts/mex"), identity);
}
// Create a ClaimTypeRequirement.
ClaimTypeRequirement ctr = new ClaimTypeRequirement
("http://example.org/claim/c1", false);
// Add the ClaimTypeRequirement to ClaimTypeRequirements
b.Security.Message.ClaimTypeRequirements.Add(ctr);
// Return the created binding
return b;
}
另请参见
任务
联合示例
如何:在 WSFederationHttpBinding 上禁用安全会话