RPC_HTTP_TRANSPORT_CREDENTIALS_V3_W 结构 (rpcdce.h)

RPC_HTTP_TRANSPORT_CREDENTIALS_V3结构定义了其他凭据,以便在使用 RPC/HTTP 时向 RPC 代理服务器或 HTTP 代理服务器进行身份验证。

RPC_HTTP_TRANSPORT_CREDENTIALS_V3 允许使用任意凭据表单来扩展 RPC_HTTP_TRANSPORT_CREDENTIALS_V2

语法

typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_V3_W {
  RPC_AUTH_IDENTITY_HANDLE TransportCredentials;
  unsigned long            Flags;
  unsigned long            AuthenticationTarget;
  unsigned long            NumberOfAuthnSchemes;
  unsigned long            *AuthnSchemes;
  unsigned short           *ServerCertificateSubject;
  RPC_AUTH_IDENTITY_HANDLE ProxyCredentials;
  unsigned long            NumberOfProxyAuthnSchemes;
  unsigned long            *ProxyAuthnSchemes;
} RPC_HTTP_TRANSPORT_CREDENTIALS_V3_W, *PRPC_HTTP_TRANSPORT_CREDENTIALS_V3_W;

成员

TransportCredentials

指向 RPC_AUTH_IDENTITY_HANDLE 结构形式的不透明身份验证句柄的指针。

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

针对 HTTP 代理服务器进行身份验证时,指向 RPC_AUTH_IDENTITY_HANDLE 结构形式的不透明身份验证句柄的指针。 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 哈希在网络上公开用户凭据,仅当以下一个或两个条件为 true 时,才使用用户登录凭据:

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

要求

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

另请参阅

主体名称

RPC_HTTP_TRANSPORT_CREDENTIALS

RPC_HTTP_TRANSPORT_CREDENTIALS_V2

RPC_SECURITY_QOS

RPC_SECURITY_QOS_V2

RPC_SECURITY_QOS_V3

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

RpcBindingSetAuthInfoEx

RpcCertGeneratePrincipalName

SEC_WINNT_AUTH_IDENTITY