我需要使用 SSPI 在 Windows 上支持我们的 C++ HTTP 服务器产品的 Kerberos 约束委派。
对于单个进程服务器,可以使用以下工作流程,并且我有一个工作原型。1) 调用 AcquireCredentialsHandle 2) 调用 AcceptSecurityContext 3) 调用 ImpersonateSecurityContext 4) 做委托 5) 调用 RevertSecurityContext
但是,C++ HTTP 服务器有一个主进程和一个工作进程。两个进程在同一台机器上运行并使用相同的服务帐户,并且每个客户端请求都可以来自不同的用户。主进程可以使用 AcquireCredentialsHandle 和 AcceptSecurityContext 处理 SPNEGO 和 Kerberos 身份验证,但它不知道它需要委派哪个资源,只有工作进程知道。我可以使用哪些 SSPI 将客户端的安全上下文转发给工作人员,以便工作人员可以进行模拟/委托?
似乎一种可能的解决方案是在主人中获取客户的身份,将其转移给工人;然后在工作人员中使用 LsaLogonUser 和 ImpersonateLoggedOnUser。但是,由于 LsaLogonUser 允许无密码登录,我们的安全专家强烈反对使用它。
SSPI 也有 ExportSecurityContext 和 ImportSecurityContext,但是文档很模糊,不确定它是否可以解决我的用例。由于 ImpersonateSecurityContext 文档说它“允许服务器通过使用先前通过调用 AcceptSecurityContext (General) 或 QuerySecurityContextToken 获得的令牌来模拟客户端。”,看来我不能在 ImportSecurityContext 之后调用 ImpersonateSecurityContext。
任何建议表示赞赏。