C# 如何安全地确保当前用户属于Active Directory组?

C# 如何安全地确保当前用户属于Active Directory组?,c#,active-directory,windows-authentication,spoofing,C#,Active Directory,Windows Authentication,Spoofing,我正在创建一个C#Winform应用程序,它将在公司域(Windows Active Directory)中使用。应用程序的行为如下所示: 当用户打开应用程序时,应用程序会检查当前用户是否属于Active Directory组 如果是,则该应用程序允许用户使用该应用程序 通过谷歌搜索,我找到了几种方法来检查用户是否属于Active Directory组。 例如,在这里的链接=> 我关心的是安全问题。如果有人伪造用户名和域怎么办。他不需要知道密码就可以访问应用程序。不要查找。用户所属的每个组的SI

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

  • 当用户打开应用程序时,应用程序会检查当前用户是否属于Active Directory组
  • 如果是,则该应用程序允许用户使用该应用程序
  • 通过谷歌搜索,我找到了几种方法来检查用户是否属于Active Directory组。 例如,在这里的链接=>


    我关心的是安全问题。如果有人伪造用户名和域怎么办。他不需要知道密码就可以访问应用程序。

    不要查找。用户所属的每个组的SID(递归地)都是用户登录令牌的一部分。所以你可以直接使用。如果您只有该组的名称,则可以指定:

    var currentUser = new WindowsPrincipal(WindowsIdentity.GetCurrent());
    currentUser.IsInRole("SomeGroup")
    
    并检查该SID的登录令牌。这需要网络请求。如果可以将组的SID改为,则可以保存该网络请求:

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

    在Windows窗体应用程序中,进程以当前用户身份运行。如果您得到的是当前的WindowsPrincipal(/WindowsIdentity),那就是当前用户,不需要用户名或密码再考虑一下。。。WindowPrincipal.IsInRole可以做任何你想做的事情谢谢Gabriel,那么你是说SID是唯一的,任何人都不能伪造吗?@user1034912每个SID都是唯一的,是的。我当然怀疑任何SID都可以伪造——它是Windows和AD中的安全基础(所有文件系统和广告许可都被授予SID)。而且访问令牌肯定不能伪造。访问令牌是Windows在用户成功通过身份验证时创建的,它包含该用户所属的每个组。这就是为什么我建议你用这个。Windows已经为您完成了所有工作。要更好地理解它,请参阅和的文档。谢谢Gabriel,我已经阅读了您共享的文档。如果有人欺骗域控制器怎么办?使用相同的名称创建域控制器并从中创建令牌?欺骗域控制器是不可能发生的事情。如果使用相同的域名创建DC,它仍然是不同的域。域SID是随机生成的,域SID是域上每个对象的SID的第一部分。即使您以某种方式设法欺骗域SID,其他DC也与它没有关系-他们不会信任它,因为它不在他们的DC列表中。此外,DNS将不包括它-如果您在DNS中查找域名,它将返回所有DC的IP,因此您必须拥有该域才能将IP添加到该列表中。