ПРИЧИНА
Эта проблема возникает из-за того, что у приложения нет необходимых прав доступа к пользовательской информации.Поэтому вам необходимо назначить необходимые привилегии для этого запроса.
РЕШЕНИЕ
Для доступа к 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
См. Снимок экрана ниже:
AZURE PORTAL WAY OUT
Чтобы назначить разрешение на портале Azure, см. Снимок экрана ниже:
ПРИМЕР веб-формы ASP.NET:
1.Добавить новую страницу Aspx в проект
Возьмите новую веб-форму, здесь я взял Token.aspx и установите его свойство, как показано ниже
<%@ Page Language="C#" AutoEventWireup="true" Async="true"
CodeBehind="Token.aspx.cs" Inherits="WebFormTest.Token" %>
2.Добавить новую ссылку из Nuget
В ссылку на свой проект добавьте новую ссылку на службу из консоли диспетчера пакетов Nuget, как показано ниже:
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.Вывод токена
Если вы установите отладчик на переменную результатов , вы получите свой токен, как показано ниже
6.Доступ к Microsoft Graph API
Теперь перейдите к следующей строке и установите отладчик, как показано ниже
string output = await response.Content.ReadAsStringAsync ();
Вы увидите следующий вывод
Надеюсь, это решит вашу проблему.Спасибо.