RPC_HTTP_TRANSPORT_CREDENTIALS_V2_A 结构 (rpcdce.h)

RPC_HTTP_TRANSPORT_CREDENTIALS_V2结构定义使用 RPC/HTTP 时向 RPC 代理服务器或 HTTP 代理服务器进行身份验证的其他凭据。

RPC_HTTP_TRANSPORT_CREDENTIALS_V2 通过允许对 HTTP 代理服务器进行身份验证来扩展 RPC_HTTP_TRANSPORT_CREDENTIALS

语法

typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_V2_A {
  SEC_WINNT_AUTH_IDENTITY_A *TransportCredentials;
  unsigned long             Flags;
  unsigned long             AuthenticationTarget;
  unsigned long             NumberOfAuthnSchemes;
  unsigned long             *AuthnSchemes;
  unsigned char             *ServerCertificateSubject;
  SEC_WINNT_AUTH_IDENTITY_A *ProxyCredentials;
  unsigned long             NumberOfProxyAuthnSchemes;
  unsigned long             *ProxyAuthnSchemes;
} RPC_HTTP_TRANSPORT_CREDENTIALS_V2_A, *PRPC_HTTP_TRANSPORT_CREDENTIALS_V2_A;

成员

TransportCredentials

指向 SEC_WINNT_AUTH_IDENTITY 结构的指针,该结构包含用户的用户名、域和密码。

Flags

可与按位 OR 运算符组合的一组标志。

含义
RPC_C_HTTP_FLAG_USE_SSL
指示 RPC 使用 SSL 与 RPC 代理通信。
RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME
设置后,RPC 选择 AuthnSchemes 数组中的第一个方案,并尝试向 RPC 代理进行身份验证。 如果 RPC 代理不支持所选的身份验证方案,则调用将失败。 如果未设置,RPC 客户端将查询 RPC 代理以获取支持的身份验证方案,并选择一个方案。

AuthenticationTarget

指定身份验证目标。

应设置为以下一个或两个值:

含义
RPC_C_HTTP_AUTHN_TARGET_SERVER
针对 RPC 代理进行身份验证,从 HTTP 的角度来看,该代理是 HTTP 服务器。 这是最常见的值。
RPC_C_HTTP_AUTHN_TARGET_PROXY
针对 HTTP 代理进行身份验证。 此值不常见。

NumberOfAuthnSchemes

AuthnScheme 数组中的元素数。

AuthnSchemes

指向客户端愿意使用的身份验证方案数组的指针。 数组的每个元素都可以包含以下常量之一:

RPC_C_HTTP_AUTHN_SCHEME_BASIC

RPC_C_HTTP_AUTHN_SCHEME_NTLM

RPC_C_HTTP_AUTHN_SCHEME_PASSPORT

RPC_C_HTTP_AUTHN_SCHEME_DIGEST

RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE

RPC_C_HTTP_AUTHN_SCHEME_PASSPORT、RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE和RPC_C_HTTP_AUTHN_SCHEME_DIGEST定义为常量,但当前不受支持。 调用方不应指定它们;这样做会导致RPC_S_CANNOT_SUPPORT错误。 每个常量可以指定一次。 RPC 不会出于性能原因验证此限制,但多次指定常量会产生未定义的结果。

用于选择实际身份验证方案的算法如下所示:

如果指定了RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME,则选择第一个身份验证方案。 如果服务器不支持,则建立连接会失败。 如果未指定RPC_C_HTTP_FLAG_USE_FIRST_AUTH_SCHEME,则 RPC 客户端首先尝试匿名连接到 RPC 代理。 如果 IIS 返回身份验证质询,则 RPC 客户端会选择服务器首选的身份验证方案(如果它也在 AuthnScheme 数组中)。 如果服务器首选的方案不在 AuthnScheme 数组中,则将从头到尾遍历 AuthnScheme 数组,如果找到服务器也支持的方案,则使用该身份验证方案。

ServerCertificateSubject

包含具有预期服务器主体名称的可选字符串。 主体名称的格式与为 RpcCertGeneratePrincipalName 生成的相同格式 (请参阅 主体名称 ,了解) 的详细信息。 仅当使用 SSL 时,才使用此成员。 在这种情况下,将对照生成的主体名称检查服务器证书。 如果不匹配,则返回错误。 此成员使客户端能够对 RPC 代理进行身份验证。

ProxyCredentials

指向 SEC_WINNT_AUTH_IDENTITY 结构的指针,该结构包含针对 HTTP 代理服务器进行身份验证时用户的用户名、域和密码。 ProxyCredentials 仅在 AuthenticationTarget 包含 RPC_C_HTTP_AUTHN_TARGET_PROXY时才有效。

NumberOfProxyAuthnSchemes

针对 HTTP 代理服务器进行身份验证时 ,ProxyAuthnSchemes 数组中的元素数。 NumberOfProxyAuthnSchemes 仅在 AuthenticationTarget 包含 RPC_C_HTTP_AUTHN_TARGET_PROXY时才有效。

ProxyAuthnSchemes

指向客户端在对 HTTP 代理服务器进行身份验证时愿意使用的身份验证方案数组的指针。 数组的每个元素都可以包含以下常量之一。 ProxyAuthnSchemes 仅在 AuthenticationTarget 包含 RPC_C_HTTP_AUTHN_TARGET_PROXY时才有效。

RPC_C_HTTP_AUTHN_SCHEME_BASIC

RPC_C_HTTP_AUTHN_SCHEME_NTLM

RPC_C_HTTP_AUTHN_SCHEME_PASSPORT

RPC_C_HTTP_AUTHN_SCHEME_DIGEST

RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE

注解

如果 TransportCredentials 成员为 NULL 且身份验证方案为 NTLM,则使用当前登录用户的凭据。 为了避免通过弱 LM 哈希在网络上公开用户凭据,仅当以下一个或两个条件成立时,才使用用户登录凭据:

  • 调用方请求使用 SSL 并使用 ServerCertificateSubject 成员。 此方案保证凭据在传输过程中和最终目标位置都受到保护,即使使用了弱哈希。
  • lncompatibilitylevel 键设置为 2 或更高。 这会导致 NTLM 安全提供程序仅发出或响应强 NT 哈希,而不是弱 LM 哈希。 此外,建议客户使用级别 3 或更高级别,这将尝试 NTLMv2。
如果使用 RpcBindingSetAuthInfoEx 函数的 Unicode 版本,还必须提供RPC_HTTP_TRANSPORT_CREDENTIALS_V2SEC_WINNT_AUTH_IDENTITY结构的 Unicode 版本,并且 TransportCredentials 中的 Flags 成员必须设置为SEC_WINNT_AUTH_IDENTITY_UNICODE。 如果使用 RPCBindingSetAuthInfoEx 函数的 ANSI 版本,则必须提供 RPC_HTTP_TRANSPORT_CREDENTIALS_V2SEC_WINNT_AUTH_IDENTITY 结构的 ANSI 版本,并且 TransportCredentials 中的 Flags 成员必须设置为 SEC_WINNT_AUTH_IDENTITY_ANSI。

要求

   
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
标头 rpcdce.h (包括 Rpc.h)

请参阅

主体名称

RPC_HTTP_TRANSPORT_CREDENTIALS

RPC_HTTP_TRANSPORT_CREDENTIALS_V3

RPC_SECURITY_QOS

RPC_SECURITY_QOS_V2

RPC_SECURITY_QOS_V3

使用 HTTP 代理上的 RPC 的远程过程调用

RpcBindingSetAuthInfoEx

RpcCertGeneratePrincipalName

SEC_WINNT_AUTH_IDENTITY