C# 模拟 AD 用户

Posted

技术标签:

【中文标题】C# 模拟 AD 用户【英文标题】:C# Impersonation of an AD user 【发布时间】:2014-10-16 11:07:11 【问题描述】:

这是一个我需要帮助的场景:

客户端将文件传递给 Web 服务,该服务将它们存储在一个唯一生成的文件夹中(仅用于该操作)。 Web 服务将有关该文件的信息(位置、健康状况等)保存在数据库中。 Windows 服务(作为系统运行)经常检查该数据库以查找处理文件的更改。 这些文件将存储在单独的数据库(如库)中以供以后使用。 此操作需要通过将文件上传到 Web 服务的用户来完成。 我通过传递令牌尝试了不带密码的模拟,但我从来没有让它工作。

是否有机会在没有密码的情况下模拟 Active Directory 用户以作为该特定用户启动操作?

【问题讨论】:

谢天谢地,它不起作用!或者任何黑客或恶意管理员都可以伪造用户的身份。您应该找到一种无需密码即可传递用户身份的方法。社交应用 API 通过发布特定于用户的令牌来执行此操作,该令牌会在一段时间后过期。 好吧,模拟确实在有限的情况下起作用,因为在管理凭据下运行的服务器应用程序有合法的需求来执行需要验证的操作(由操作系统)反对用户实际拥有的权限。显然,模拟是一种受限制的特权,请注意管理员可以总是“伪造用户的身份”——他们拥有所有可用的工具来这样做。 嗯...为什么必须是执行文件操作的实际用户帐户?通常我们让服务器执行此操作,并将发出操作请求的 AD 帐户记录到某种审计日志中。不知道你想在这里完成什么,似乎有点奇怪。 @PanagiotisKanavos 因为服务器端没有允许通过社交应用程序进行身份验证的 API。此外,该网络是“军事区”,因此无法访问互联网。 @code4life 用于服务器上的客户端。它带有一个接口,我必须通过需要特定用户身份验证的服务调用。这主要用于记录,因此您可以看到每个用户在他们的客户上做了什么。遗憾的是,界面上只有两种身份验证方法:通过 Windows 身份验证或用户名和密码。 【参考方案1】:

这几乎肯定不能使用模拟来实现,原因是模拟需要跨每个功能的端到端支持才能获得结果。在这种情况下,这意味着到数据库的整个连接堆栈都需要支持模拟,而几乎可以肯定情况并非如此。 Raymond Chen has a nice article on impersonation 解释了这个问题。

SQL Server(如果那是您的服务器)通过EXECUTE AS 支持某种形式的模拟本身,但我不建议使用动态凭据执行此操作——这听起来像是一场安全噩梦。您最好获取用户身份并将其传递给处理安全检查的存储过程,而无需实际模拟用户。当然,这个过程应该只能由服务调用。

【讨论】:

嗯,谢谢你的澄清。认为有办法通过所有安全的东西。存储服务器可以是 SQL、mysql 和 Oracle,但由需要特定用户认证的客户端管理。这就是为什么我想出这个想法来模仿他们异步“做他们的工作”。因此,实现这一权利的唯一方法是强制用户输入密码,对其进行加密,将其传递给服务器,对其进行加密并使用其凭据登录。如果我错了,请纠正我。 如果您可以让用户输入他们的密码,您可以简单地以该用户身份登录并启动一个单独的进程来以该用户身份执行工作——这回避了任何与模拟有关的问题。 是的,似乎是实现这一目标的唯一方法。这只是因为我的公司想要“简单的方法”(不让用户做“任何事情”)。我永远不会明白那种哲学,但我不会因为想这个而付钱。 如果我是用户,我会对每次使用时都需要输入密码的应用程序感到非常恼火,即使我没有做任何需要特殊权限的事情,例如安装应用程序,所以我当然支持构建不需要的解决方案的想法——是的,这就是他们付钱给你的原因。 :-)

以上是关于C# 模拟 AD 用户的主要内容,如果未能解决你的问题,请参考以下文章

使用用户模拟来调用Azure AD Microsoft API的Web API

通过用户模拟将用户添加到活动目录

如何在声明未映射到 AD 帐户的情况下执行 WIF/声明模拟?

如何在C#中模拟没有密码的Windows身份验证登录用户

C# Winforms:模拟用户点击(开始-等待数据收集-停止)

C# Winform 模拟无法正常工作