Вы не можете повторно использовать токен из вашего контроллера и отправить его в Graph, чтобы Graph считал вас пользователем.Это не работает, потому что токен также содержит IP-адрес клиента, и это не тот IP-адрес, на котором работает ваш контроллер (возможно, только на компьютере разработчика).Вместо этого ваше приложение должно иметь разрешение Directory.AccessAsUser.All
.
Если у вас есть это, в своем бэкэнде вы можете создать
new AuthenticationContext("https://login.microsoftonline.com/common/")
и позвонить AuthenticationContext.AcquireTokenAsync(scope, clientCredentials, userAssertation)
.
- В этом случае
scope
должно быть https://graph.microsoft.com/
. clientCredentials
должно содержать идентификатор вашего приложения и секрет. userAssertation
должен содержать - токен пользователя в виде диссертации
- тип должен быть
urn:ietf:params:oauth:grant-type:jwt-bearer
- имя пользователя должно быть пользователями UPN
Когда этот звонок вернется, вы получите новый токен.Это может использоваться в вызовах графа как токен-носитель из кода вашего контроллера для доступа к ресурсам так, как это сделает сам пользователь.
Но убедитесь, что этот токен не выходит из-под вашего контроля (например, секрет приложения),Потому что до тех пор, пока этот токен не истекает, его можно использовать с любой машины в мире, чтобы действовать как пользователь.
Обновление
Если у вас нет токена пользователя, вынужен токен приложения для доступа к графику API.Согласно https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow вы можете получить токен для вашего приложения, позвонив по номеру
using (var client = new HttpClient())
{
var content = new Dictionary<string, string>
{
{ "grant_type", "client_credentials" },
{ "scope", "https://graph.microsoft.com/.default"},
{ "client_id", "<ApplicationId>" },
{ "client_secret", "<ApplicationSecret>" }
};
var response = await client.PostAsync($"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token", content);
var content = await response.Content.ReadAsStringAsync();
dynamic answer = JObject.Parse(content);
return answer.access_token;
}
Когда вы отправите этот токен на график в заголовке авторизации с префиксом Bearer
, вы сможете получить доступвсе ресурсы данного арендатора, предоставленные вашему заявлению.