出于安全考虑,我们要检查当前的PC用户是否是实际登录的用户。为此,我们希望用户重新输入密码并使用域检查其凭据。我们怎么能做到这一点?
Sofar我们试过这个:
public static Boolean Authenticate(String password)
{
String user = WindowsIdentity.GetCurrent().Name;
using (PrincipalContext PrincipalContext = new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
{
return PrincipalContext.ValidateCredentials(user, password);
}
}
但是获得System.DirectoryServices.Protocols.LdapException
,关闭Environment.UserDomainName
也会触发此异常。
我们也尝试过:
public static Boolean Authenticate(String password)
{
String user = WindowsIdentity.GetCurrent().Name;
using (PrincipalContext PrincipalContext = new PrincipalContext(ContextType.Machine))
{
return PrincipalContext.ValidateCredentials(user, password);
}
}
但是在任何密码上都会返回true。
答案 0 :(得分:1)
经过一番搜索后,我遇到了this answer。结果证明域名包含在WindowsIdentity.GetCurrent().Name
中。正如documentation中的评论所述。
将此作为一种有效的解决方案:
public static Boolean Authenticate(String password)
{
String user = WindowsIdentity.GetCurrent().Name; //Should be: DomainName\UserName
String[] DomainAndUserName = user.Split(new Char[] { '\\' }, 2);
if (DomainAndUserName.Length != 2) { return false; } // No DomainName ==> Wrong network;
using (PrincipalContext PrincipalContext = new PrincipalContext(ContextType.Domain, DomainAndUserName[0]))
{
return PrincipalContext.ValidateCredentials(DomainAndUserName[1], password);
}
}