首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PrincipalContext是如何工作的

PrincipalContext是如何工作的
EN

Stack Overflow用户
提问于 2014-04-04 14:53:35
回答 2查看 2.4K关注 0票数 0

我需要让用户将那里的帐户绑定到Active Directory。这意味着管理员需要一个GUI,在那里他/她可以写一个Active Directory帐户,比如MyDomain\MyName,然后如果用户在保存前存在,那么就进行验证。

我使用这段代码来验证名称:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 10:30:24

最后我得到了这个:

代码语言:javascript
复制
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;
        }
票数 0
EN

Stack Overflow用户

发布于 2014-04-04 17:17:58

我能够在没有问题的情况下将域传递到主体上下文中,我不会传递服务器。我希望这对你有用。

代码语言:javascript
复制
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域名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22866122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档