如何:创建支持凭据

自定义安全方案可能要求提供多个凭据。 例如,某个服务可能要求客户端不仅提供用户名和密码,还要提供能够证明客户端用户已满 18 岁的凭据。 第二个凭据就是“支持凭据”。 本主题说明如何在 Windows Communication Foundation (WCF) 客户端实现此类凭据。

注意

支持凭据的规范是 WS-SecurityPolicy 规范的一部分。 有关详细信息,请参阅 Web Services 安全规范

支持令牌

简言之,在使用消息安全时,主凭据总是用于保护消息的安全(例如,X.509 证书或 Kerberos 票证)。

正如规范所定义的那样,安全绑定使用令牌来保护消息交换的安全。 “令牌”是安全凭据的表示形式。

安全绑定使用在安全绑定策略中标识的主令牌来创建签名。 此签名称为“消息签名”。

还可以指定其他令牌,以扩充与消息签名相关联的令牌所提供的声明。

认可、签名和加密

支持凭据会产生在消息中传输的支持令牌。 WS-SecurityPolicy 规范定义了四种将支持令牌附加到消息的方法,如下表所述。

目的 说明
有符号 支持令牌包含在安全标头中,并由消息签名进行签名。
认可 认可令牌对消息签名进行签名。
签名和认可 签名的认可令牌对从消息签名生成的整个 ds:Signature 元素进行签名,并由该消息签名对自己进行签名;也就是说,两种令牌(用于消息签名的令牌和已签名的认可令牌)互相进行签名。
签名和加密 签名的加密支持令牌是在 wsse:SecurityHeader 中出现时还进行加密的签名支持令牌。

对支持凭据进行编程

若要创建使用支持令牌的服务,必须创建一个 <customBinding>。 (有关详细信息,请参阅如何:使用 SecurityBindingElement 创建自定义绑定。)

创建自定义绑定的第一步是创建一个安全绑定元素,该元素可以是以下三种类型之一:

所有类都继承自 SecurityBindingElement,它包含四个相关属性:

作用域

支持凭据存在两个范围:

  • 终结点支持令牌支持终结点的所有操作。 即,每当调用任何终结点操作,都可以使用该支持令牌表示的凭据。

  • 操作支持令牌仅支持特定终结点操作。

正如属性名所指示的那样,支持凭据可能是必需的,也可能是可选的。 即,如果支持凭据存在,则使用支持凭据(尽管不是必需的),但如果支持凭据不存在,身份验证也不会失败。

过程

创建一个包含支持凭据的自定义绑定

  1. 创建一个安全绑定元素。 下面的示例创建一个 SymmetricSecurityBindingElement,该元素具有 UserNameForCertificate 身份验证模式。 使用 CreateUserNameForCertificateBindingElement 方法。

  2. 将支持参数添加到由适当的属性(EndorsingSignedSignedEncryptedSignedEndorsed)返回的类型集合中。 System.ServiceModel.Security.Tokens 命名空间中的类型包括常用类型,如 X509SecurityTokenParameters

示例

说明

下面的示例创建 SymmetricSecurityBindingElement 的一个实例,并将 KerberosSecurityTokenParameters 类的一个实例添加到 Endorsing 属性返回的集合中。

代码

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);
}

另请参阅