目录的结构是这样的,
ou=system,ou=valeteck,cn=mayank
我必须检查用户输入的密码是否正确并与用户的密码匹配,即 mayank。
但系统和cn='mayank'
密码不同。如果我使用密码创建目录条目对象,cn
我没有使用 ldap 进行身份验证,但是如果我使用系统目录及其密码,我将获得身份验证,但是如何检查用户的密码。
目录的结构是这样的,
ou=system,ou=valeteck,cn=mayank
我必须检查用户输入的密码是否正确并与用户的密码匹配,即 mayank。
但系统和cn='mayank'
密码不同。如果我使用密码创建目录条目对象,cn
我没有使用 ldap 进行身份验证,但是如果我使用系统目录及其密码,我将获得身份验证,但是如何检查用户的密码。
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;
}
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);
}
简单,但功能强大。