使用带有可选输入域\用户名或仅用户名的MVC4表单对活动目录进行用户身份验证

时间:2013-07-28 18:00:08

标签: c# .net asp.net-mvc active-directory forms-authentication

我阅读了数百万条有关活动目录身份验证的帖子,但没有找到任何有关我的问题的帖子。

我想使用MVC4表单身份验证对活动目录进行身份验证,并允许插入域名作为选项:

acc: domain.com\username  or  username
pwd: password

我公司有20个子域名,我需要对每个域进行身份验证,这就是为什么我不喜欢选择将我的域名保存在app config中并从中进行选择。

目录条目:

var directoryEntry = new DirectoryEntry("LDAP://" + domain, userName, password);

会很棒,但如果用户不在域名前面放置域名?我会得到例外,用户不会被认证。我想要一个方法:

public bool AuthenticateUser(string username, string password)
{
   Checking if username has domain name included;
   use some kind of authetication method;
   returns true/false;
}

手动解析用户名并检查所有条件等等,我的方法看起来像废话,也许是app app中的某种参数写入会给我一个选项让用户输入domain \ username或者只是用户名和我可以获得域名+用户名或只是用户名,然后验证用户对AD。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用Membership和PrincipalContext

来使用双重身份验证解决方案
public bool ActiveDirectoryAuthentication(string username, string password)
    {
        var splittedCredentials = username.Split(new[] { "\\" }, StringSplitOptions.None);
        switch (splittedCredentials.Length)
        {
            case 1:
                {
                    var authenticated = Membership.ValidateUser(username, password);
                    if (authenticated)
                    {
                        FormsAuthentication.SetAuthCookie(username, false);
                    }
                    return authenticated;
                }
            case 2:
                {
                    var principalContext = new PrincipalContext(ContextType.Domain, splittedCredentials[0]);

                    using (principalContext)
                    {
                        var authenticated = principalContext.ValidateCredentials(splittedCredentials[1], password);

                        if (authenticated)
                        {
                            FormsAuthentication.SetAuthCookie(splittedCredentials[1], false);
                        }
                        return authenticated;
                    }
                }
            default:
                return false;
        }
    }
  • 在此之前不要忘记验证用户输入
  • 首先拆分登录字符串
  • 如果用户尚未输入域名使用成员资格
  • 如果用户输入了域名,请使用PrincipalContext
  • 如果发生其他事件,您将返回false