如何可靠地检查工作站上当前用户的Windows域ID

时间:2010-08-17 10:37:02

标签: c# security authentication active-directory

我正在使用C#和.Net Framework 4。

我正在寻找一种万无一失的方法来获取当前登录的Windows用户的登录ID,该用户不会受到冒充或黑客攻击。我正在寻找以下形式:DOMAINNAME \ USERNAME

e.g。 SOMEDOMAIN \ JOHNDOE

目前我所拥有的最好的是:

var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var currentLoginId = identity.Name;

这是否可以模仿(在知道用户名和密码的人之外),如果有,有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

此时至少可以涉及四种不同的身份:

  1. 分配给帖子的标识
  2. 分配给流程的标识
  3. 启动流程的用户的帐户
  4. 登录PC的用户的帐户
  5. 在你的代码中你得到(1)。这通常很好,通常与(2)相同。

    要检索(2),您可以:

    1. 致电WindowsIdentity.GetCurrent以获取模拟身份
    2. 通过调用Win32 RevertToSelf函数
    3. 撤消模拟
    4. 查看WindowsIdentity.GetCurrent以获取基础流程标识
    5. 通过模拟步骤(1)中的标识重置线程标识
    6. (2)和(3)将是相同的,除非您编写了更改进程标识的非托管代码。正如@Daniel指出的那样,(3)和(4)在Windows“运行为”命令的存在下可能合法地不同。

        

      修改:您可以相信当前的WindowsIdentity就是它所说的人,只要您可以信任您应用中的任何特定数据。

           

      你可以通过将一个调试器附加到你的进程并伪造来自这个调用的返回值来欺骗它,但是如果你要这样做,你也可以假装你将用户名传递给你的代码段。数据库中。

           

      100%安全的方法是使用集成身份验证/ SSPI连接到数据库。

答案 1 :(得分:1)

只有部分答案:

我相信System.Security.Principal.WindowsIdentity.GetCurrent();将返回与当前正在执行的线程相关联的Windows用户帐户。如果线程或应用程序是在与登录用户不同的用户帐户下启动的,那么在使用它之后就不会得到你所拥有的。

如果您可以确定您的应用程序未使用“run-as”功能(或编程方式)启动,并且您在内部没有做任何关于线程标识的事情,您可能可以确定这是登录用户的帐户,但我不是100%。

可以使用ADSI找到与运行应用程序的窗口“session”关联的用户帐户(请参阅System.DirectoryServices)。