SspiAcceptSecurityContextAsync 函数 (sspi.h)

SspiAcceptSecurityContextAsync 函数允许传输应用程序的服务器组件在服务器和远程客户端之间异步建立安全上下文。 远程客户端调用 SspiInitializeSecurityContextAsync 函数以异步方式启动建立安全上下文的过程。

注意

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

语法

SECURITY_STATUS SspiAcceptSecurityContextAsync(
  SspiAsyncContext *AsyncContext,
  PCredHandle      phCredential,
  PCtxtHandle      phContext,
  PSecBufferDesc   pInput,
  unsigned long    fContextReq,
  unsigned long    TargetDataRep,
  PCtxtHandle      phNewContext,
  PSecBufferDesc   pOutput,
  unsigned long    *pfContextAttr,
  PTimeStamp       ptsExpiry
);

参数

AsyncContext

异步调用上下文。

phCredential

服务器凭据的句柄。 为了检索此句柄,服务器调用 SspiAcquireCredentialsHandleAsync 函数,并设置了 SECPKG_CRED_INBOUND 或 SECPKG_CRED_BOTH 标志。

phContext

指向 CtxtHandle 结构的指针。 首次调用 SspiAcceptSecurityContextAsync 时,此指针为 NULL。 在后续调用中, phContext 指定第一次调用在 phNewContext 参数中返回的部分格式上下文。

pInput

指向客户端调用 SspiInitializeSecurityContextAsync 生成的 SecBufferDesc 结构的指针。 结构包含输入缓冲区描述符。

第一个缓冲区的类型必须为 SECBUFFER_TOKEN ,并且包含从客户端接收的安全令牌。 第二个缓冲区的类型应为 SECBUFFER_EMPTY

fContextReq

指定服务器建立上下文所需的属性的位标志。

有关参数值的完整列表,请参阅 AcceptSecurityContext:fContextReq

TargetDataRep

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

phNewContext

指向 CtxtHandle 结构的指针。 首次调用 SspiAcceptSecurityContextAsync 时,此指针接收新的上下文句柄。 在后续调用中, phNewContext 可以与 phContext 参数中指定的句柄相同。

pOutput

指向包含输出缓冲区描述符 的 SecBufferDesc 结构的指针。 此缓冲区将发送到客户端,以便输入对 SspiInitializeSecurityContextAsync 的其他调用。 即使函数返回SEC_E_OK,也可能生成输出缓冲区。 生成的任何缓冲区都必须发送回客户端应用程序。

在输出时,此缓冲区接收异步安全上下文的令牌。 必须将令牌发送到客户端。 函数还可以返回 SECBUFFER_EXTRA 类型的缓冲区。

pfContextAttr

指向一组位标志的指针,这些标志指示已建立上下文的属性。

有关属性的说明,请参阅 AcceptSecurityContext:pfContextAttr

ptsExpiry

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

请参阅 AcceptSecurityContext: ptsExpiry

返回值

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

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

返回代码
说明
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
函数成功。 输入缓冲区中的数据不完整。 应用程序必须从客户端读取其他数据,并再次调用 SspiAcceptSecurityContextAsync。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
函数成功。 服务器必须调用 CompleteAuthToken 并将输出令牌传递给客户端。 然后,服务器必须等待来自客户端的返回令牌,然后再对 SspiAcceptSecurityContextAsync 进行另一次调用。
SEC_I_COMPLETE_NEEDED
0x00090313L
函数成功。 在调用 CompleteAuthToken 之前,服务器必须完成从客户端生成消息。
SEC_I_CONTINUE_NEEDED
0x00090312L
函数成功。 服务器必须将输出令牌发送到客户端,并等待返回的令牌。 返回的令牌应在 pInput 中传递,以便对 SspiAcceptSecurityContextAsync 进行另一次调用。

错误错误代码

返回代码
说明
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
函数失败。 phCredential 参数中指定的凭据句柄无效。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
函数失败。 fContextReq 参数指定了无效 (ASC_REQ_DELEGATE 或ASC_REQ_PROMPT_FOR_CREDS) 上下文属性标志。

注解

SspiAcceptSecurityContextAsync 函数是 SspiInitializeSecurityContextAsync 函数的服务器对应函数。

调用方负责确定最终上下文属性是否足够。 例如,如果已请求加密 (加密) ,但无法建立,则某些应用程序可能会选择立即关闭连接。 如果无法建立安全上下文,服务器必须通过调用 SspiDeleteSecurityContextAsync 函数释放部分创建的上下文。

有关其他备注,请参阅 AcceptSecurityContext

要求

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

另请参阅

AcceptSecurityContext

上下文要求

ImpersonateSecurityContext

SspiAcquireCredentialsHandleAsync

SspiDeleteSecurityContextAsync

SspiGetAsyncCallStatus