web-dev-qa-db-ja.com

Azure ActiveDirectoryからプロフィール写真を取得する

アプリケーションでAzureADをIDプロバイダーとして設定しました。 AzureADから取得する必要のあるプロファイル画像をアプリケーションに表示したいと思います。

テストするために、AzureADに1つのWindowsLive Idアカウント(プロフィール写真があります)を追加しました。次に、グラフエクスプローラーを使用して試してみましたが、うまくいきませんでした。

Azure ADからプロファイル画像を取得するにはどうすればよいですか?

9
Hitesh

Azure Active Directory Graph Clientを使用して、ユーザーのサムネイル写真を取得できます

var servicePoint = new Uri("https://graph.windows.net");
var serviceRoot = new Uri(servicePoint, "<your tenant>"); //e.g. xxx.onmicrosoft.com
const string clientId = "<clientId>";
const string secretKey = "<secretKey>";// ClientID and SecretKey are defined when you register application with Azure AD
var authContext = new AuthenticationContext("https://login.windows.net/<tenant>/oauth2/token");
var credential = new ClientCredential(clientId, secretKey);
ActiveDirectoryClient directoryClient = new ActiveDirectoryClient(serviceRoot, async () =>
{
    var result = await authContext.AcquireTokenAsync("https://graph.windows.net/", credential);
    return result.AccessToken;
});

var user = await directoryClient.Users.Where(x => x.UserPrincipalName == "<username>").ExecuteSingleAsync();
DataServiceStreamResponse photo = await user.ThumbnailPhoto.DownloadAsync();
using (MemoryStream s = new MemoryStream())
{
    photo.Stream.CopyTo(s);
    var encodedImage = Convert.ToBase64String(s.ToArray());
}

AzureADはユーザーの写真をバイナリ形式で返します。Base64文字列に変換する必要があります

6
Hanh Nguyen

グラフエクスプローラーを介した写真の取得はサポートされていません。 「signedInUser」にすでにサインインしたユーザーエンティティが含まれていると仮定すると、クライアントライブラリを使用したこのコードスニペットが機能するはずです...

        #region get signed in user's photo
        if (signedInUser.ObjectId != null)
        {
            IUser sUser = (IUser)signedInUser;
            IStreamFetcher photo = (IStreamFetcher)sUser.ThumbnailPhoto;
            try
            {
                DataServiceStreamResponse response =
                photo.DownloadAsync().Result;
                Console.WriteLine("\nUser {0} GOT thumbnailphoto", signedInUser.DisplayName);
            }
            catch (Exception e)
            {
                Console.WriteLine("\nError getting the user's photo - may not exist {0} {1}", e.Message,
                    e.InnerException != null ? e.InnerException.Message : "");
            }
        }
        #endregion

または、RESTを使用してこれを行うことができ、次のようになります。GET https://graph.windows.net/myorganization/users/ /thumbnailPhoto?api- version = 1.5これがお役に立てば幸いです。

3

Azure AD Graph API Docs によると、Azure AD Graph APIは段階的に廃止されているため、Microsoftは Microsoft Graph に移行することをお勧めします。

ただし、Azure ADを介して写真を簡単に取得するには、今のところ、次のURLテンプレートを使用します。

https://graph.windows.net/myorganization/users/{user_id}/thumbnailPhoto?api-version={version}

例(これは偽のユーザーIDです):

https://graph.windows.net/myorganization/users/abc1d234-01ab-1a23-12ab-abc0d123e456/thumbnailPhoto?api-version=1.6

以下のコードは、トークンを使用して認証済みのユーザーがすでにいることを前提としています。これは単純な例です。必要に応じて戻り値を変更したり、エラーチェックを追加したりする必要があります。

const string ThumbUrl = "https://graph.windows.net/myorganization/users/{0}/thumbnailPhoto?api-version=1.6";

// Attempts to retrieve the thumbnail image for the specified user, with fallback.
// Returns: Fully formatted string for supplying as the src attribute value of an img tag.
private string GetUserThumbnail(string userId)
{
    string thumbnail = "some base64 encoded fallback image";
    string mediaType = "image/jpg"; // whatever your fallback image type is
    string requestUrl = string.Format(ThumbUrl, userId);

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", GetToken());
    HttpResponseMessage response = client.GetAsync(requestUrl).Result;

    if (response.IsSuccessStatusCode)
    {
        // Read the response as a byte array
        var responseBody = response.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult();

        // The headers will contain information on the image type returned
        mediaType = response.Content.Headers.ContentType.MediaType;

        // Encode the image string
        thumbnail = Convert.ToBase64String(responseBody);
    }

    return $"data&colon;{mediaType};base64,{thumbnail}";
}

// Factored out for use with other calls which may need the token
private string GetToken()
{
    return HttpContext.Current.Session["Token"] == null ? string.Empty : HttpContext.Current.Session["Token"].ToString();
}
0
Will