【发布时间】:2018-08-07 20:37:50
【问题描述】:
我需要在 Windows 上使用 SSPI 支持我们的 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。
欢迎提出任何建议。
【问题讨论】: