У меня есть ситуация, когда есть. net Core Web API, который мы используем для управления некоторыми "машинами". Одним из представленных API является моделирование работы таких машин. Машины имеют разные версии, разные версии имеют разное внутреннее поведение, но один и тот же интерфейс.
Мы разработали серию различных. net Core Web API для моделирования каждой из разных версий машин.
Поэтому мне нужно вызвать API из API, это звучит довольно просто, поскольку я уже делаю это с Microsoft Graph .
В файле startup.cs я have:
public void ConfigureServices(IServiceCollection services)
{
// To protect the API with Azure AD
services
.AddProtectedWebApi(Configuration);
// To have ITokenAcquisition when calling the specific simulation API
services
.AddMicrosoftIdentityPlatformAuthentication(Configuration)
.AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })
.AddInMemoryTokenCaches();
Я тестирую его с Postman с учетом этого потока:
- Я получаю токен на предъявителя с Postman для доступа к универсальному c API
- Почтальон вызывает SimulationDispatcherController в обобщенном c API
- SimulationDispatcherController вызывает указанный c API моделирования
- Поток результатов возвращается обратно к Почтальону
Что я испытываю:
Если я оставлю это так, в почтальоне я получу в результате страницу входа в систему
<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
<title>Sign in to your account</title>
[...]
Если я уберу строку .AddMicrosoftIdentityPlatformAuthentication(Configuration)
Я могу связаться с SimulationDispatcherController, но когда он пытается вызвать другой API, я получаю сообщение об ошибке:
MSAL.NetCore.4.8.1.0.MsalUiRequiredException:
ErrorCode: user_null
Microsoft.Identity.Client.MsalUiRequiredException: No account or login hint was passed to the AcquireTokenSilent call.
[...]
Я пытаюсь получить токен с объектом ITokenAcquisition
, вызывая GetAccessTokenOnBehalfOfUserAsync(_Scopes);
, где находится область действия требуемый для указанного c API.
Есть ли у вас какие-либо предложения или ссылки на документацию, которые лучше объясняют, как настроить MSAL в API, защищенном Azure AD?
РЕДАКТИРОВАТЬ: Как предлагается в ответе, единственное требуемое изменение было:
.AddMsal(Configuration, new string[] { Configuration["SimulationAPIv411:Scope"] })
до
.AddProtectedApiCallsWebApis(Configuration)