凭据 是 Windows Communication Foundation (WCF) 用于确定声明身份或能力的数据。 例如,护照是政府用来证明国家或地区公民身份的凭据。 在 WCF 中,凭据可以采用多种形式,例如用户名令牌和 X.509 证书。 本主题讨论凭据、WCF 中的用法以及如何为应用程序选择正确的凭据。
在许多国家和地区,驾驶执照是凭据的一个示例。 许可证包含表示人员身份和功能的数据。 它以拥有者图片的形式包含所有权证明。 许可证由受信任的颁发机构颁发,通常是政府部门的许可。 许可证已密封,可以包含全息影像,显示它未被篡改或伪造。
提交凭据涉及出示数据以及数据的所有权证明。 WCF 支持传输和消息安全级别的各种凭据类型。 例如,考虑 WCF 中支持的两种类型的凭据:用户名和 (X.509) 证书凭据。
对于用户名凭据,用户名表示声明的标识,密码提供所有权证明。 在这种情况下,受信任的权威是验证用户名和密码的系统。
使用 X.509 证书凭据时,证书中的使用者名称、使用者可选名称或特定字段可用作标识声明,而其他字段(如 Valid From 和 Valid To 字段)则指定证书的有效性。
传输凭据类型
在传输安全模式下,以下表格展示了绑定可使用的客户端凭据类型。 创建服务时,将 ClientCredentialType 属性设置为以下值之一,以指定客户端必须提供的凭据类型以与服务通信。 可以在代码或配置文件中设置类型。
| 设置 | DESCRIPTION |
|---|---|
| 没有 | 指定客户端不需要提供任何凭据。 这相当于匿名客户端。 |
| 基本 | 指定客户端的基本身份验证。 有关详细信息,请参阅RFC2617 - HTTP 身份验证:基本身份验证和摘要式身份验证。 |
| 摘要 | 为客户端指定摘要式身份验证。 有关详细信息,请参阅RFC2617 - HTTP 身份验证:基本身份验证和摘要式身份验证。 |
| Ntlm | 指定 NT LAN 管理器 (NTLM) 身份验证。 出于某种原因无法使用 Kerberos 身份验证时,将使用此身份验证。 还可以通过将 AllowNtlm 属性设置为 false 来禁止将其用作回退身份验证,这将使 WCF 在使用 NTLM 时尽可能引发异常。 请注意,将此属性 false 设置为不能阻止通过网络发送 NTLM 凭据。 |
| Windows操作系统 | 指定 Windows 身份验证。 若要仅指定 Windows 域中的 Kerberos 协议,请将 AllowNtlm 属性设置为 false (默认值为 true) 。 |
| 证书 | 使用 X.509 证书执行客户端身份验证。 |
| 密码 | 用户必须提供用户名和密码。 使用 Windows 身份验证或其他自定义解决方案验证用户名/密码对。 |
消息客户端凭据类型
下表显示了创建使用消息安全性的应用程序时可以使用的可能凭据类型。 可以在代码或配置文件中使用这些值。
| 设置 | DESCRIPTION |
|---|---|
| 没有 | 指定客户端不需要提供凭据。 这相当于匿名客户端。 |
| Windows操作系统 | 允许 SOAP 消息交换发生在使用 Windows 凭据建立的安全上下文下。 |
| 用户名 | 允许服务要求使用用户名凭据对客户端进行身份验证。 请注意,WCF 不允许任何具有用户名的加密作,例如生成签名或加密数据。 WCF 可确保在使用用户名凭据时保护传输。 |
| 证书 | 允许服务要求使用 X.509 证书对客户端进行身份验证。 |
| 已颁发的令牌 | 根据安全策略配置的自定义令牌类型。 默认令牌类型为安全断言标记语言(SAML)。 令牌由安全令牌服务颁发。 有关详细信息,请参阅联合身份验证和颁发的标记。 |
服务凭据的协商模型
协商 是通过交换凭据在客户端和服务之间建立信任的过程。 该过程在客户端和服务之间以迭代方式执行,以便仅披露协商过程中下一步所需的信息。 实际上,最终结果是将服务的凭据传递到客户端,供后续作使用。
但有一个例外,默认情况下,WCF 中系统提供的绑定在使用消息级安全性时会自动协商服务凭据。 例外是BasicHttpBinding,默认情况下不启用安全性。若要禁用此行为,请参阅NegotiateServiceCredential和NegotiateServiceCredential属性。
注释
当 SSL 安全性与 .NET Framework 3.5 及更高版本一起使用时,WCF 客户端使用证书存储中的中间证书和 SSL 协商期间收到的中间证书对服务的证书执行证书链验证。 .NET Framework 3.0 仅使用本地证书存储中安装的中间证书。
带外协商
如果禁用自动协商,则必须在客户端预配服务凭据,然后才能将任何消息发送到服务。 这也称为“带外”配置。 例如,如果指定的凭据类型是证书,并且禁用了自动协商,则客户端必须联系服务所有者,以便在运行客户端应用程序的计算机上安装证书。 例如,当你想要严格控制哪些客户端可以在企业到企业方案中访问服务时,可以执行此作。 此带外协商可以通过电子邮件完成,X.509证书存储在Windows证书库中,可以使用如Microsoft管理控制台(MMC)中的证书插件等工具进行操作。
注释
ClientCredentials 属性用于提供使用证书的服务,该证书通过带外协商实现。 使用 BasicHttpBinding 类时,这是必需的,因为绑定不允许自动协商。 该属性还可用于不相关的双工方案中。 这是一种情况,即服务器将消息发送到客户端,而无需客户端先向服务器发送请求。 由于服务器没有来自客户端的请求,因此它必须使用客户端的证书对消息进行加密。
设置凭据参数值
选择安全模式后,必须指定实际凭据。 例如,如果凭据类型设置为“certificate”,则必须将特定凭据(例如特定的 X.509 证书)与服务或客户端相关联。
根据是对服务还是客户端进行编程,设置凭据值的方法略有不同。
设置服务凭据
如果使用传输模式,并且使用 HTTP 作为传输,则必须使用 Internet Information Services (IIS)或配置具有证书的端口。 有关详细信息,请参阅 传输安全概述 和 HTTP 传输安全性。
若要使用代码中的凭据预配服务,请创建类的 ServiceHost 实例,并使用 ServiceCredentials 该类指定相应的凭据,通过 Credentials 属性进行访问。
设置证书
若要使用 X.509 证书(用于对客户端的服务进行身份验证)配置服务,则使用 SetCertificate 类的 X509CertificateRecipientServiceCredential 方法。
若要使用客户端证书配置服务,则使用 SetCertificate 类的 X509CertificateInitiatorServiceCredential 方法。
设置 Windows 凭据
如果客户端指定有效的用户名和密码,则使用该凭据对客户端进行身份验证。 否则,使用当前已登录用户的凭据。
设置客户端凭据
在 WCF 中,客户端应用程序使用 WCF 客户端连接到服务。 每个客户端都派生自 ClientBase<TChannel> 该类,客户端 ClientCredentials 上的属性允许规范客户端凭据的各种值。
设置证书
为了使用 X.509 证书进行客户端到服务的身份验证,请使用 SetCertificate 类的 X509CertificateInitiatorClientCredential 方法预配服务。
如何使用客户端凭据对服务客户端进行身份验证
使用 ClientCredentials 属性或 Credentials 属性提供与服务通信所需的客户端凭据信息。 安全通道使用此信息向服务验证客户端。 身份验证是通过以下两种模式之一完成的:
在发送第一条消息之前使用一次客户端凭据,使用 WCF 客户端实例建立安全上下文。 然后,所有应用程序消息都会通过安全上下文进行保护。
客户端凭据用于对发送到服务的每个应用程序消息进行身份验证。 在这种情况下,客户端和服务之间没有建立上下文。
无法更改已建立的身份
使用第一种方法时,已建立的上下文将永久关联到客户端标识。 也就是说,建立安全上下文后,无法更改与客户端关联的标识。
重要
无法切换标识时,要格外注意一种情况(即启用建立安全上下文时的默认行为)。 如果创建与第二个服务通信的服务,则无法更改用于向第二个服务打开 WCF 客户端的标识。 如果允许多个客户端使用第一个服务,并且服务在访问第二个服务时模拟客户端,则会出现此问题。 如果服务对所有调用方重复使用同一客户端,则对第二个服务的调用都是在用于向第二个服务打开客户端的第一个调用方标识下完成的。 换句话说,服务使用第一个客户端的标识来使其所有客户端与第二个服务进行通信。 这可能会导致特权提升。 如果这不是服务所需的行为,则必须跟踪每个调用方,并为每个不同的调用方创建第二个服务的新客户端,并确保该服务仅使用正确的客户端,让正确的调用方与第二个服务通信。
有关凭据和安全会话的详细信息,请参阅 安全会话的安全注意事项。
另请参阅
- System.ServiceModel.ClientBase<TChannel>
- ClientBase<TChannel>.ClientCredentials
- ClientCredentials.ClientCertificate
- BasicHttpMessageSecurity.ClientCredentialType
- HttpTransportSecurity.ClientCredentialType
- MessageSecurityOverHttp.ClientCredentialType
- MessageSecurityOverMsmq.ClientCredentialType
- MessageSecurityOverTcp.ClientCredentialType
- TcpTransportSecurity.ClientCredentialType
- X509CertificateInitiatorClientCredential.SetCertificate
- X509CertificateInitiatorServiceCredential.SetCertificate
- 安全概念
- 保护服务和客户端
- 对 WCF 安全性进行编程
- HTTP 传输安全性