在ldap中验证用户

时间:2012-08-14 12:51:50

标签: c#

目录的结构就像,

ou=system,ou=valeteck,cn=mayank

我必须检查用户输入的密码是否正确并且与用户的密码匹配,即mayank。

但系统和cn='mayank'有不同的密码。如果我创建密码为cn的目录条目对象,我没有使用ldap进行身份验证,但如果我使用系统目录及其密码,我将获得身份验证,但是如何检查用户的密码。

2 个答案:

答案 0 :(得分:0)

 private bool LoginS(string userName, string password)
        {
            bool authentic = false;
            try
            {
                DirectoryEntry entry = new DirectoryEntry(LDAP-Path, userName, password, AuthenticationTypes.Secure);
                authentic = true;


                Console.WriteLine("Authentication successful");

            }
            catch (DirectoryServicesCOMException e)
            {
                _logger.Error("Authentification error", e);
                //User doesnt exist or input is false

            }
            return authentic;
        }

答案 1 :(得分:0)

Windows API使用advapi32.dll提供了更简单的方法。

示例:

[DllImport("advapi32.dll", EntryPoint = "LogonUserW", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool LogOnUser(string lpszUserName, string lpszDomain, string lpszPassword,
        int dwLogOnType, int dwLogOnProvider, ref IntPtr phToken);

如果用户确实在域中并且已正确输入其密码,则此方法返回true或false。 然后,您只需创建自己的登录方法,检查针对advapi32.dll的身份验证。

public ActionResult SignIn(SignInModel model)
    {
        string domainName = CheckSignIn.GetDomainName(model.User.UserName);
        string userName = CheckSignIn.GetUserName(model.User.UserName);
        IntPtr token = IntPtr.Zero;
        bool result = CheckSignIn.LogOnUser(userName, domainName, model.User.UniqueUserCode, 2, 0, ref token);
        if (result)
        {
            if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.QueryString["ReturnUrl"] != "/")
            {
                FormsAuthentication.RedirectFromLoginPage(model.User.UserName, false);
            }
            else
            {
                FormsAuthentication.SetAuthCookie(model.User.UserName, false);
                return RedirectToAction("MyVoyages", "Voyage");
            }
        }
        return SignIn(true);
    }

简单而强大。