【问题标题】:Matching current user with ActiveDirectory DirectoryEntry将当前用户与 ActiveDirectory DirectoryEntry 匹配
【发布时间】:2020-04-29 13:57:20
【问题描述】:

我的场景:

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

SO 上类似问题的解决方案(例如How to get the current user's Active Directory details in C#)通常建议使用DirectorySearcher 并过滤用户名"(sAMAccountName=theUserIWantToMatch)"

但恕我直言,这还不够:

1) 不够安全,您可以轻松地通过创建具有相似名称的用户来冒充任何人。更不用说中间人攻击了。

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

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

谢谢。

【问题讨论】:

    标签: c# authentication .net-core active-directory


    【解决方案1】:

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

    从那里,您可以使用 LDAP SID binding syntaxLDAP://<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}>");
    

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

    【讨论】:

    • 谢谢@GabrielLuci。由于某种原因,我无法使 LDAP SID 绑定语法工作。我尝试过使用和不使用域。尽管如此,恕我直言,使用 SID 比使用名称好得多,这是很好的建议。最后,我最终只是让所有用户使用DirectorySearcher 并手动过滤他们的objectsid 属性(您需要将其转换为这样的字符串:new SecurityIdentifier(searchResult.Properties["objectsid"][0] as byte[], 0).ToString() btw。)以找到匹配的SearchResult
    • 这很奇怪。 SID 语法没有理由不工作。我很想知道您的代码以及错误消息是什么。
    • 我一定是搞砸了,因为现在它正在工作:D,对不起,我的错误。让我感到困惑的一件事是DirectoryEntryUsername 属性是nullProperties 中的数据在那里,所以没关系。再次感谢您。
    • Username 的属性DirectoryEntry 用于指定用于向服务器进行身份验证的凭据。当它是null(默认)时,它只使用正在运行的进程的凭据。
    猜你喜欢
    • 2022-06-12
    • 2011-04-04
    • 2012-05-22
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多