Реализовать Microsoft Graph API в проекте .netcore API - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь написать .netcore API, который получает токен на предъявителя от стороннего Webapp.Этот API .netcore должен обращаться к API графа Microsoft и получать информацию о группе пользователей из Azure AD.

Я следил за примером проекта https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore.

Но, к сожалению, для этого используется граф AAD, а неMicrosoft graph API.

В приведенном выше примере я попытался реализовать Graph API в проекте api .netcore.

То, что я пробовал

Iизменил график AAD на Graph API в AzureAdAuthenticationBuilderExtensions.cs (в проекте веб-приложения)

options.Resource = "https://graph.microsoft.com";

Также в проекте API я использовал нюгет Microsoft.Graph.И я пытаюсь создать GraphServiceClient, используя код ниже

public GraphServiceClient GetClient(string accessToken, IHttpProvider provider = null)
    {
        var words = accessToken.Split(' ');
        var token = words[1];
        var delegateAuthProvider = new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);

            return Task.FromResult(0);
        });

        var graphClient = new GraphServiceClient(delegateAuthProvider, provider ?? new HttpProvider());

        return graphClient;
    }

И, наконец, я пытаюсь получить доступ к информации о пользователе, используя код ниже,

public async Task<IEnumerable<Group>> GetGroupAsync(string accessToken)
    {
        var graphClient = GetClient(accessToken);
        try
        {
            User me = await graphClient.Me.Request().GetAsync();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }

        var user= await graphClient.Users["***"].Request().Expand("MemberOf").GetAsync();


        var userEmail = "testemail@test.com";
        var usergroup = await graphClient.Users[userEmail].GetMemberGroups(false).Request().PostAsync();
        var groupList = new List<Group>();

        foreach (var g in usergroup.CurrentPage)
        {
            var groupObject = await graphClient.Groups[g].Request().GetAsync();
            groupList.Add(groupObject);
        }
        return groupList;
    }

Но когда я пытаюсьcode Я получаю сообщение об ошибке "Microsoft.Graph.ServiceException: Code: InvalidAuthenticationToken Сообщение: ошибка проверки маркера доступа. Внутренняя ошибка в Microsoft.Graph.HttpProvider."

Может кто-нибудь мне помочь, пожалуйста?

Заранее спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Токен доступа, переданный GetGroupAsync, неверен, и я запутался, почему вам нужно разделить токен:

var words = accessToken.Split(' ');
var token = words[1];

Но не берите в голову, так как вы изменили options.Resource = "https://graph.microsoft.com"; ADAL поможет вам получить токен доступа для Microsoft Graph API в функции OnAuthorizationCodeReceived и сохранить токены в кеше.

Чтобы получить токен доступа, вы можете использовать ADAL для получения токена из кэша:

AuthenticationResult result = null;
// Because we signed-in already in the WebApp, the userObjectId is know
string userObjectID = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;

// Using ADAL.Net, get a bearer token to access the TodoListService
AuthenticationContext authContext = new AuthenticationContext(AzureAdOptions.Settings.Authority, new NaiveSessionCache(userObjectID, HttpContext.Session));
ClientCredential credential = new ClientCredential(AzureAdOptions.Settings.ClientId, AzureAdOptions.Settings.ClientSecret);
result = await authContext.AcquireTokenSilentAsync("https://graph.microsoft.com", credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

Тогда вы можете передать этот токен своей функции:

await GetGroupAsync(result.AccessToken);

Измените функцию GetClient, чтобы удалить разделенную часть:

public GraphServiceClient GetClient(string accessToken, IHttpProvider provider = null)
{

    var delegateAuthProvider = new DelegateAuthenticationProvider((requestMessage) =>
    {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

        return Task.FromResult(0);
    });

    var graphClient = new GraphServiceClient(delegateAuthProvider, provider ?? new HttpProvider());

    return graphClient;
}
...