c# - 将当前用户与 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
实例与服务器通信。
谢谢你。
解决方案
获取已登录的确切用户的防故障方法是使用 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}>");
此方法也比任何其他方法都快,因为您没有执行搜索然后绑定到对象。这一切都在一个网络请求中完成。
推荐阅读
- c# - 图像本地修改后如何在 WPF(Visual Studio 设计编辑器)中重新加载图像预览
- html - 在 PowerShell 中从 HTML 编码希伯来语字符串
- javascript - 在 HTML Uncaught SyntaxError 中做出反应:意外的标记 '<'
- java - Mills 中的 Java 时间与纪元时间,以及时区问题
- javascript - 更新基于类的组件中的状态并重新渲染它
- python - Python dict.update vs 在开始时完全初始化
- javascript - 在松弛模态视图中显示错误
- java - Java 版本混淆
- html - 非梯形rotate3d视频问题
- javascript - 为什么我的角色权限代码不起作用?(discord.js)