Получить фотографию профиля из Azure Active Directory

В нашем приложении мы установили Azure AD в качестве поставщика удостоверений. Мы хотим отобразить изображение профиля, которое должно прийти из Azuare AD, в приложении. Как мы можем получить изображение профиля из Azure AD?

Для тестирования я добавил одну учетную запись Windows Live Id (с изображением профиля) в Azure AD. Мы тогда попробовали это с помощью Graph Explorer, но не повезло.

Заранее спасибо, если кто-то может предоставить некоторую справку / пример кода.

Hitesh

3 ответа

Вы можете использовать клиент Azure Active Directory Graph, чтобы получить уменьшенное фото пользователя

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());
}

Azure AD возвращает фотографию пользователя в двоичном формате, вам необходимо преобразовать ее в строку Base64

Получение фотографий через Graph Explorer не поддерживается. Предполагая, что "SignInUser" уже содержит зарегистрированную сущность пользователя, этот фрагмент кода с использованием клиентской библиотеки должен работать для вас...

        #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 Надеюсь, это поможет,

Согласно Документам API Azure AD Graph, Microsoft рекомендует перейти на Microsoft Graph, так как API Azure AD Graph постепенно сокращается.

Однако, чтобы легко получить фотографию через Azure AD, на данный момент используйте этот шаблон URL:

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

Например (это фальшивый идентификатор пользователя):

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();
}
Другие вопросы по тегам