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 意义
摘要 唯一标识所请求资源的 URI 的以 Null 结尾的字符串。 字符串必须由 URI 中允许的字符组成,并且必须由美国 ASCII 代码集表示。 百分比编码可用于表示美国 ASCII 代码集之外的字符。
Kerberos 或协商 服务主体名称(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