У меня есть .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). Как я могу этого добиться?
Я использовал этот ресурс, чтобы добраться туда, где я сейчас. К сожалению, он просто говорит: «Передайте токен доступа к коду на стороне сервера». Вопрос сосредоточен на использовании единого API для аутентификации прямых пользовательских запросов (ссылка: learn.microsoft.com/en-us/azure/active-directory/develop/… ) и запросов, сделанных с помощью токена начальной загрузки из надстройки. в. Обмен токенами должен быть каким-то образом включен.
Маркер доступа, возвращаемый при вызове 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 для аутентификации внешнего пользователя одностраничного приложения.
Теперь я интегрировал надстройку в домен API, поскольку все равно думал об этом. Поэтому я отмечаю это как принятый ответ. Спасибо
Помогает ли эта страница: learn.microsoft.com/en-us/office/dev/add-ins/develop/… ? Это хорошая отправная точка и руководство по правильному использованию потоков единого входа.