[Azure] 透過GraphAPI,取得Azure AD上帳號的詳細資訊

以往透過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

範例程式下載:
https://github.com/madukapai/maduka-Xamarin