Секрет клиента не включен в токен доступа

Мы используем MSAL и Azure AD для аутентификации.

У нас есть клиент и несколько микросервисов (которые не размещены в Azure).

Вызовы от клиента к микросервисам работают нормально. Но нам также нужно совершать вызовы между микросервисами. Мы пытаемся сделать это с помощью токена, использующего секрет клиента, со следующим кодом:

var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithClientSecret(clientSecret)
        .WithAuthority(authority)
        .Build();

    var aquireTokenForClientParameterBuilder = app.AcquireTokenForClient(scopes);

    var token = await aquireTokenForClientParameterBuilder.ExecuteAsync();

Когда мы пытаемся вызвать службу, она терпит неудачу:

    WwwAuthenticate {Bearer error = "invalid_token"}

Когда я просматриваю токен с помощью jwt.io, я не вижу, что секрет клиента находится в токене.

Любые идеи, как это исправить, или альтернативный способ вызова между службами?

Микросервис, выполняющий вызов, и микросервис, обрабатывающий этот вызов, должны совместно использовать секрет, чтобы JWT работал. Клиент не будет отправлять свой секрет в JWT, вместо этого клиент и микросервисы будут делиться секретом.

Muhammad Usama 10.02.2023 14:09

Если ваша модель похожа на этот Клиент ---> Ваш микросервис ----> Другой микросервис. Нужна ли аутентификация другим микросервисам?

Muhammad Usama 10.02.2023 14:12

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

Shiraz Bhaiji 10.02.2023 14:15

client_secret не должен появляться в токене... Как вы знаете, когда вы создаете секрет клиента на портале Azure AD, вам нужно скопировать и сохранить секрет в каком-то месте после его создания, потому что вы не можете видеть полный значение в Azure AD с тех пор. А пока вы можете увидеть этот документ, в котором действительно нет секретной области клиента.

Tiny Wang 10.02.2023 14:30

По сути, вы должны использовать здесь поток от имени потока, и вы можете взглянуть на этот ответ. stackoverflow.com/questions/74311506/…

Tiny Wang 10.02.2023 14:34

Возможно, вы немного смущены тем, для чего используется секрет? Как и в шифровании, ключ используется для шифрования открытого текста в шифр, здесь секрет также в основном используется в шифровании. Если у вас есть доступ ко второму микросервису в вашем случае, вам нужно проверить, использует ли этот сервис и ваш собственный секрет один и тот же секрет для JWT, если нет, то вы не сможете общаться с этим сервисом.

Muhammad Usama 10.02.2023 14:57

@TinyWang Работает от имени потока. Можете ли вы добавить это как ответ, чтобы я мог принять его

Shiraz Bhaiji 13.02.2023 09:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
7
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В вашем сценарии (у вас есть клиент + несколько микросервисов) вы аутентифицировались в клиенте и использовали токен доступа для вызова вашего сервиса, и теперь вы хотите, чтобы ваш сервис вызывал другой сервис, вы должны использовать от имени -поток здесь.

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

POST /oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com/<tenant>
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
client_id = {azure_ad_app_id}
&client_secret = {client_secret}
&assertion = {access token to this request}
&scope = {scope}
&requested_token_use=on_behalf_of

И если микросервис является основным приложением asp.net, то он должен интегрировать Microsoft.Identity.Web в приложение, и мы можем использовать var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "api://xx/scope_name" }); для создания токена от имени.

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