远程验证用户的凭据

时间:2011-12-16 19:15:23

标签: c# api authentication active-directory

我目前使用LogonUser()在我办公室的本地域上验证用户的用户名和密码,它非常适合我需要它做的事情。

自从我开发应用程序以来,我现在需要让它在我的VPN上工作。似乎LogonUser()无法使用REMOTELY验证凭据。或者会吗?是否可以使用LogonUser()在REMOTE域帐户上验证用户的凭据?

我已经在一些地方读过使用LOGON32_LOGON_NEW_CREDENTIALS作为第4个参数(登录类型)而LOGON32_PROVIDER_WINNT50作为第5个参数(提供者)就可以了。但每次我尝试我总是获得成功...我可以提供一个bogas用户并通过它,它将每次都有效:(。

想法?


编辑 - 添加了备注

尝试使用此功能,但我一直得到异常,告诉我用户/通行证是坏的。

    public bool Win2kCredentialsIsValid(string domain, string username, string password)
    {
        string adPath = "LDAP://" + domain + "/rootDSE";
        DirectoryEntry adRoot = new DirectoryEntry(adPath, domain + "\\" + username, password, AuthenticationTypes.ReadonlyServer);
        try
        {
            object o = adRoot.Properties["defaultNamingContext"];
        }
        catch
        {
            return false;
        }
        return true;
    }

- 编辑 - 添加更多笔记

好的所以我尝试了另一个例子,只是为了让它开始工作并开始沿着这条路走下去,有几件事要注意......

  • MyServerHostName就是我服务器的主机名。 EX:'Server01'。
  • 此示例中的我的域名是“MyDomain.local”
  • 因此,我的服务器'Server01.MyDomain.local'
  • 的FQN

我尝试做这项工作并得到以下错误......

  

提供的上下文类型与联系的服务器不匹配。服务器类型是Domain。

这出错了:var context = new PrincipalContext(ContextType.ApplicationDirectory,“MyServerHostName:389”,“DC = MyDomain,DC = local”))

    private bool CheckADCredentials()
    {
        bool bResults;
        using (var context = new PrincipalContext(ContextType.ApplicationDirectory,
            "MyServerHostName:389",
            "DC=MyDomain,DC=local"))
        {
            var username = "firstname.lastname";
            var email = "firstname.lastname@MyServerHostName";
            var password = "123456";
            var user = new UserPrincipal(context)
            {
                Name = username,
                EmailAddress = email
            };
            user.SetPassword(password);
            user.Save();
            if (context.ValidateCredentials(username, password, ContextOptions.SimpleBind))
            {
                bResults = true;
            }
            else
            {
                bResults = false;
            }

            user.Dispose();
        }

        return bResults;
    }

1 个答案:

答案 0 :(得分:1)

我最终选择了另一种解决方案。我没有尝试在我的PC没有连接到的域上验证用户的帐户,而是最终在数据库中缓存了我的域凭据,并且刚刚构建了一个盐渍的MD5类型加密函数,因此它会让它变得困难......对某人来说......破解它。 ;)

现在我只是在远程工作时验证数据库中的缓存凭据...它只是要求用户首先登录域,然后用户可以日夜远程使用它。 ;)

谢谢!