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

服务器凭据的句柄。 若要检索此句柄,服务器将使用SECPKG_CRED_INBOUND或SECPKG_CRED_BOTH标志集调用 SspiAcquireCredentialsHandleAsync 函数。

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