为以后的模拟存储Kerberos身份验证

本文关键字:存储 Kerberos 身份验证 模拟 | 更新日期: 2023-09-27 18:17:53

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

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

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

既然我不能更改外部系统,也不能在队列中存储用户名和密码,那么当用户向队列添加新工作项时,我能否保存Kerberos票据,然后在服务将数据移交给外部系统时,由服务模拟用户?我如何在c#中做到这一点?

为以后的模拟存储Kerberos身份验证

  • 编辑:这是最接近你的实际问题:你能在模拟下启动一个单独的线程,从那里发出请求,不管需要多长时间?在后台,它将执行所需的操作(当然,除非服务进程被终止)。

就像一个微软的家伙曾经告诉我们的那样:"安全是在你部署应用程序时阻止它工作的东西"。(他的目的是用实际的安全设置进行测试)。

罚单的有效期可能是10小时,但这是从它发出时算起的时间。当用户发出请求时,它可能只剩下一小部分。

我建议你用另一种方法解决根本问题。

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

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

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

也许有可能保存它,但我认为这张票将是短暂的。不幸的是,您肯定会遇到Kerberos双跳问题,在服务之间的身份验证失败,除非您在网络上正确设置了委托。这将需要您在活动目录上设置一些SPN(服务主体名称),以告诉服务器相互信任。

我从未尝试过将Kerberos票据保存任何时间,因此即使在与委托和spn进行斗争之后,它也可能无法工作。

这里有一篇关于设置IIS7来处理双跳Kerberos票据的快速文章,还有一篇关于从网络的角度处理它的文章。

我希望我能提供更多的帮助,发布代码而不是文章——但是随着您的研究,您会发现这是Kerberos身份验证的祸根。好运!

此解决方案有一个很大的警告,但是您可以使用LsaLogonUser函数和约束委托来获取用于模拟的令牌,而无需提供凭据,此时工作已准备好退出队列。

这就是协议转换的实现方式,其中非windows凭据(例如在公共网站上)可以映射到被冒充访问内部资源的域用户。

警告是,这显然是一个巨大的潜在安全漏洞,并且运行调用LsaLogonUser的进程的帐户必须被授予SeTcbPrivilege("作为操作系统的一部分")。

如果有一种存储票证的方法,那显然会好得多,但当我看到这个问题时,我首先想到的是@Ben提到的过期时间问题。

编辑:关于协议转换和受限委托的几篇优秀文章,广泛地涵盖了所涉及的风险。