使用MVC4表单(可选输入域用户名或仅输入用户名)根据active directory对用户进行身份验证

本文关键字:用户 输入 directory active 根据 身份验证 表单 MVC4 使用 | 更新日期: 2023-09-27 18:25:19

我阅读了数百万篇关于active directory身份验证的帖子,但没有发现任何关于我的问题的帖子。

我想通过MVC4表单身份验证并允许插入域名作为选项,根据active directory对用户进行身份验证:

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

我的公司有20个子域,我需要对每个域进行身份验证,这就是为什么我不喜欢在应用程序配置中保留我的域并从中进行选择。

目录条目:

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

手动解析用户名并检查所有条件等等,我的方法看起来像垃圾,也许是要写的应用程序配置中的某种参数,可以让我选择让用户输入域''用户名或仅输入用户名,然后我可以获得域+用户名或仅用户名,然后根据AD对用户进行身份验证。

提前谢谢。

使用MVC4表单(可选输入域用户名或仅输入用户名)根据active directory对用户进行身份验证

您可以尝试使用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