Использование authProvider с MS SDK для вызовов графа в C # - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь создать консольное приложение C # для подключения к графическому API и получения списка пользователей из AzureAD от арендатора. Я зарегистрировал приложение, и админ дал мне следующее

  • Имя арендатора и ID арендатора
  • идентификатор клиента (также иногда называемый идентификатором приложения)
  • Секрет клиента

Используя SDK код C #, который мне нужно использовать, выглядит следующим образом (https://docs.microsoft.com/en-us/graph/api/user-list?view=graph-rest-1.0&tabs=cs):

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var users = await graphClient.Users
    .Request()
    .GetAsync();

Однако консольное приложение будет запускаться как пакетный процесс, поэтому взаимодействие с пользователем вообще не будет. Поэтому, чтобы предоставить authProvider, я следовал этой статье на сайте MS Docs: https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS

И я думаю, что для своих целей мне нужно перейти к «Потоку OAuth учетных данных клиента». Код, который показан на этом URL. Но и здесь тоже.

IConfidentialClientApplication clientApplication = ClientCredentialProvider.CreateClientApplication(clientId, clientCredential);
ClientCredentialProvider authProvider = new ClientCredentialProvider(clientApplication);

Проблема в том, что Visual Studio не распознает класс ClientCredentialProvider. Я не уверен, какую сборку импортировать. Я использую следующее использование в верхней части.

using Microsoft.Identity.Client;
using Microsoft.IdentityModel.Clients;
using Microsoft.IdentityModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Я не очень разбираюсь в репозиториях GitHub и использую Visual Studio 2015. Мне был бы интересен пример кода; Я посмотрел, но не могу найти ни одного. У MS есть несколько лекций, но они используют другого типа провайдера аутентификации, который аутентифицируется в интерактивном режиме, а это не то, что я ищу. Я хочу получить токен, используя TenantId / ClientId и Client Secret.

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

Если вы хотите переключаться между пользователями, замените пользователей var следующим кодом:

IGraphServiceUsersCollectionPage users = graphServiceClient.Users.Request().GetAsync().Result;
foreach (User user in users)
{
Console.WriteLine("Found user: " + user.Id);
}
0 голосов
/ 15 мая 2019

ClientCredentialProvider является частью пакета Microsoft.Graph.Auth. Вы можете прочитать больше об этом пакете на https://github.com/microsoftgraph/msgraph-sdk-dotnet-auth

Обратите внимание, что этот пакет в настоящее время (по состоянию на 2019-05-15) находится в режиме предварительного просмотра, поэтому вы можете подождать, прежде чем использовать его в производственном приложении.

Кроме того, в следующем примере используется библиотека аутентификации Microsoft для .NET (MSAL) напрямую для настройки Microsoft Graph SDK с использованием аутентификации только для приложения:

// The Azure AD tenant ID or a verified domain (e.g. contoso.onmicrosoft.com) 
var tenantId = "{tenant-id-or-domain-name}";

// The client ID of the app registered in Azure AD
var clientId = "{client-id}";

// *Never* include client secrets in source code!
var clientSecret = await GetClientSecretFromKeyVault(); // Or some other secure place.

// The app registration should be configured to require access to permissions
// sufficient for the Microsoft Graph API calls the app will be making, and
// those permissions should be granted by a tenant administrator.
var scopes = new string[] { "https://graph.microsoft.com/.default" };

// Configure the MSAL client as a confidential client
var confidentialClient = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithAuthority($"https://login.microsoftonline.com/$tenantId/v2.0")
    .WithClientSecret(clientSecret)
    .Build();

// Build the Microsoft Graph client. As the authentication provider, set an async lambda
// which uses the MSAL client to obtain an app-only access token to Microsoft Graph,
// and inserts this access token in the Authorization header of each API request. 
GraphServiceClient graphServiceClient =
    new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => {

            // Retrieve an access token for Microsoft Graph (gets a fresh token if needed).
            var authResult = await confidentialClient
                .AcquireTokenForClient(scopes)
                .ExecuteAsync();

            // Add the access token in the Authorization header of the API request.
            requestMessage.Headers.Authorization = 
                new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        })
    );

// Make a Microsoft Graph API query
var users = await graphServiceClient.Users.Request().GetAsync();

(Обратите внимание, что в этом примере используется последняя версия пакета Microsoft.Identity.Client. Более ранние версии (до версии 3) не включали ConfidentialClientApplicationBuilder .)

...