Azure AD: вызов. net Core Web API от других. net Core Web API - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть ситуация, когда есть. 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 с учетом этого потока:

  1. Я получаю токен на предъявителя с Postman для доступа к универсальному c API
  2. Почтальон вызывает SimulationDispatcherController в обобщенном c API
  3. SimulationDispatcherController вызывает указанный c API моделирования
  4. Поток результатов возвращается обратно к Почтальону

Что я испытываю:

  1. Если я оставлю это так, в почтальоне я получу в результате страницу входа в систему

    <!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
    <!DOCTYPE html>
    <html dir="ltr" class="" lang="en">
    
    <head>
        <title>Sign in to your account</title>
    [...]
    
  2. Если я уберу строку .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)

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Если вы хотите позвонить. net Core Web API из других. net Core Web API, спроецированный Azure AD, вы используете OAuth 2.0 On-Behalf-Of * . Подробные действия приведены ниже:

  1. Вход пользователя в клиентское приложение
  2. Получение токена для Web API A и вызов его.
  3. Интернет Затем API вызывает другой нисходящий Web API B (я использую Microsoft Graph для тестирования).

Что касается его настройки, обратитесь к следующим шагам:

Зарегистрируйте приложение веб-API

  1. Регистрация приложения
  2. Создание секретов клиента
  3. Настройка разрешений для доступа к другому веб-API . (Я использую график Microsoft для тестирования)
  4. Настройка приложения для предоставления веб-API (Добавить область действия для API)

Регистрация клиентского приложения

Зарегистрировать приложение Создать секреты клиента Настроить разрешения для доступа к веб-API

Настройте известные клиентские приложения для приложения веб-API

  1. На портале Azure перейдите к регистрации своего веб-приложения API и щелкните раздел Манифест.

  2. Найдите свойство knownClientApplications и добавьте идентификаторы клиентов клиентских приложений

Настройка проекта

  1. Добавьте ссылку Microsoft.Identity.Web в ваш проект

  2. и добавьте следующий код в appsettings. json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "<your tenant id>",
    "ClientId": "<app id of Web API A>",
    "ClientSecret": "<app secret of Web API A>"
  },
добавить следующий код в stratup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddProtectedWebApi(Configuration)
                   .AddProtectedApiCallsWebApis(Configuration)
                   .AddInMemoryTokenCaches();
Контроллер
[Authorize]
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
              private readonly ITokenAcquisition _tokenAcquisition;
        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, ITokenAcquisition tokenAcquisition)
        {
            _logger = logger;
            _tokenAcquisition = tokenAcquisition;
        }



        [HttpGet]
        public async Task<string> Get()
        {

            string[] scopes = { "user.read" }; // the scope of Web API B
            string accessToken = await _tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(scopes);
            // you use the accessToken to call the Web API B
            GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        requestMessage.Headers.Authorization =
                            new AuthenticationHeaderValue("Bearer", accessToken);
                    }));

            User user =await client.Me.Request().GetAsync();
            return user.UserPrincipalName;
        }

     }

Тест в Почтальоне

  1. Получить токен доступа для веб-API A enter image description here enter image description here

  2. Вызовите веб-API A, а затем разрешите Web API A вызвать граф Microsoft enter image description here

Подробнее см. В документе и образец

1 голос
/ 10 февраля 2020

Кажется, что другие специфичные c API-интерфейсы моделирования также защищены Azure AD, вы можете использовать OAuth 2.0 On-Behalf-Of , который работает в сценарии, когда приложение вызывает сервис / веб API, который, в свою очередь, должен вызывать другой сервис / веб-API.

Здесь - это пример кода для использования потока OBO в asp. net core web api с MSAL 2.3 и более поздними версиями. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...