我使用标准的简单会员模型在我的应用程序中通过表单登录。我想提供通过AD登录的可能性。
通过AD登录时,过程应如下所示:
问题:我无法检索本地密码,因此为了在AD身份验证后本地登录,我需要能够在没有密码的情况下强制登录。
我考虑过以下策略:
这可行/可行吗?框架是否可以在没有明文密码的情况下创建必要的身份验证cookie?我该怎么做?
SOLUTION:
这结束了正确的解决方案:
public ActionResult ActiveDirectoryLogin(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
try
{
DirectoryEntry entry = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com", model.UserName, model.Password);
object NativeObject = entry.NativeObject;
var internalUser = db.UserProfiles.Where(x => x.ActiveDirectoryID == model.UserName).SingleOrDefault();
if (internalUser != null)
{
FormsAuthentication.SetAuthCookie(internalUser.UserName, model.RememberMe);
return RedirectToLocal(returnUrl);
}
}
catch (DirectoryServicesCOMException)
{
// No user existed with the given credentials
}
catch (InvalidOperationException)
{
// Multiple users existed with the same ActiveDirectoryID in the database. This should never happen!
}
}
return RedirectToAction("Login");
}
答案 0 :(得分:2)
这就是Websecurity.Login方法所做的一切:
public static bool Login(string userName, string password, bool persistCookie = false)
{
WebSecurity.VerifyProvider();
bool flag = Membership.ValidateUser(userName, password);
if (flag)
{
FormsAuthentication.SetAuthCookie(userName, persistCookie);
}
return flag;
}
您可以编写自己的方法来对AD进行身份验证,然后查找用户名,并确实将auth cookie设置为:
public static bool MyLogin(string userName, string password, bool persistCookie = false)
{
bool flag = CheckADUser(userName, password);
if (flag)
{
string mappedUsername = GetMappedUser(userName);
if(mappedUsername != "")
{
FormsAuthentication.SetAuthCookie(userName, persistCookie);
}
else
{
flag = false;
}
}
return flag;
}
希望这有帮助。