1

我正在尝试使用具有以下代码的域控制器对应用程序中的用户进行身份验证:

PrincipalContext pcon = new PrincipalContext(ContextType.Domain, domain);
password_ok = pcon.ValidateCredentials(username, password);

只要域服务器在线就可以正常工作,但如果没有域服务器,则前面的代码将失败并出现 PrincipalServerDownException 异常。我要做的是让我的应用程序在服务器关闭时使用 Windows 缓存的凭据,就像 Windows 一样:即使域服务器关闭,您也可以使用域用户登录 Windows。我可以在 C# 中做到这一点吗?

非常感谢您提前。

4

1 回答 1

0

对于后代,这就是我解决问题的方法:

bool dmainNotAvailable = false;
PrincipalContext pcon = null;
try
{
pcon = new PrincipalContext(ContextType.Domain, domain);

}
catch (System.DirectoryServices.AccountManagement.PrincipalServerDownException ex)
{
   domainNotAvailable = true;

    try
    {
       pcon = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    }
    catch (Exception ex2)
    {
       throw new Exception(ex2);
    }
}
string realUserName = !domainNotAvailable ? username : $"{domain}\\{username}";
passwordOk = pcon.ValidateCredentials(realUserName, password);

这也将起作用:

string userName = $"{domain}\\{user}";
PrincipalContext pcon = new PrincipalContext(ContextType.Machine, Environment.MachineName);
passworkOk = pcon.ValidateCredentials(userName, password);

第二种解决方案将尝试使用缓存的凭据登录,如果没有信息,则尝试使用域控制器登录。

在这两种解决方案中,必须首先将域用户添加到本地计算机才能缓存凭据。

就这样。

于 2018-02-21T17:14:06.180 回答