存储Kerberos身份验证以供以后模拟

时间:2011-12-15 14:18:38

标签: c# .net authentication active-directory kerberos

是否可以存储Kerberos票证以便以后使用它来模拟用户?

我有一个用户直接调用外部系统来处理某些数据的场景。外部系统依赖于在AD中正确模拟/验证用户。

现在,调用系统必须进行更改,以便队列位于用户和外部系统之间,并且队列中的工作由Windows服务从该队列移交给外部系统。 此服务需要模拟用户,以便外部系统正确处理用户权限。

鉴于我无法更改外部系统且无法将用户名和密码存储在队列中,我可以在用户将新工作项添加到队列中时保存Kerberos票证,然后在服务时模拟用户它将数据移交给外部系统。我怎么能在C#中做到这一点?

3 个答案:

答案 0 :(得分:1)

  • 编辑:这是我能够找到您最接近实际问题的内容:您是否可以在模拟下启动单独的帖子,从那里发出请求,无论需要多长时间?在封面下,这将完成所需(除非服务流程当然终止)。

正如一位微软家伙曾经告诉我们的那样“安全就是让你的应用程序在部署时停止运行的东西”。 (他的观点是用真实的安全设置进行测试)。

故障单可能有10个小时的生命周期,但这是从发布之日起的时间。在用户提出请求时,它可能只剩下一小部分。

我建议你以不同的方式解决潜在的问题。

您现在需要排队的原因是什么?仅仅因为外部服务在高峰期被窒息?

  • 你能加强或扩展硬件吗?通常是最便宜的方式。
  • 您实际上是否具有完全独立的权限,或者是否将用户插入有限数量的角色?如果角色您可以记录用户所在的角色,并使用专门创建的用户名来访问外部服务,则每个角色都有一个。
  • 外部服务是你的吗?你可以添加一个“假装成Bob”选项,不依赖于Windows模拟吗?
  • 您是否可以在模拟下启动单独的线程,从那里发出请求,但需要多长时间?然后邮寄给用户? (是的,这将根据你的要求进行。)
  • 最后,您可以将用户置于浏览器“配给队列”中。即使用数字发出它们,然后让浏览器每10秒刷新一次(或使用Ajax)告诉他们队列中有多少人在他们前面。当轮到他们时,请在模仿下提出实际请求。 (这要求他们在队列中等待时保持浏览器窗口打开,并且还要求您跟踪未完成的请求和活动浏览器与已离开的浏览器。讨厌,但会奏效。

在不知道实际问题的情况下,很难建议,除了说不要这样做 - 太多陷阱了。

答案 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}}关于协议转换和约束授权,并广泛报道所涉及的风险。