是否可以存储Kerberos票证以便以后使用它来模拟用户?
我有一个用户直接调用外部系统来处理某些数据的场景。外部系统依赖于在AD中正确模拟/验证用户。
现在,调用系统必须进行更改,以便队列位于用户和外部系统之间,并且队列中的工作由Windows服务从该队列移交给外部系统。 此服务需要模拟用户,以便外部系统正确处理用户权限。
鉴于我无法更改外部系统且无法将用户名和密码存储在队列中,我可以在用户将新工作项添加到队列中时保存Kerberos票证,然后在服务时模拟用户它将数据移交给外部系统。我怎么能在C#中做到这一点?
答案 0 :(得分:1)
正如一位微软家伙曾经告诉我们的那样“安全就是让你的应用程序在部署时停止运行的东西”。 (他的观点是用真实的安全设置进行测试)。
故障单可能有10个小时的生命周期,但这是从发布之日起的时间。在用户提出请求时,它可能只剩下一小部分。
我建议你以不同的方式解决潜在的问题。
您现在需要排队的原因是什么?仅仅因为外部服务在高峰期被窒息?
在不知道实际问题的情况下,很难建议,除了说不要这样做 - 太多陷阱了。
答案 1 :(得分:0)
有可能保存它,但我认为这张票很短暂。不幸的是,除非您在网络上正确设置了委托,否则您肯定会遇到身份验证因服务而失败的Kerberos double-hop issue。这将要求您在活动目录中设置一些SPN(服务主体名称),以告知服务器相互信任。
我从未试图在任何时间内保存Kerberos门票,所以即使在与代表团和SPN打架之后,它也可能无效。
这里有关于设置IIS7 to handle double hop Kerberos tickets的快速帖子和关于handling it from the networks point of view的另一篇文章。
我希望我可以提供更多帮助,发布代码而不是发表文章 - 但在您调查时,您会发现这是Kerberos身份验证的祸根。祝你好运!
答案 2 :(得分:0)
此解决方案带有一个巨大的警告,但您可以使用LsaLogonUser函数和约束委派来获取模拟而无需提供凭据,而不是存储令牌/票证,工作准备出发的那一刻。
这是协议转换的实现方式,其中非Windows凭据(例如在公共网站上)可以映射到模拟访问内部资源的域用户。
需要注意的是,这显然是一个巨大的潜在安全漏洞,并且必须授予运行调用LsaLogonUser
的进程的帐户SeTcbPrivilege
(“作为操作系统的一部分”)。
如果有办法存储机票,那显然会好得多,但是当我看到问题时,我想到的第一件事是@Ben提到的到期时间问题。
编辑: A couple excellent articles {{3}}关于协议转换和约束授权,并广泛报道所涉及的风险。