我需要使用SSPI在Windows上为我们的C ++ HTTP服务器产品支持Kerberos约束委派。
对于单个流程服务器,可以使用follow工作流程,并且我有一个有效的原型。 1)调用AcquireCredentialsHandle 2)调用AcceptSecurityContext 3)调用ImpersonateSecurityContext 4)做委托 5)调用RevertSecurityContext
但是,C ++ HTTP服务器具有一个主进程和一个辅助进程。这两个进程都在同一台计算机上运行并使用相同的服务帐户,并且每个客户端请求可以来自不同的用户。主进程可以使用AcquireCredentialsHandle和AcceptSecurityContext处理SPNEGO和Kerberos身份验证,但是它不知道需要委派哪个资源,只有工作进程才知道。 我可以使用哪些SSPI将客户端的安全上下文转发给工作人员,以便工作人员可以进行模拟/委派?
似乎一种可能的解决方案是在主服务器中获取客户的身份,并将其转让给工作人员;然后在工作进程中使用LsaLogonUser和ImpersonateLoggedOnUser。但是,由于LsaLogonUser允许不使用密码登录,因此我们的安全专家强烈反对使用它。
SSPI还具有ExportSecurityContext和ImportSecurityContext,但是文档非常模糊,不确定是否可以解决我的用例。由于ImpersonateSecurityContext文档说“它允许服务器使用以前通过调用AcceptSecurityContext(常规)或QuerySecurityContextToken获得的令牌来模拟客户端。”,看来我在ImportSecurityContext之后无法调用ImpersonateSecurityContext。
任何建议都值得赞赏。
答案 0 :(得分:2)
您需要做的是在父进程中获取令牌的句柄,并将其复制到子进程中。
您可以这样做:
在父流程中,通常会调用ImpersonateSecurityContext
。这将设置您的身份。然后调用QuerySecurityContextToken
获取该标识令牌的句柄。一旦有了句柄调用DuplicateHandle
,但是目标进程是子进程的句柄。返回的lpTargetHandle
是 target 进程(子进程)中本地引用的句柄。您将了解如何需要将此值转移到目标进程。
一旦子进程具有句柄值,您可以调用ImpersonateLoggedOnUser
传递句柄值。此时,本地身份应该是有问题的用户,并且在创建新上下文时任何出站呼叫都将使用该身份。
请记住,尽管子进程将需要SeImpersonatePrivilege。