C# 如何可靠地检查工作站上当前用户的windows域id

C# 如何可靠地检查工作站上当前用户的windows域id,c#,security,authentication,active-directory,C#,Security,Authentication,Active Directory,我正在使用C#和.Net Framework 4 我正在寻找一个万无一失的方法来获取当前登录的windows用户的登录id,该用户不易受到模仿或黑客攻击。我正在寻找的形式:域名\用户名 e、 g.SOMEDOMAIN\JohnDoe 目前我拥有的最好的产品是: var identity = System.Security.Principal.WindowsIdentity.GetCurrent(); var currentLoginId = identity.Name; 这是否允许冒充(在知道

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

我正在寻找一个万无一失的方法来获取当前登录的windows用户的登录id,该用户不易受到模仿或黑客攻击。我正在寻找的形式:域名\用户名

e、 g.SOMEDOMAIN\JohnDoe

目前我拥有的最好的产品是:

var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var currentLoginId = identity.Name;
这是否允许冒充(在知道用户名和密码的人之外),如果是这样,是否有更好的方法?

只有部分答案:

我相信
System.Security.Principal.WindowsIdentity.GetCurrent()
将返回与当前执行的线程关联的windows用户帐户。如果线程或应用程序是在与登录用户不同的用户帐户下启动的,则使用此帐户后将无法获得所需的内容

如果您可以确定您的应用程序不是使用“运行方式”功能(或programatic Equivalent)启动的,并且您没有在内部执行与线程标识相关的任何操作,那么您可能可以确定这是登录用户的帐户,但我不是100%同意这一点


使用ADSI可以找到与widows“会话”相关联的用户帐户,应用程序在该会话中运行(请参阅System.DirectoryServices)。

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

  • 分配给线程的标识
  • 分配给进程的标识
  • 启动进程的用户的帐户
  • 登录到电脑的用户的帐户
  • 在您的代码中,您将获得(1)。这通常很好,通常与(2)相同

    要检索(2),您可以:

  • 调用
    WindowsIdentity.GetCurrent
    以获取模拟的标识
  • 通过调用Win32函数撤消模拟
  • 查看
    WindowsIdentity.GetCurrent
    以获取底层进程标识
  • 通过模拟步骤(1)中的标识重置线程标识
  • (2) 和(3)将是相同的,除非您编写了更改进程标识的非托管代码。正如@Daniel所指出的,(3)和(4)在Windows“run As”命令的存在下可能是合理的不同

    编辑:只要您可以信任应用程序中的任何给定数据,您就可以相信当前的
    WindowsIdentity
    就是它所说的那个人

    您可以通过将调试器附加到进程并伪造此调用的返回值来欺骗它,但如果要这样做,您还可以伪造将用户名传递到数据库的代码段

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


    “不易被冒充或黑客攻击”-您无法在不知道登录用户密码的情况下对其进行黑客攻击。如果你知道密码,我认为这算不上黑客行为。@Tim同意你的观点。如果他们知道用户名和密码,他们可以作为该用户登录windows。在这种情况下,为什么要避免模拟?我试图避免的情况是有人编写代码来模拟另一个用户的身份,因为我想将此作为“单点登录”解决方案的一部分。因此,我需要相信当前的WindowsIdentity就是它所说的那个人。如果WindowsIdentity报告当前用户是SomeDomain\JohnDoe,我将进行数据库查找,以找到与SomeDomain\JohnDoe关联的名为John.Doe的应用程序用户,并通过询问密码登录。我有一个很长的响应,最后将其添加到我的原始回答中“我相信
    System.Security.Principal.WindowsIdentity.GetCurrent()
    将返回与当前正在执行的线程关联的windows用户帐户。“我不这样认为(请参阅
    thread.CurrentPrincipal
    ,但它可能未设置)。如果重新设置“RunAs”,则
    WindowsIdentity.GetCurrent()
    将为您提供“RunAs”用户,而不是登录用户。