Как авторизовать приложение React / TypeScript с помощью ServiceStack и AAD - PullRequest
2 голосов
/ 10 мая 2019

У нас возникли проблемы с авторизацией нашего внешнего приложения React / Typescript с нашим внутренним интерфейсом Azure Active Directory / ServiceStack.Из того, что мы можем сказать, проблема возникает из-за того, что внешний интерфейс и бэкэнд находятся по разным URL-адресам.

На внутреннем сервере мы интегрируем AAD с ServiceStack с помощью этого плагина https://github.com/jfoshee/ServiceStack.Authentication.Aad. Внешний интерфейс - это Reactприложение, написанное на Typescript, с клиентом @servicestack/client для взаимодействия с API.

Когда API перенаправляет обратно в приложение, после авторизации через Azure Active Directory он устанавливает некоторые файлы cookie, включая ss-id и ss-pid.Кажется, проблема в том, что эти файлы cookie устанавливаются только в URL API, а не в приложении.Поэтому всякий раз, когда какой-либо API-запрос отправляется из приложения, в запрос не включаются файлы cookie, и запрос встречается с 401.

Наше понимание потока следующее:

Redirect user to exampleapi.com/auth/aad
from exampleapp.com

exampleapi.com/auth/aad sets some cookies,
then redirects to Azure Active Directory (login.microsoftonline.com)

User completes login with AAD, is redirected back to
exampleapi.com/auth/aad with some data in the URL.

exampleapi.com/auth/aad sets cookies ss-id, ss-pid etc.
then redirects user back to exampleapp.com

Мы попытались вручную приостановить приложение и вставить файлы cookie, извлеченные из заголовков в процессе авторизации, в exampleapp.com.Даже в этом случае запросы API, сделанные exampleapp.com, по-видимому, не включают эти файлы cookie, поэтому получает 401. Мы используем инструменты ServiceStack для генерации DTO TypeScript для внешнего интерфейса.

Простой пример запросовмы пытаемся заработать, но получаем 401 за:

const client: JsonServiceClient = new JsonServiceClient("exampleapi.com");

const userDetailsRequest: UserDetailsRequest = new UserDetailsRequest();

userDetailsRequest.userId = 123;

client.get(userDetailsRequest).then((userDetails) => {
    console.log(userDetails);
});

Чего нам не хватает?Почему запросы от exampleapp.com не отправляются с файлами cookie?Как правильно установить файлы cookie на exampleapp.com, чтобы они могли отправляться в первую очередь?

Возможно ли это вообще, или комбинация ServiceStack и Active Directory требует, чтобы приложение и API были натот же домен?

...