У меня есть приложение Angular, и я смог сгенерировать для него токен, используя этот пример: https://github.com/Azure-Samples/ms-identity-javascript-angular-spa Это работает на стороне клиента и Я могу сгенерировать токен. Теперь я хочу отправить этот токен в свой веб-API и вызвать некоторые графические API. Это мой код для этого:
var scopes = new[] { "User.Read" };
var tenantId = "xxxx";
var clientId = "xxxx";
var clientSecret = "xxxx";
var token = "token_obtained_from_angular_app";
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, token);
var tokenRequestContext = new TokenRequestContext(scopes);
var token2 = onBehalfOfCredential.GetTokenAsync(tokenRequestContext, new CancellationToken()).Result.Token;
var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);
var user = await graphClient.Me.GetAsync();
Но я продолжаю получать эту ошибку:
'AADSTS50013: Проверка подписи не удалась. [Причина — ключ был найден, но использование ключа для проверки подписи не удалось. Отпечаток ключа, используемый клиентом: «xxxx», Найден ключ «Начало = 08.02.2024 17:02:53, Конец = 02/». 08/2029 17:02:53'. Посетите портал Azure, Graph Explorer или напрямую используйте MS Graph, чтобы просмотреть настроенные ключи для идентификатора приложения '00000000-0000-0000-0000-000000000000'. Просмотрите документацию по адресу https://docs.microsoft.com/en-us/graph/deployments, чтобы определить соответствующую конечную точку службы и https://docs.microsoft.com/en-us/graph/api/application-get? view=graph-rest-1.0&tabs=http для создания URL-адреса запроса, например «https://graph.microsoft.com/beta/applications/00000000-0000-0000-0000-000000000000»]. Идентификатор трассировки: xxxx Идентификатор корреляции: xxxx Метка времени: 18 марта 2024 г. 11:00:00Z'
Существует только одно приложение, которое создается как одностраничное приложение (SPA):
PS: Используя тот же токен, если я вызываю Me API в Postman, он работает нормально, и я могу получить профиль, но с помощью GraphClient я не могу этого сделать. По сути, все, что я хочу сделать, это получить профиль пользователя из моего токена, сгенерированного в приложении Angular.
Что мне не хватает?
@Sridevi, спасибо. Я последовал вашему примеру, добавленному в разрешениях API и т. д., но все равно это не сработало. Вы используете прямые вызовы POSTMAN. Не могли бы вы сообщить мне, что мне нужно сделать в классе GraphClient и как настроить аудит в GraphClient? Пытаюсь уже 3 день, но не получается :(
@Sridevi, вы имеете в виду, что в приложении Angular мне следует изменить область действия API?
Да, измените область на api://client_id/.default, если вы предоставили какой-либо API и сгенерировали токен с этой областью.
@Sridevi Я настроил в своем приложении Angular использование областей видимости: 'api://web_apis_clientid/.default', теперь, когда я пытаюсь войти в систему, Angular не генерирует никаких токенов. Выдает ошибку: ERROR ServerError: invalid_request: AADSTS50194: Application 'webapiclientid'(Web API) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'.
Не могли бы вы указать, какое значение вы передаете для параметра authority?
@Шридеви, дорогая Шридеви, не беспокойся, ты не решил мою проблему!! Я настроил свой веб-API на мультитенантность, и теперь он работает абсолютно нормально :)
Рад узнать, что ваша проблема решена, я опубликую то же самое, что и ответ!
Давайте продолжим обсуждение в чате.
Я чувствую себя знакомым с var token2 QAQ. Здесь у нас есть клиентское приложение реагирования и проект веб-API. Токен, который мы сгенерировали в приложении реагирования, может помочь нам получить доступ к ресурсам безопасности. Если ресурсом безопасности является API MS Graph, тогда мы должны установить область для API Graph, если это наш собственный API, то область также должна соответствовать пользовательскому API. . Предоставление разрешений пользовательского API в AAD помогает нам защитить наш собственный веб-API. У вас защищенный API, поэтому область действия, которую вы использовали в приложении реагирования, должна соответствовать тому, что сказала Шридеви. Затем вы можете использовать предоставленный вами код для создания еще одного токена доступа для Graph API.





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

Чтобы устранить эту ошибку, обязательно сгенерируйте доступ с открытой областью API (api://client_id/.default) и используйте его как значение
assertionдля вызова OBO.
Вы можете расшифровать это утверждение, вставив его на веб-сайт jwt.ms и проверив, имеют ли утверждения aud и scp значения API или нет, вот так:

Когда я заменил токен утверждением, созданным с открытой областью API (api://client_id/.default), я успешно получил ответ с данными вошедшего в систему пользователя:
using System;
using System.Threading;
using System.Threading.Tasks;
using Azure.Core;
using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Identity.Client;
class Program
{
static async Task Main(string[] args)
{
var scopes = new[] { "User.Read" };
var tenantId = "tenantId";
var clientId = "appID";
var clientSecret = "secret";
var token = "token_with_API_scope";
var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, token);
var tokenRequestContext = new TokenRequestContext(scopes);
// Get the token
var tokenResult = await onBehalfOfCredential.GetTokenAsync(tokenRequestContext, new CancellationToken());
// Print the token to the console
Console.WriteLine($"Access Token: {tokenResult.Token}");
var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);
var user = await graphClient.Me.GetAsync();
Console.WriteLine();
// Print user information to the console
Console.WriteLine($"User Id: {user.Id}");
Console.WriteLine($"User Display Name: {user.DisplayName}");
}
}
Ответ:

Если вы передаете конечную точку /common в качестве центра управления, обязательно измените приложения на мультитенантные в вашем случае.
При использовании потока от имени token_obtained_from_angular_app должен иметь API, а не Microsoft Graph. Вы получите эту ошибку, если используете токен с MS Graph
audот имени потока. Обратитесь к этому stackoverflow.com/questions/77000068/…