此代碼可以完美地使用用戶名和密碼從 Active Directory 獲取電話號碼
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 中獲取電話?
非常感謝您提前
uj5u.com熱心網友回復:
您獲得的User物件將具有用戶的 SID。這樣,您可以在以下位置使用SID 系結 LDAP 路徑DirectoryEntry: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
uj5u.com熱心網友回復:
看起來我把一切都復雜化了,解決方案很簡單
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); ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/453994.html
上一篇:目錄搜索過濾器未回傳任何結果
下一篇:在BC19中洗掉DotNet
