SspiInitializeSecurityContextAsyncW 函数 (sspi.h)

SspiInitializeSecurityContextAsyncW 函数从凭据句柄启动客户端出站安全上下文。 函数用于在客户端应用程序和远程对等方之间生成安全上下文。 SspiInitializeSecurityContextAsyncW 返回一个令牌,客户端必须传递给远程对等方,后者又通过 SspiAcceptSecurityContextAsync 调用提交到本地安全实现。

注意

此函数充当InitializeSecurityContext 函数的异步对应函数。

语法

SECURITY_STATUS SspiInitializeSecurityContextAsyncW(
  SspiAsyncContext *AsyncContext,
  PCredHandle      phCredential,
  PCtxtHandle      phContext,
  PSECURITY_STRING pszTargetName,
  unsigned long    fContextReq,
  unsigned long    Reserved1,
  unsigned long    TargetDataRep,
  PSecBufferDesc   pInput,
  unsigned long    Reserved2,
  PCtxtHandle      phNewContext,
  PSecBufferDesc   pOutput,
  unsigned long    *pfContextAttr,
  PTimeStamp       ptsExpiry
);

参数

AsyncContext

异步调用上下文。

phCredential

AcquireCredentialsHandle 返回的凭据的句柄。 此句柄用于生成 安全上下文

phContext

指向现有 CtxtHandle 结构的指针。

pszTargetName

指向以 null 结尾的字符串的指针,该字符串指示上下文的目标。 字符串内容特定于 安全包 ,如下表所述。 此列表并未囊括所有方式。 可以将其他系统 SSP 和第三方 SSP 添加到系统。

SSP 正在使用中 含义
摘要式 以 Null 结尾的字符串,用于唯一标识所请求资源的 URI。 字符串必须由 URI 中允许的字符组成,并且必须由 US ASCII 代码集表示。 百分比编码可用于表示美国 ASCII 代码集之外的字符。
Kerberos 或 Negotiate 服务主体名称 (SPN) 或目标服务器 的安全上下文
NTLM 服务主体名称 (SPN) 或目标服务器 的安全上下文
Schannel/SSL 唯一标识目标服务器的以 Null 结尾的字符串。 Schannel 使用此值来验证服务器证书。 重新建立连接时,Schannel 还使用此值在会话缓存中查找会话。 仅当满足以下所有条件时,才使用缓存的会话:
  • 目标名称相同。
  • 缓存项未过期。
  • 调用函数的应用程序进程是相同的。
  • 登录会话是相同的。
  • 凭据句柄是相同的。

fContextReq

指示上下文请求的位标志。

有关标志值及其含义的列表,请参阅 InitializeSecurityContext:fContextReq

Reserved1

此参数是保留的,必须设置为零。

TargetDataRep

目标上的数据表示形式,例如字节排序。 此参数可以是SECURITY_NATIVE_DREP或SECURITY_NETWORK_DREP。

pInput

指向 SecBufferDesc 结构的指针,该结构包含指向作为包输入提供的缓冲区的指针。

Reserved2

此参数是保留的,必须设置为零。

phNewContext

指向 CtxtHandle 结构的指针。

pOutput

指向 SecBufferDesc 结构的指针,该结构包含指向接收输出数据的 SecBuffer 结构的指针。

pfContextAttr

指向变量的指针,用于接收一组指示已建立上下文的属性的位标志。 有关各种属性的说明,请参阅 上下文要求

ptsExpiry

可选。 指向 TimeStamp 结构的指针,该结构接收上下文的过期时间。

返回值

如果建立安全上下文的异步请求已成功排队等待执行,则返回 SEC_E_OK ;否则,返回尝试将其排队时生成的错误。 若要检索操作的状态,请使用 SspiGetAsyncCallStatus

如果接受从服务器接收的安全上下文,SspiGetAsyncCallStatus 将返回 SEC_E_OK 或下表中的 SSPI 代码之一。 否则,如果调用仍在进行中,则可能会返回 SEC_I_ASYNC_CALL_PENDING ,或以下第二个表中的任一致命错误代码。

返回代码
说明
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
客户端必须调用 CompleteAuthToken 并将输出令牌传递给服务器。 然后,客户端等待返回的令牌,并在另一次调用中将其传递给 SspiInitializeSecurityContextAsyncA。
SEC_I_COMPLETE_NEEDED
0x00090313L
客户端必须在调用 CompleteAuthToken 之前完成从服务器生成消息。
SEC_I_CONTINUE_NEEDED
0x00090312L
客户端必须将输出令牌发送到服务器并等待返回令牌。 然后,在对 SspiInitializeSecurityContextAsyncA 的另一个调用中传递返回的令牌。 输出令牌可以为空。
SEC_I_INCOMPLETE_CREDENTIALS 与 Schannel 一起使用。 服务器已请求客户端身份验证,并且提供的凭据不包含证书,或者证书不是由服务器信任的证书颁发机构颁发的。
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
未从线路中读取整个消息的数据。 返回此值时,pInput 缓冲区包含一个 SecBuffer 结构,其 BufferType 成员为 SECBUFFER_MISSING。 SecBuffer 的 cbBuffer 成员包含一个值,该值指示此函数在函数成功之前必须从客户端读取的其他字节数。 虽然此数字并不总是准确的,但使用它可以通过避免多次调用此函数来帮助提高性能。
SEC_E_OK
0x00000000L
已接受从客户端接收的安全上下文。 如果函数生成了输出令牌,则必须将令牌发送到服务器。

严重错误代码

返回代码
说明
SEC_E_INSUFFICIENT_MEMORY
0x80090300L
没有足够的内存可用于完成请求的操作。
SEC_E_INTERNAL_ERROR
0x80090304L
发生了未映射到 SSPI 错误代码的错误。
SEC_E_INVALID_HANDLE
0x80100003L
传递给函数的句柄无效。
SEC_E_INVALID_TOKEN
0x80090308L
此错误是由于输入令牌格式不正确,例如令牌在传输中损坏、令牌大小不正确或令牌传递到错误的安全包中。 如果客户端和服务器未协商正确的安全包,则可能会将令牌传递给错误的包。
SEC_E_LOGON_DENIED
0x8009030CL
登录失败。
SEC_E_NO_AUTHENTICATING_AUTHORITY
0x80090311L
无法联系任何机构进行身份验证。 身份验证方的域名可能不正确,域无法访问,或者可能存在信任关系失败。
SEC_E_NO_CREDENTIALS
0x8009030EL
安全包中没有可用的凭据。
SEC_E_TARGET_UNKNOWN 无法识别目标。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
在 fContextReq 参数中指定了无效 (ISC_REQ_DELEGATE 或ISC_REQ_PROMPT_FOR_CREDS) 上下文属性标志。
SEC_E_WRONG_PRINCIPAL 接收身份验证请求的主体与传递到 pszTargetName 参数的主体不同。 这表示相互身份验证失败。

注解

有关完整备注,请参阅 InitializeSecurityContext

要求

要求
最低受支持的客户端 Windows 10版本 1607 [仅限内核模式驱动程序]
最低受支持的服务器 Windows Server 2016 [仅限内核模式驱动程序]
标头 sspi.h

另请参阅

SspiAcceptSecurityContextAsync

SspiAcquireCredentialsHandleAsync