C# 如何可靠地检查工作站上当前用户的windows域id
我正在使用C#和.Net Framework 4 我正在寻找一个万无一失的方法来获取当前登录的windows用户的登录id,该用户不易受到模仿或黑客攻击。我正在寻找的形式:域名\用户名 e、 g.SOMEDOMAIN\JohnDoe 目前我拥有的最好的产品是: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; 这是否允许冒充(在知道
var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var currentLoginId = identity.Name;
这是否允许冒充(在知道用户名和密码的人之外),如果是这样,是否有更好的方法?只有部分答案:
我相信System.Security.Principal.WindowsIdentity.GetCurrent()
将返回与当前执行的线程关联的windows用户帐户。如果线程或应用程序是在与登录用户不同的用户帐户下启动的,则使用此帐户后将无法获得所需的内容
如果您可以确定您的应用程序不是使用“运行方式”功能(或programatic Equivalent)启动的,并且您没有在内部执行与线程标识相关的任何操作,那么您可能可以确定这是登录用户的帐户,但我不是100%同意这一点
使用ADSI可以找到与widows“会话”相关联的用户帐户,应用程序在该会话中运行(请参阅System.DirectoryServices)。此时可能至少涉及四种不同的身份:
WindowsIdentity.GetCurrent
以获取模拟的标识WindowsIdentity.GetCurrent
以获取底层进程标识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”用户,而不是登录用户。