Доступ к REST API .net core из веб-надстройки Outlook с использованием платформы Microsoft Identity

У меня есть .net core web REST API (.net 6.0), который использует платформу идентификации Microsoft для аутентификации и авторизации доступа пользователей из внешнего интерфейса. Это работает нормально.

Аутентификация настраивается так:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"), subscribeToJwtBearerMiddlewareDiagnosticsEvents: true)
        .EnableTokenAcquisitionToCallDownstreamApi()
            .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftDownstreamGraph"))
            .AddInMemoryTokenCaches();

Тот же API теперь должен использоваться надстройкой Outlook. Я получаю токен доступа с помощью функции office.js getAccessToken(). Если я вызываю API с помощью этого токена, я получаю:

Bearer error="invalid_token", error_description="Аудитория «e1c50fba-abcd-4e63-9f54-xxxxxxxxxx» недействителен».

Регистрация API AzureAD для надстройки имеет разрешение «access_as_user» для REST API. Мое текущее предположение состоит в том, что я должен использовать поток от имени, а API должен обменять токен надстройки на токен, которому разрешено использовать REST API. Это правильно? Есть ли простой способ использовать Microsoft.Identity.Web для достижения этого?

Насколько мне известно, я не должен возвращать обменный токен доступа к надстройке. Поэтому мне пришлось бы кэшировать его внутри REST API и прозрачно изменить запрос API, чтобы он включал правильный токен (полученный через поток obo). Как я могу этого добиться?

Помогает ли эта страница: learn.microsoft.com/en-us/office/dev/add-ins/develop/… ? Это хорошая отправная точка и руководство по правильному использованию потоков единого входа.

Outlook Add-ins Team - MSFT 09.11.2022 21:31

Я использовал этот ресурс, чтобы добраться туда, где я сейчас. К сожалению, он просто говорит: «Передайте токен доступа к коду на стороне сервера». Вопрос сосредоточен на использовании единого API для аутентификации прямых пользовательских запросов (ссылка: learn.microsoft.com/en-us/azure/active-directory/develop/… ) и запросов, сделанных с помощью токена начальной загрузки из надстройки. в. Обмен токенами должен быть каким-то образом включен.

pgross 11.11.2022 15:32
Стоит ли изучать 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
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Маркер доступа, возвращаемый при вызове getAccessToken, предоставляет ведущему приложению Office (Excel, Word и т. д.) доступ к надстройке; то есть к веб-приложению надстройки. Итак, аудитория токена — это идентификатор надстройки в AAD. Если бы API REST были частью веб-приложения надстройки, то этот токен работал бы, но если API REST является другим веб-приложением (с собственным доменом и идентификатором AAD), вы получите сообщение об ошибке недопустимой аудитории. Вы можете использовать поток OBO (от имени) или поток кода аутентификации, чтобы получить токен с идентификатором REST API в качестве аудитории, или изменить дизайн, чтобы веб-приложение надстройки и служба REST являются одним и тем же доменом и идентификатором AAD. Веб-приложение будет обслуживать как страницы/скрипты для надстройки, так и предоставлять доступ к REST API.

И как я могу сделать это в веб-API asp net core? API использует Microsoft.Identity.Web с Azure AD для аутентификации внешнего пользователя одностраничного приложения.

pgross 22.11.2022 13:57

Теперь я интегрировал надстройку в домен API, поскольку все равно думал об этом. Поэтому я отмечаю это как принятый ответ. Спасибо

pgross 23.11.2022 11:36

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

Невозможно загрузить файл с помощью Webapi - порт .NET6-localhost не отображается
Как использовать OpenIddict AuthServer и веб-API в одном проекте
Github Actions не может развернуть AspDotNetCore MVC 6.0 в службе приложений Azure Linux, но говорит, что развертывание выполнено успешно
Как внедрить репозиторий в службу, чтобы избежать ошибки. Некоторые службы не могут быть созданы или внедрить службу в внедренную службу asp.net core 6
Как определить маршрут .NET 6 Minimal Web API, включающий двоеточие?
Сбой сборки конвейера Docker после обновления с .NET Core 3.1 до .NET 6.0
Как добавить сервис в качестве ссылки на библиотеку классов?
При подключении к удаленному SQL Server (SQLExpress) возникает ошибка, связанная с сетью, но работает с помощью обозревателя серверов в Visual Studio
Как отобразить уникальные значения базы данных из столбца, чтобы избежать дублирования с помощью LINQ с Razor? Отображение данных в форме текстового поля
Создание классических Properties.Settings в проектах .Net 6.0 (Core) "Библиотека классов"