2011-12-15 26 views
10

是否可以存储Kerberos票证以便稍后用它来模拟用户?存储Kerberos身份验证供以后模拟使用

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

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

鉴于我无法更改外部系统,也无法将用户名和密码存储在队列中,所以当用户将新工作项添加到队列中并随后通过服务模拟用户时,可以保存Kerberos票证吗?当它将数据交给外部系统时。我将如何在C#中做到这一点?

+1

你的服务正在使用哪种队列?系统消息队列,MSMQ?因为如果您正在使用的队列基于RPC,则您的服务可以模拟最终用户。 – JPBlanc 2011-12-20 05:56:06

+0

SQL Service Broker队列。 – GaussZ 2011-12-20 09:33:30

回答

0

它可能可以保存它,但我认为票证将是短暂的。不幸的是,您一定会遇到Kerberos double-hop issue,其中身份验证在服务到服务之间失败,除非您的委派在网络上正确设置。这将要求您在活动目录中设置一些SPN(服务主体名称),以告诉服务器互相信任。

我从来没有试图将Kerberos票据保存任何时间长度,所以即使与代表团和SPN战斗后,它也可能无法工作。

下面是关于设置IIS7 to handle double hop Kerberos tickets和另一篇文章handling it from the networks point of view的快速文章。

我希望我能提供更多的帮助,并发布代码而不是文章 - 但正如你调查你会发现这是Kerberos身份验证的祸根。祝你好运!

+0

感谢您的评论,但双跳问题应该照顾。唯一缺少的是获取代码中的Kerberos票证并将其存储以供以后重新模拟。 – GaussZ 2011-12-15 14:49:01

1
  • 编辑:这是最接近我能得到你的实际的问题:你可以启动一个单独的线程下的模拟,使从那里请求,但需要多长时间?在封面下面,这将做需要的事情(除非服务过程当然被终止)。

正如一位微软人士曾经告诉我们的,“安全是当你部署它时停止你的应用程序工作的东西”。 (他的观点是用现实的安全设置进行测试)。

门票可能有10个小时的使用期限,但是从签发时起算。它可能只有用户发出请求时的剩余部分。

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

你现在需要排队的原因是什么?仅仅因为外部服务在高峰时段被阻塞了?

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

不知道实际的问题,很难说,除了说不这样做 - 太多陷阱。

0

该解决方案配备了一个巨大的警告,但不是存储令牌/票,您可以使用LsaLogonUser功能和约束委派,以获得模拟令牌不提供凭据,此刻的工作就是随时可以出队。

这是如何实现协议转换的,其中可以将非Windows凭据(例如公共网站上)映射到模拟访问内部资源的域用户。

需要注意的是,这显然是一个巨大的潜在安全漏洞,并且运行调用LsaLogonUser的进程的帐户必须被授予SeTcbPrivilege(“充当操作系统的一部分”)。

如果有存储票的方式,那显然会好很多,但是当我看到问题时我首先想到的是@Ben提到的到期时间问题。

编辑: A coupleexcellent articles关于协议转换和约束委托,涉及广泛的覆盖范围。