Вызов Microsoft Graph API с использованием контекста пользователя / токена пользователя C# - PullRequest
3 голосов
/ 12 февраля 2020

У меня есть веб-приложение, в котором пользователь регистрируется с использованием подхода, определенного в этом примере .

Теперь я хочу вызвать Microsoft Graph для этого пользователя. Я просмотрел много документов, и это очень сбивает с толку, как это должно быть сделано. Это то, что я пытался. Я не уверен, как получить токен доступа для этого пользователя.

//not sure about this
var token = await GetAccessToken();

var client = new GraphServiceClient(
    new DelegateAuthenticationProvider(
        requestMessage =>
        {
            requestMessage.Headers.Authorization =
                new AuthenticationHeaderValue("Bearer", token);

            return Task.FromResult(0);
        }));

var result = await client
    .Me
    .Request()
    .GetAsync();

В соответствии с этой документацией , мне нужно использовать поток конфиденциального клиента, но я не уверен, что необходимо использовать код авторизации потока или от имени. У меня нет доступа к коду авторизации из-за подхода Я следовал здесь .

ConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithCertificate(clientCertificate)
    .Build();

Может кто-нибудь подсказать мне, как получить токен доступа для Пользователя? Должен ли я использовать код авторизации или On-Behalf?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Если вы следуете семплу , указанному выше, вы на правильном пути. В следующем руководстве показано, как вызывать конечную точку Microsoft Graph / me от имени вошедшего в систему пользователя. В этом примере сложности промежуточного программного обеспечения ASP. NET Core и MSAL. Net инкапсулированы в разделе Microsoft.Identity.Web учебного пособия.

Вы должны уже зарегистрировать веб-приложение в Портал Azure. Теперь, когда вы будете звонить в Microsoft Graph, вам нужно зарегистрировать сертификат или секрет для веб-приложения. Затем в разрешениях API убедитесь, что выбрана вкладка Microsoft APIs и выберите те, которые вам нужны для Microsoft Graph.

Затем продолжайте следовать учебному пособию , чтобы MSAL мог подключиться к OpenID. Подключите события и используйте код авторизации, полученный промежуточным программным обеспечением ASP. NET Core. Как только токен получен, MSAL сохранит его в кеше токена (для этого также есть учебное пособие).

Продолжайте следовать этому учебнику, и вы добавите GraphServiceClientFactory.cs, который возвращает GraphServiceClient. Когда он получает токен доступа для Microsoft Graph, он отправляет в Graph запросы на отправку токена доступа в заголовок. Код: здесь :

public async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
      string accessToken = await acquireAccessToken.Invoke();

      // Append the access token to the request.
      request.Headers.Authorization = new AuthenticationHeaderValue(
      Infrastructure.Constants.BearerAuthorizationScheme, 
      accessToken);
}

Есть немного больше настроек, но следуйте инструкциям, и вы сможете получить токен, а затем использовать его для вызова Microsoft Graph.

0 голосов
/ 12 февраля 2020

Примечание: вам нужно будет сослаться на ваш проект с помощью Microsoft.Graph

Сначала вам потребуется функция для запроса токена доступа

async Task<string> Post(string uri, Dictionary<string, string> parameters)
{
    HttpResponseMessage response = null;
    try
    {
        using (var httpClient = new HttpClient() { Timeout = TimeSpan.FromSeconds(30) })
        {
            response = await httpClient.PostAsync(uri, new FormUrlEncodedContent(parameters));
            if (!response.IsSuccessStatusCode)
                throw new Exception("post request failed.");

            var content = response.Content.ReadAsStringAsync().Result;
            if (string.IsNullOrWhiteSpace(content))
                throw new Exception("empty response received.");

            return content;
        }
    }
    catch (Exception e)
    {
        throw new Exception(error);
    }
}

Затем вам понадобится модель для обработки ответа от веб-запроса

public class TokenRequest
{
    [JsonProperty("token_type")]
    public string TokenType { get; set; }

    [JsonProperty("access_token")]
    public string AccessToken { get; set; }
}

Затем вам понадобится функция для извлечения данных из веб-запроса

TokenRequest GetAccessToken()
{
    // request for access token.
    var parameters = new Dictionary<string, string>();
    parameters.Add("client_id", "YOUR CLIENT ID");
    parameters.Add("client_secret", "YOUR CLIENT SECRET");
    parameters.Add("scope", "https://graph.microsoft.com/.default");
    parameters.Add("grant_type", "client_credentials");

    var response = Post(
        $"https://login.microsoftonline.com/{YOUR TENANT ID}/oauth2/v2.0/token",
        parameters).Result;

    return JsonConvert.DeserializeObject<TokenRequest>(response);
}

Затем запрос на Аутентифицированный Graph API-клиент

GraphServiceClient GetClient()
{
    var tokenRequest = GetAccessToken();
    var graphClient = new GraphServiceClient(
        new DelegateAuthenticationProvider(
            async (requestMessage) => {
                await Task.Run(() => {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue(
                        tokenRequest.TokenType,
                        tokenRequest.AccessToken);

                    requestMessage.Headers.Add("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"");
                });
            }));

    return graphClient;
}

Затем, используя клиент, вы теперь можете выполнять свои запросы

var graphClient = GetClient();
var user = await graphClient
    .Users["SOME EMAIL ADDRESS HERE"]
    .Request()
    .GetAsync();

Очень важно: вы также должны убедиться, что у вас есть соответствующие разрешения API на вашем регистрация приложения в активном каталоге. Без него вы получите только ответ на запрос об отказе от графика api.

Надеюсь, это поможет.

...