繁体   English   中英

PrincipalContext如何工作

[英]How the PrincipalContext works

我需要让用户将那里的帐户绑定到Active Directory。 这意味着管理员需要一个GUI,在该GUI中他/她可以在其中编写如下Active Directory帐户:MyDomain \\ MyName,然后在保存之前验证用户是否存在。

我正在使用此代码来验证名称:

public static bool CheckActiveDirectoryAccount(string account)
        {

            string ADServer = null;
            string ADDomain = null;
            string ADUserName = null;
            string ADUserPassword = null;

            SetADSettings(out ADServer, out ADDomain, out ADUserName, out ADUserPassword);

            using (PrincipalContext context = new PrincipalContext(ContextType.Domain, ADServer, ADUserName, ADUserPassword))
            {
                using (UserPrincipal user = UserPrincipal.FindByIdentity(context, account))
                {
                    if(user != null)
                        return true;
                    else
                        return false;
                }
            }
        }

此代码的问题在于,似乎没有办法检查用户的特定域? 相反,我必须输入服务器,如果尝试输入域,则会出现异常(找不到服务器)。

如何让管理员输入AD帐户的域和用户名,然后对照AD进行检查?

我能够将域毫无问题地传递到principalcontext,我没有传递服务器。 我希望这对您有用。

public static bool CheckActiveDirectoryAccount(string account, string domain)
{
    using (var pc = new PrincipalContext(ContextType.Domain, domain))
    {
        // Find a user
        UserPrincipal user = UserPrincipal.FindByIdentity(pc, account);

        if (user == null)
            return false;

        return true;
    }
}

我注意到在传递NetBIOS域名时性能很差,尽管它确实起作用。 结果,我会尽可能传递DNS域名。

我结束了这个:

public static string CheckActiveDirectoryAccount(string account)
        {
            UserPrincipal user;
            PrincipalContext context;
            List<string> userPrincipalNameList;
            string ADServer = null;
            string ADUserName = null;
            string ADUserPassword = null;

            string userAccount;

            account = account.ToLower();
            GetADSettings(out ADServer, out ADUserName, out ADUserPassword);

            if (ADUserName.Length > 0)
                context = new PrincipalContext(ContextType.Domain, ADServer, null,  ADUserName, ADUserPassword);
            else
                context = new PrincipalContext(ContextType.Domain, ADServer);

            using (context)
            {
                if((user = UserPrincipal.FindByIdentity(context, account)) == null)
                {
                    if(account.Contains("\\"))
                    {
                        userPrincipalNameList = user.UserPrincipalName.Split('\\').ToList();

                        if (userPrincipalNameList.Count > 0)
                            user = UserPrincipal.FindByIdentity(context, userPrincipalNameList[0]);
                    }
                }

                if (user != null)
                {
                    using (user)
                    {
                        userPrincipalNameList = user.UserPrincipalName.Split('@').ToList();

                        userAccount = userPrincipalNameList.First();

                        if (userPrincipalNameList.Count > 1)
                            userAccount = userPrincipalNameList.Last() + "\\" + userAccount;

                        if (user != null)
                            return userAccount.ToLower();
                    }
                }
            }
            return string.Empty;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM