Разрешение Azure AD b2b «Читать все профили всех пользователей» - PullRequest
0 голосов
/ 05 октября 2018

Мне делегировано разрешение пользователя User.ReadBasic.All.В документации говорится:

"Приложение сможет считывать базовый набор свойств профиля других пользователей в вашей организации от имени вошедшего в систему пользователя.включает отображаемое имя, имя и фамилию, адрес электронной почты, открытые расширения и фотографию. Также позволяет приложению читать полный профиль вошедшего в систему пользователя. "

Как получить всех пользователей с помощьюбазовые профили?

var accessToken = authContext
    .AcquireTokenAsync(graphResourceId, new ClientCredential(clientId, secret))
    .Result
    .AccessToken;

var graphserviceClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(requestMessage => {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
        return Task.FromResult(0);
    }));

Можете ли вы подтвердить, что мой URL "Authority" правильный или нет?

string authority = "https://login.microsoftonline.com/{tenantId}/common/oauth2/v2.0/token?&response_type=code&scope=openid%20profile%20User.Read%20User.ReadWrite%20User.ReadBasic.All";
AuthenticationContext authContext = new AuthenticationContext(authority);
var accessToken = authContext
    .AcquireTokenAsync(graphResourceId, new ClientCredential(clientId, secret))
    .Result
    .AccessToken;

Ответы [ 4 ]

0 голосов
/ 15 октября 2018

Здесь вы действительно получаете токен из кеша (используя AcquireTokenSilentAsync), тогда как ваш токен действительно был добавлен в кеш, когда вы выкупили код авторизации, созданный ASP.NET с помощью вызова AcquireTokenByAuthorizationCodeAsync.Вы найдете объяснение в концептуальной документации ADAL.NET: Получение токена по коду авторизации в Web Apps

Обратите внимание, что для вызова графа вы, скорее всего, захотите использовать MSAL.NET.См., Например, следующую ветку signInAndCallMicrosoftGraph образца с именем: aspnetcore-webapp-openidconnect-v2 .Это выражается в виде учебника, объясняющего сначала этап входа в систему, а затем вызывающего API (в данном случае Microsoft Graph)

Наконец, вы используете полномочия не для Azure AD B2C (и как яупомянутое в комментарии к вашему вопросу, для Azure AD оно должно быть уменьшено до login.microsoftonline.com{tenantId}/common)

0 голосов
/ 05 октября 2018

То же самое независимо от того, используете ли вы User.ReadBasic.All или User.Read.All: `

await graphServiceClient
    .Users
    .Request()
    .GetAsync();

Единственное различие между ними будет в наборе результатов.Свойства, недоступные с помощью User.ReadBasic.All, просто не будут возвращены в результатах.

0 голосов
/ 10 октября 2018

Я получил решение и получил базовый профиль пользователей моей организации.Решение. Получите токен доступа с помощью метода AcquireTokenSilentAsync. Подробнее

options.Scope.Add("User.ReadBasic.All");

options.ResponseType = "code id_token";                

OnAuthorizationCodeReceived = async ctx =>
{
    var request = ctx.HttpContext.Request;
    var currentUri = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
    var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);

    var distributedCache = ctx.HttpContext.RequestServices.GetRequiredService<IDistributedCache>();
    string userId = ctx.Principal.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

    var cache = new DistributedTokenCache(distributedCache, userId);

    var authContext = new AuthenticationContext(ctx.Options.Authority, cache);

    var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
        ctx.ProtocolMessage.Code,
        new Uri(currentUri),
        credential,
        ctx.Options.Resource);

    ctx.HandleCodeRedemption(result.AccessToken, result.IdToken);
}

services.AddDistributedMemoryCache();


private async Task<string> GetAccessTokenAsync()
        {
            string authority = "https://login.microsoftonline.com/{0}/common/oauth2/v2.0/token";
            string tenantId = User.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
            authority = String.Format(authority, tenantId);
            string userId = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;
            var cache = new DistributedTokenCache(_memoryCache, userId);
            var authContext = new AuthenticationContext(authority, cache);
            string graphResourceId = "https://graph.microsoft.com";
            string clientId = "XXX-XXX-XXX-XXX";
            string secret = "XXXX";
            var credential = new ClientCredential(clientId, secret);
            var result = await authContext.AcquireTokenSilentAsync(graphResourceId, credential, new UserIdentifier(userId, UserIdentifierType.UniqueId));
            return result.AccessToken;
        }
0 голосов
/ 05 октября 2018

Вы можете нажать конечную точку Graph API users/<email_id> (https://graph.microsoft.com/v1.0/users/<email_id_of_the_user>) с соответствующим токеном на предъявителя для получения основных сведений о других пользователях.

Вы также можете попробовать это в графическом обозревателе - https://developer.microsoft.com/en-us/graph/graph-explorer#

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...