Authorization_RequestDenied, когда у меня есть код токена доступа - PullRequest
0 голосов
/ 26 марта 2019

Blockquoteafter токен доступа, когда я вызвал Graph API, который возвращает Authorization_RequestDenied запрос на токен доступа

using (var webClient = new WebClient()) 
{
   var requestParameters = new NameValueCollection();
   requestParameters.Add("resource", resource);
   requestParameters.Add("client_id", clientID); 
   requestParameters.Add("grant_type", "client_credentials");
   requestParameters.Add("client_secret", secret);
   var url = $"https://login.microsoftonline.com/{tenant}/oauth2/token";
   var  responsebytes = await webClient.UploadValuesTaskAsync(url,"POST",requestParameters);
   var responsebody =Encoding.UTF8.GetString(responsebytes);
   var obj = JsonConvert.DeserializeObject<JObject>(responsebody);
   var token = obj["access_token"].Value<string>();
   access_token = token;  
}

после того, как я запрашиваю форму, таким образом получите список пользователей из Azure AD

 public async Task<List<listItems>> GetData1( string token)
 {
     HttpClient http = new HttpClient(); 
     string query = "https://graph.microsoft.com/v1.0/users";
     HttpRequestMessage httpClient = new HttpRequestMessage(HttpMethod.Get, query);
     httpClient.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
     var res = await http.SendAsync(httpClient);
     var res1= await res.Content.ReadAsStringAsync();
     List<listItems> lstUsers = new List<listItems>();
     JObject results = JObject.Parse(res1); listItems itm;
      foreach (var Jelem in results["value"])
      { 
          string id = (string)Jelem["id"];
          string displayName = (string)Jelem["displayName"];
          itm = new listItems(); itm.id = id;
          itm.displayname = displayName; lstUsers.Add(itm);
      }
      return lstUsers;
 }

чем я получил "ошибку": { "code": "Authorization_RequestDenied", "message": "Insufficient privileges to complete the operation.", "innerError": { "request-id": "1ba8a3e3-7e27-4bad-affd-6929b9af3a9f", "date": "2019-03-26T10:56:26" } вышеуказанная ошибка

, пожалуйста, помогите мне решить эту ошибку

1 Ответ

1 голос
/ 27 марта 2019

ПРИЧИНА

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

РЕШЕНИЕ

Для доступа к https://graph.microsoft.com/v1.0/users API Требуется одно из следующих разрешений.

Тип разрешения (от минимального до наиболее привилегированного)

Делегированный (рабочий или учебный аккаунт) User.Read, User.ReadWrite, User.ReadBasic.All,

User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All,

Directory.AccessAsUser.All

Делегированный (личная учетная запись Microsoft) User.Read, User.ReadWrite

Приложение User.Read.All, User.ReadWrite.All, Directory.Read.All,

Каталог.ReadWrite.All

См. Снимок экрана ниже:

enter image description here

AZURE PORTAL WAY OUT

Чтобы назначить разрешение на портале Azure, см. Снимок экрана ниже:

enter image description here

ПРИМЕР веб-формы ASP.NET:

1.Добавить новую страницу Aspx в проект

Возьмите новую веб-форму, здесь я взял Token.aspx и установите его свойство, как показано ниже

 <%@ Page Language="C#" AutoEventWireup="true" Async="true"
 CodeBehind="Token.aspx.cs" Inherits="WebFormTest.Token" %>

2.Добавить новую ссылку из Nuget

В ссылку на свой проект добавьте новую ссылку на службу из консоли диспетчера пакетов Nuget, как показано ниже:

enter image description here

3.Token.aspx.cs

Вставьте следующий код вне области действия метода Page_Load . Вам может потребоваться добавить следующую ссылку в свое пространство имен, если вы столкнулись с ошибкой отсутствующей ссылки.

с использованием System.Net.Http;

с использованием System.Net.Http.Headers;

class AccessToken
        {
            public string access_token { get; set; }
        }
        // Resource Owner Password Credentials Format
        private async Task<string> GetTokenByROPCFormat()
        {

            string tokenUrl = $"https://login.microsoftonline.com/YourTenantId/oauth2/token";
            var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

            req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                ["grant_type"] = "password",
                ["client_id"] = "ApplicationID",
                ["client_secret"] = "ApplicationSecret",
                ["resource"] = "https://graph.microsoft.com",
                ["username"] = "userEmailwithAccessPrivilege",
                ["password"] = "YourPassword"
            });

            dynamic json;
            dynamic results;
            HttpClient client = new HttpClient();

            var res = await client.SendAsync(req);

            json = await res.Content.ReadAsStringAsync();

            //Token Output
            results = JsonConvert.DeserializeObject<AccessToken>(json);
            Console.WriteLine(results.access_token);


            //New Block For Accessing Data from Microsoft Graph API
            HttpClient newClient = new HttpClient();

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me");

            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", results.access_token);
            HttpResponseMessage response = await newClient.SendAsync(request);

            string output = await response.Content.ReadAsStringAsync();
            Console.WriteLine("Responsed data Is-\n\n" + output + "");
            return output;
        }

4.Вызовите метод GetTokenByROPCFormat () внутри Page_Load

Теперь вызовите GetTokenByROPCFormat внутри Page_Load , как показано ниже

RegisterAsyncTask(new PageAsyncTask(GetTokenByROPCFormat));

5.Вывод токена

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

enter image description here

6.Доступ к Microsoft Graph API

Теперь перейдите к следующей строке и установите отладчик, как показано ниже

string output = await response.Content.ReadAsStringAsync ();

Вы увидите следующий вывод

enter image description here

Надеюсь, это решит вашу проблему.Спасибо.

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