【问题标题】:How can I securely ensure the current user belongs to an Active Directory Group?如何安全地确保当前用户属于 Active Directory 组?
【发布时间】:2020-10-13 14:10:27
【问题描述】:

我正在创建一个C# Winform 应用程序,它将在公司域(Windows Active Directory)中使用。该应用程序的行为如下:

  1. 当用户打开应用程序时,应用程序会检查当前用户是否属于 Active Directory 组。
  2. 如果是,则应用程序允许用户使用该应用程序。

从谷歌搜索中,我发现了几种检查用户是否属于 Active Directory 组的方法。 例如这里的链接 => How to check if a user belongs to an AD group?

我担心的是其中的安全部分。如果有人欺骗了用户名和域怎么办。他无需知道密码即可访问该应用程序。

【问题讨论】:

  • 在 Windows 窗体应用程序中,进程以当前用户身份运行。如果你得到当前的 WindowsPrincipal (/WindowsIdentity),那就是当前用户,不需要用户名或密码
  • 再想一想... WindowPrincipal.IsInRole 可能会做你想做的一切docs.microsoft.com/en-us/dotnet/api/…

标签: c# active-directory windows-authentication spoofing


【解决方案1】:

不要抬头看。用户所属的每个组的 SID(递归)是用户登录令牌的一部分。所以你可以使用WindowsPrincipal.IsInRole()。如果你只有组的名称,你可以给它:

var currentUser = new WindowsPrincipal(WindowsIdentity.GetCurrent());
currentUser.IsInRole("SomeGroup")

translates the name into the SID 并检查该 SID 的登录令牌。这需要网络请求。如果您可以给它组的 SID,那么您可以保存该网络请求:

var groupSid = new SecurityIdentifier("S-1-5-21-blah");
currentUser.IsInRole(groupSid)

【讨论】:

  • 感谢 Gabriel,您是说 SID 是独一无二的,任何人都无法伪造?
  • @user1034912 每个 SID 都是唯一的,是的。我当然怀疑任何 SID 都可以伪造——它是 Windows 和 AD 安全的基础(所有文件系统和 AD 权限都授予 SID)。而且访问令牌当然不能伪造。访问令牌是 Windows 在用户成功通过身份验证时创建的,它包含用户所属的每个组。这就是为什么我建议你使用它。 Windows 已经为您完成了所有工作。
  • 要更好地理解它,请参阅Security IdentifiersAccess Tokens 的文档。
  • 感谢 Gabriel,我已阅读您分享的文档。如果有人欺骗域控制器怎么办?制作一个同名的域控制器并从中创建令牌?
  • 欺骗域控制器是不可能发生的事情。如果您创建一个具有相同域名的 DC,它仍然是一个不同的域。域 SID 是随机生成的,域 SID 是域上每个对象的 SID 的第一部分。即使您设法以某种方式欺骗了域 SID,其他 DC 也与它没有关系 - 他们不会信任它,因为它不在他们的 DC 列表中。此外,DNS 不会包含它 - 如果您在 DNS 中查找域名,它会返回所有 DC 的 IP,因此您必须拥有该域才能将 IP 添加到该列表中。
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多