使用Active Directory使用本地用户登录

时间:2013-08-21 14:59:49

标签: c# entity-framework security asp.net-mvc-4

我使用标准的简单会员模型在我的应用程序中通过表单登录。我想提供通过AD登录的可能性。

通过AD登录时,过程应如下所示:

  1. 检查AD是否对用户进行了身份验证,但不要使用该主体的信息。
  2. 检查是否存在所提供的Active Directory用户名的本地用户(我的UserProfile模型上有一个名为ActiveDirectoryID的属性)。
  3. 如果存在,请使用此UserProfile的本地用户名执行本地登录。
  4. 问题:我无法检索本地密码,因此为了在AD身份验证后本地登录,我需要能够在没有密码的情况下强制登录。

    我考虑过以下策略:

    • 为Websecurity创建扩展方法以允许Websecurity.Login(字符串用户名)
    • 以某种方式手动设置登录用户,而不涉及Websecurity。

    这可行/可行吗?框架是否可以在没有明文密码的情况下创建必要的身份验证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");
        }
    

1 个答案:

答案 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;
}

希望这有帮助。