c# - 验证本地计算机上的用户凭据

标签 c# .net authentication

我有一个 Windows 服务(作为本地系统用户运行),除了检查用户是否属于 WSMA 组之外,还需要根据用户名和密码验证用户。我当前的代码是这样的:

var pc = new PrincipalContext(ContextType.Machine);
using (pc)
{
  try
  {
    if (pc.ValidateCredentials(username, password))
    {
      using (var groupEntry = new DirectoryEntry("WinNT://./WSMA,group"))
      {
        foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
        {
          using (var memberEntry = new DirectoryEntry(member))
          {
            if (memberEntry.Path.ToLower().EndsWith(username.ToLower()))
            {
              return new LoginResult{ success = true };
            }
          }
        }
      }
    }
    return new LoginResult{ success = false };
  }
  catch (PrincipalOperationException poe)
  {
    if (poe.ErrorCode == -2147023688)
    {
      return new LoginResult { Success = false, ErrorMessage = "Password expired" };
    }
    throw poe;
  }
}

只要我连接到网络,这一切都会正常工作,但是如果我拔掉网络电缆,则 ValidateCredentials 调用会给我以下错误消息:

用户代码未处理 FileNotFoundException。找不到网络路径。

我猜这与 AD 有关,但我只需要检查本地用户,而不是域用户,因此不需要网络访问。

有什么方法可以使用PrincipalContext来做到这一点,或者在断开连接的情况下使用其他一些方法吗?

最佳答案

这是登录用户的方法(从而检查它是否是有效的用户/密码): MSDN Link

我想如果您使用本地帐户,这也应该在断开连接的情况下工作

关于c# - 验证本地计算机上的用户凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10732161/

相关文章:

.net - 后台持续运行的线程会影响网站的性能吗?

c# - 不再支持使用旧密码进行身份验证,请使用 4.1 样式密码

mysql - Spring 启动安全 : Encoded password does not look like BCrypt

c# - 正确处理内存流(WPF 图像转换)

javascript - Worklight 将登录凭据传递给 iframed 服务器端内容

c# - 在包含字典的类上公开 foreach

c# 如何从 div 类中的 <b> 中获取字符串

c# - ftp 子文件夹下载递归功能不起作用

c# - 国际奥委会设计资源

c# - Windows 的 .Net 检查器