如何使用用户主体上下文从 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 path:LDAP://<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); ;
}
此代码非常适合使用用户名和密码
从 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 path:LDAP://<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); ;
}