Graph API: ключ был найден, но использование ключа для проверки подписи не удалось. Отпечаток ключа, используемый клиентом: xxxx

У меня есть приложение 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.

Что мне не хватает?

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

Sridevi 19.03.2024 12:36

@Sridevi, спасибо. Я последовал вашему примеру, добавленному в разрешениях API и т. д., но все равно это не сработало. Вы используете прямые вызовы POSTMAN. Не могли бы вы сообщить мне, что мне нужно сделать в классе GraphClient и как настроить аудит в GraphClient? Пытаюсь уже 3 день, но не получается :(

K V Sharma 19.03.2024 12:43

@Sridevi, вы имеете в виду, что в приложении Angular мне следует изменить область действия API?

K V Sharma 19.03.2024 12:45

Да, измените область на api://client_id/.default, если вы предоставили какой-либо API и сгенерировали токен с этой областью.

Sridevi 19.03.2024 12:50

@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'.

K V Sharma 19.03.2024 12:57

Не могли бы вы указать, какое значение вы передаете для параметра authority?

Sridevi 19.03.2024 13:01

@Шридеви, дорогая Шридеви, не беспокойся, ты не решил мою проблему!! Я настроил свой веб-API на мультитенантность, и теперь он работает абсолютно нормально :)

K V Sharma 19.03.2024 13:04

Рад узнать, что ваша проблема решена, я опубликую то же самое, что и ответ!

Sridevi 19.03.2024 13:08

Давайте продолжим обсуждение в чате.

Sridevi 19.03.2024 13:11

Я чувствую себя знакомым с var token2 QAQ. Здесь у нас есть клиентское приложение реагирования и проект веб-API. Токен, который мы сгенерировали в приложении реагирования, может помочь нам получить доступ к ресурсам безопасности. Если ресурсом безопасности является API MS Graph, тогда мы должны установить область для API Graph, если это наш собственный API, то область также должна соответствовать пользовательскому API. . Предоставление разрешений пользовательского API в AAD помогает нам защитить наш собственный веб-API. У вас защищенный API, поэтому область действия, которую вы использовали в приложении реагирования, должна соответствовать тому, что сказала Шридеви. Затем вы можете использовать предоставленный вами код для создания еще одного токена доступа для Graph API.

Tiny Wang 19.03.2024 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
460
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка произошла, поскольку вы используете токен 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 в качестве центра управления, обязательно измените приложения на мультитенантные в вашем случае.

Другие вопросы по теме