impersonateSecurityContext 函数 (sspi.h)

ImpersonateSecurityContext 函数允许服务器使用以前通过调用 AcceptSecurityContext (General) QuerySecurityContextToken 获取的令牌来模拟客户端。 此函数允许应用程序服务器充当客户端,因此强制实施所有必要的访问控制。

语法

KSECDDDECLSPEC SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(
  [in] PCtxtHandle phContext
);

参数

[in] phContext

要模拟的上下文的句柄。 此句柄必须已通过调用 AcceptSecurityContext (General) 函数获得。

返回值

如果函数成功,该函数将返回SEC_E_OK。

如果该函数失败,它将返回以下错误代码。

返回代码 说明
SEC_E_INVALID_HANDLE
传递给函数的句柄无效。
SEC_E_NO_IMPERSONATION
无法模拟客户端。
SEC_E_UNSUPPORTED_FUNCTION
此值由 Schannel 内核模式返回,指示不支持此函数。

注解

服务器应用程序在需要模拟客户端时调用 ImpersonateSecurityContext 函数。 在此之前,服务器必须已获取有效的上下文句柄。 若要获取上下文句柄,服务器必须调用 AcceptSecurityContext (General) ,以将客户端的传入安全令牌提交到安全系统。 如果验证入站上下文,服务器将获取上下文句柄。 函数创建 模拟令牌 ,并允许线程或进程与模拟上下文一起运行。

使用 Schannel 安全支持提供程序 (SSP) 时,服务器应用程序必须在调用 AcceptSecurityContext (General) 时传递 ASC_REQ_MUTUAL_AUTH 标志。 这可确保在 SSL/TLS 握手期间要求客户端提供客户端证书。 收到客户端证书后,Schannel 包会验证客户端证书,并尝试将其映射到用户帐户。 如果此映射成功,则会创建客户端用户令牌,并且此函数成功。

应用程序服务器必须在完成或需要还原自己的安全上下文时调用 RevertSecurityContext 函数。

ImpersonateSecurityContext 不适用于所有平台上的所有 安全包 。 通常,它仅在平台和支持模拟的安全包上实现。 若要了解安全包是否支持模拟,请调用 QuerySecurityPackageInfo 函数。

注意 如果 ImpersonateSecurityContext 函数失败,则不会模拟客户端,并且所有后续客户端请求都在调用函数的进程的安全上下文中发出。 如果调用进程作为特权帐户运行,它可以执行不允许客户端执行的操作。 为了避免安全风险,调用进程应始终检查返回值。 如果返回值指示函数调用失败,则不应执行任何客户端请求。
 
所有模拟函数(包括 ImpersonateSecurityContext )都允许请求的模拟(如果以下情况之一为 true):
  • 请求的令牌模拟级别小于 SecurityImpersonation,例如 SecurityIdentificationSecurityAnonymous
  • 调用方具有 SeImpersonatePrivilege 特权。
  • 调用方登录会话中的进程 (或另一个进程) 通过 LogonUserLsaLogonUser 函数使用显式凭据创建令牌。
  • 经过身份验证的标识与调用方相同。
具有 SP1 及更早版本的 Windows XP: 不支持 SeImpersonatePrivilege 特权。

Windowsxp: 在 Windows XP service Pack 2 (SP2) 之前,不支持 SeImpersonatePrivilege 特权。

要求

   
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 sspi.h (包括 Security.h)
Library Secur32.lib
DLL Secur32.dll

另请参阅

AcceptSecurityContext (常规)

QuerySecurityPackageInfo

RevertSecurityContext

SSPI 函数