SspiInitializeSecurityContextAsyncA 函数 (sspi.h)
SspiInitializeSecurityContextAsyncA 函数从凭据句柄启动客户端出站 安全上下文。 该函数用于在客户端应用程序和远程对等方之间生成安全上下文。 SspiInitializeSecurityContextAsyncA 返回客户端必须传递给远程对等方的令牌,而对等方又通过 SspiAcceptSecurityContextAsync 调用提交到本地安全实现。
注意
此函数充当与 InitializeSecurityContext 函数的异步对应项。
语法
SECURITY_STATUS SspiInitializeSecurityContextAsyncA(
SspiAsyncContext *AsyncContext,
PCredHandle phCredential,
PCtxtHandle phContext,
LPSTR 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 |