Не удалось получить токен доступа из зарегистрированного приложения в Azure AD - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать новый экземпляр GraphServiceClient из Microsoft.Graph в диспетчере слепков.

Что уже сделано:

  1. Создать ASP.NET Core 2.0Консольное приложение
  2. Добавление Micrososft.Graph из Nugget
  3. Зарегистрируйте приложение на портале Azure AD, чтобы получить секретный идентификатор приложения (пароль приложения) и идентификатор приложения (идентификатор клиента)
  4. Получение идентификатора клиента (ID каталога) с портала Azure AD

По сути, вот весь код моего проекта ASP.NET Core 2.0 (консольное приложение):

using Microsoft.Graph;
using Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace SendADUserListEmail.Services
{
    // Response object from Azure AD
    public class AzureADResponse
    {
        public string token_type { get; set; }
        public int expires_in { get; set; }
        public string access_token { get; set; }
    }

    /// <summary>
    /// Micrososf Graph vs Azure AD Graph :
    /// https://blogs.msdn.microsoft.com/aadgraphteam/2016/07/08/microsoft-graph-or-azure-ad-graph/
    /// 
    /// Introduction to the Azure Active Directory Graph API :
    /// https://www.red-gate.com/simple-talk/cloud/security-and-compliance/azure-active-directory-part-5-graph-api/
    /// 
    /// ULTIMATE TUTORIAL ABOUT MICROSOFT GRAPH APIS
    /// https://bytescout.com/blog/microsoft-graph-apis.html
    /// 
    /// Startup !!! TO READ !!! :
    /// https://github.com/microsoftgraph/msgraph-sdk-dotnet
    /// 
    /// Creating the application Client ID and Client Secret from Microsoft Azure new portal
    /// - Register an application on Azure Portal : 
    /// - 1. Accèder au portail
    /// - 2. Inscription d'application
    /// - 3. Voir Paramètres > Propriétés
    /// https://www.netiq.com/communities/cool-solutions/creating-application-client-id-client-secret-microsoft-azure-new-portal/
    /// 
    /// Microsoft App Registration Portal (alternative method to register an app) :
    /// https://apps.dev.microsoft.com
    /// 
    /// Microsoft Graph explorer (graph request tester) :
    /// https://developer.microsoft.com/en-us/graph/graph-explorer
    /// </summary>
    class GraphApiHelper
    {
        // Client
        GraphServiceClient GraphServiceClient = null;

        // Tenant ID (directory ID)
        private const string tenantId = "/*MY_TENANT_ID_FROM_AZURE_AD_PORTAL*/";
        // App ID (client ID)
        private const string appId = "/*MY_APP_ID_FROM_AZURE_AD_PORTAL*/";
        // Secret ID (app password)
        private const string appSecret = "/*MY_APP_SECRET_FROM_AZURE_AD_PORTAL*/";

        public void Connexion()
        {
            string url = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
            string @params = $"client_id={appId}&" +
                "scope=User.Read&" +
                $"client_secret={appSecret}&" +
                "grant_type=client_credentials";

            try
            {
                string accessToken = "";
                string jsonStringResult = "";
                AzureADResponse response = new AzureADResponse();

                // Getting the access token from Azure AD
                using (WebClient webClient = new WebClient())
                {
                    webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

                    jsonStringResult = webClient.UploadString(url, @params);
                    response = JsonConvert.DeserializeObject<AzureADResponse>(jsonStringResult);

                    // Set the access token
                    accessToken = response.access_token;
                }

                // Initialize the Microsoft Graph client
                GraphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
                {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                    return Task.FromResult(0);
                }));
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }
        }

        public List<SystemUser> GetSystemUserList()
        {
            Connexion();

            return null;
        }
    }
}

Я получаю эту ошибку при попытке выполнить почтовый запрос с System.Net.WebClient:

string url = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
string @params = $"client_id={appId}&" +
            "scope=User.Read&" +
            $"client_secret={appSecret}&" +
            "grant_type=client_credentials";

jsonStringResult = webClient.UploadString(url, @params);

Удаленный сервер возвратил ошибку: (400) Неверный запрос.

Исходя из этого источника: https://docs.microsoft.com/en-us/graph/auth-v2-service Я предполагаю получить что-то вроде этого:

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "access_token": 
  "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBP..."
}

Мне нужен токен доступа для инициализации GraphServiceClient.

Есть идеи, почему Microsoft Azure не удалось выполнить этот запрос?

1 Ответ

0 голосов
/ 22 января 2019

Вы должны следовать советам juunas и использовать библиотеку, подобную ADAL, которая сделает это за вас.

Если вы хотите сделать вызов, чтобы получить токен самостоятельно, сначала убедитесь, что проблема возникает из вашего кода, а неиз регистрации вашего приложения, протестировав тот же запрос от такого инструмента, как Postman.Когда вы получаете ошибку 400, вероятно, это ваш код и ваш запрос не правильно сформирован.

Я не привык делать HTTP-вызовы с WebClient, поэтому я не знаю, что не так, но я быскажем, это может быть связано с тем, как вы обрабатываете свои параметры.На вашем месте я бы использовал и HttpClient, вы можете найти несколько примеров запросов с URL-адресом формы, закодированным в stackoverflow ( Как выполнить POST с использованием типа содержимого HTTPclient = application / x-www-form-urlencoded ).

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