以往透過LDAP的方式,可以取得內部AD中帳號的詳細資訊
當AD同步,或是轉移至Azure上之後,就不能使用舊的方式了,必須改用WebAPI的方法取得帳號與群組的詳細資訊
透過Azure AD提供的GraphAPI,可以很快速的取得AD中帳號的資訊
在取得使用者詳細資訊前,裝置必須要先登入Azure AD的驗證並通過才行
Azure AD的驗證方式可以參考前篇文章[Azure] [Xamarin] 使用Xamarin.Forms達成Azure AD的帳號驗證
已經通過Azure AD的驗證後,可以在程式碼中加上下面的程式碼
public static string tenant = "[在這裡填入Azure AD的網域名稱,如:maduka.onmicrosoft.com]";
public static string graphAPI = "https://graph.windows.net/{0}/users/{1}?api-version=1.6";
/// <summary>
/// 取得AAD上的人員詳細資料
/// </summary>
/// <param name="objAuth"></param>
/// <returns></returns>
public async Task<Models.AzureAD.UserProfile> GetAADUserInfo(AuthenticationResult objAuthResult)
{
// 置換GraphAPI Url
string strGraphAPI = string.Format(graphAPI, tenant, objAuthResult.UserInfo.DisplayableId);
// 取得登入帳號資料
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, strGraphAPI);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", objAuthResult.AccessToken);
var response = await client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
// 回傳的Json資訊放入Label顯示
lblUserInfoJson.Text = content;
// 將Json轉換成物件並回傳
return JsonConvert.DeserializeObject<Models.AzureAD.UserProfile>(content);
}
這段程式碼主要是透過Azure AD的GraphAPI取得使用者的詳細資訊
其中在graphAPI的網址變數中,{0}必須代入Azure AD上的網域名稱,{1}則是代入登入者的Id,如:maduka@maduka.onmicrosoft.com
objAuthResult則是在進行Azure AD驗證後,取得的授權資訊,要從GraphAPI上取得詳細的使用者帳號內容,需要授權資訊中的Token值
接著,在程式碼中加上下面的類別,用來轉換回傳的JSON字傳成為物件,以方便我們進行存取用
{
public string odatametadata { get; set; }
public string odatatype { get; set; }
public string objectType { get; set; }
public string objectId { get; set; }
public object deletionTimestamp { get; set; }
public bool accountEnabled { get; set; }
public object[] signInNames { get; set; }
public Assignedlicens[] assignedLicenses { get; set; }
public Assignedplan[] assignedPlans { get; set; }
public string city { get; set; }
public object companyName { get; set; }
public string country { get; set; }
public object creationType { get; set; }
public string department { get; set; }
public object dirSyncEnabled { get; set; }
public string displayName { get; set; }
public object facsimileTelephoneNumber { get; set; }
public string givenName { get; set; }
public object immutableId { get; set; }
public object isCompromised { get; set; }
public string jobTitle { get; set; }
public object lastDirSyncTime { get; set; }
public string mail { get; set; }
public string mailNickname { get; set; }
public object mobile { get; set; }
public object onPremisesSecurityIdentifier { get; set; }
public object[] otherMails { get; set; }
public string passwordPolicies { get; set; }
public object passwordProfile { get; set; }
public string physicalDeliveryOfficeName { get; set; }
public string postalCode { get; set; }
public string preferredLanguage { get; set; }
public Provisionedplan[] provisionedPlans { get; set; }
public object[] provisioningErrors { get; set; }
public string[] proxyAddresses { get; set; }
public DateTime refreshTokensValidFromDateTime { get; set; }
public string sipProxyAddress { get; set; }
public string state { get; set; }
public string streetAddress { get; set; }
public string surname { get; set; }
public string telephoneNumber { get; set; }
public string usageLocation { get; set; }
public string userPrincipalName { get; set; }
public string userType { get; set; }
}
public class Assignedlicens
{
public object[] disabledPlans { get; set; }
public string skuId { get; set; }
}
public class Assignedplan
{
public DateTime assignedTimestamp { get; set; }
public string capabilityStatus { get; set; }
public string service { get; set; }
public string servicePlanId { get; set; }
}
public class Provisionedplan
{
public string capabilityStatus { get; set; }
public string provisioningStatus { get; set; }
public string service { get; set; }
}
最後,要進行驗證的動作,就直接呼叫GetAADUserInfo就可以
Models.AzureAD.UserProfile objProfile = await this.GetAADUserInfo(objAuthResult);
從這樣的實作上我們可以看到登入完成後,取得到的使用者帳號詳細資訊JSON字串
除了使用者的帳號詳細資訊外,還可以取得帳號的群組資料、連絡資料、在目錄中的角色(全域管理員、使用者等等)
有關詳細的GraphAPI內容,可以查看一下參考資料,裡面都有提供呼叫的方式與回傳的JSON內容,透過這樣存取方式,就可以方便的讓AD轉移至雲端並調用Azure AD的資訊了
有興趣的人也可以先連到下面網址
https://graphexplorer.cloudapp.net/
登入後就可以直接查看Azure AD中GraphAPI的功能與回傳資料,對於程式的開發也是很方便的
參考資料:
Azure AD Graph API reference
Operations on users | Graph API reference