Мы используем 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, я не вижу, что секрет клиента находится в токене.
Любые идеи, как это исправить, или альтернативный способ вызова между службами?
Если ваша модель похожа на этот Клиент ---> Ваш микросервис ----> Другой микросервис. Нужна ли аутентификация другим микросервисам?
В этом случае да. Первая микрослужба имеет секрет клиента второй микрослужбы. Проблема в том, что когда я создаю токен доступа в первом микросервисе для вызова второго, секрет клиента не находится в токене
client_secret не должен появляться в токене... Как вы знаете, когда вы создаете секрет клиента на портале Azure AD, вам нужно скопировать и сохранить секрет в каком-то месте после его создания, потому что вы не можете видеть полный значение в Azure AD с тех пор. А пока вы можете увидеть этот документ, в котором действительно нет секретной области клиента.
По сути, вы должны использовать здесь поток от имени потока, и вы можете взглянуть на этот ответ. stackoverflow.com/questions/74311506/…
Возможно, вы немного смущены тем, для чего используется секрет? Как и в шифровании, ключ используется для шифрования открытого текста в шифр, здесь секрет также в основном используется в шифровании. Если у вас есть доступ ко второму микросервису в вашем случае, вам нужно проверить, использует ли этот сервис и ваш собственный секрет один и тот же секрет для JWT, если нет, то вы не сможете общаться с этим сервисом.
@TinyWang Работает от имени потока. Можете ли вы добавить это как ответ, чтобы я мог принять его
В вашем сценарии (у вас есть клиент + несколько микросервисов) вы аутентифицировались в клиенте и использовали токен доступа для вызова вашего сервиса, и теперь вы хотите, чтобы ваш сервис вызывал другой сервис, вы должны использовать от имени -поток здесь.
Весь процесс можно понимать как использование на стороне сервера запроса, приведенного ниже, для создания нового токена доступа и использования его для отправки запроса в другую службу.
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" });
для создания токена от имени.
Микросервис, выполняющий вызов, и микросервис, обрабатывающий этот вызов, должны совместно использовать секрет, чтобы JWT работал. Клиент не будет отправлять свой секрет в JWT, вместо этого клиент и микросервисы будут делиться секретом.