首页 > 解决方案 > 将当前用户与 ActiveDirectory DirectoryEntry 匹配

问题描述

我的场景:

客户端应用程序(Net Core WPF)应该以某种方式找出当前用户的身份(例如使用System.Security.Principal.WindowsIdentity.GetCurrent())并使用有权访问 AD的 REST 服务器应用程序(Net Core)进行身份验证(它知道根 AD DirectoryEntry 的地址、名称和密码)。当且仅当在 AD 中的用户中找到来自客户端应用程序的用户时,身份验证才应该成功。这是一个内部网设置顺便说一句。

SO 上类似问题的解决方案(例如如何在 C# 中获取当前用户的 Active Directory 详细信息)通常建议使用DirectorySearcher和过滤用户名"(sAMAccountName=theUserIWantToMatch)"

但恕我直言,这还不够:

1)它不够安全,你可以很容易地通过创建一个具有相似名称的用户来冒充任何人。更不用说中间人攻击了。

2)它甚至不必是恶意的,很多人都有相似的名字。我可能已经使用具有相似用户名的计算机通过 VPN 连接到 Intranet 网络(类似于已经在该网络上的其他人)。

你能想出更好的方法来匹配用户(例如使用一些 GUID 或令牌)或完全不同的身份验证方法吗?重申一下:我不能使用通常的 ASP.NET Windows 身份验证,因为我的客户端是一个 WPF 应用程序,它使用HttpClient实例与服务器通信。

谢谢你。

标签: c#authentication.net-coreactive-directory

解决方案


获取已登录的确切用户的防故障方法是使用 SID,该 SID 可从WindowsIdentity.GetCurrent().User.

从那里,您可以使用LDAP SID 绑定语法LDAP://<SID=XXXXX>直接绑定到 AD 对象。

这看起来像这样:

var sid = WindowsIdentity.GetCurrent().User;
var currentUser = new DirectoryEntry($"LDAP://<SID={sid}>");

如果您运行此程序的计算机未加入与用户(或受信任的域)相同的域,那么您需要在 LDAP 路径中包含域名:

var currentUser = new DirectoryEntry($"LDAP://example.com/<SID={sid}>");

此方法也比任何其他方法都快,因为您没有执行搜索然后绑定到对象。这一切都在一个网络请求中完成。


推荐阅读