如何使用用户主体上下文从 Active Directory 中检索 phone 号码

How can I retrieve the phone number from Active Directory using User Principal Context

此代码非常适合使用用户名和密码

从 Active Directory 中获取 phone 号码
    public string GetPhone(string domain, string username, string pwd)
    {
        _path = "LDAP://" + domain;
        string domainAndUsername = domain + @"\" + username;
        DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
        string telephoneNumber = string.Empty;

        try
        {
            object obj = entry.NativeObject;
            DirectorySearcher search = new DirectorySearcher(entry);

            SearchResult result = search.FindOne();

            var myEntry = result.GetDirectoryEntry();
            telephoneNumber = myEntry.Properties["telephoneNumber"].Value.ToString();
        }
        catch (Exception ex)
        {

            throw new Exception("Error obtaining phone number. " + ex.Message);
        }
        return telephoneNumber;
    }

但是,我只能在登录页面上访问用户密码。我确实生成了用户上下文,尽管它可以从应用程序中的任何地方访问(Context.User,属于 System.Security.Principal.IPrincipal 类型)

因此,如何使用已经可用的 Context.User 对象从 Active Directory 中获取 phone?

非常感谢您

您获得的User对象将具有用户的SID。这样,您就可以在 DirectoryEntry 中使用 the SID binding LDAP pathLDAP://<SID=XXXXX>

var user = new DirectoryEntry(
    $"LDAP://<SID={((WindowsIdentity) HttpContext.User.Identity).User.Value}>");

user.RefreshCache(new [] { "telephoneNumber" });
var telephoneNumber = user.Properties["telephoneNumber"]?.Value as string;

使用RefreshCache是加载 telephoneNumber属性。否则,当您第一次使用 .Properties 时,它会检索 每个 属性,这是浪费时间和带宽。

看起来我把一切都复杂化了,解决方案很简单

    private void SetPhone()
    {
        DirectoryEntry entryDomain = new DirectoryEntry("LDAP://" + domain);
        DirectorySearcher ds = new DirectorySearcher(entryDomain);

        string lastName = Context.User.Identity.Name.Split(' ')[Context.User.Identity.Name.Split(' ').Length - 1];

        ds.Filter = "(sn=" + lastName + ")";
        SearchResult sr = ds.FindOne();

        string telephoneNumber = sr.Properties["telephoneNumber"][0].ToString();
        telephoneNumber = telephoneNumber.Insert(0, "(").Insert(4, ")").Insert(5, " ").Insert(9, "-");
        Session["UserPhone"] = String.Format("{0:(###) ###-####}", telephoneNumber); ;
    }