我们在使用 Azure Active Directory/ServiceStack 后端授权我们的前端 React/Typescript 应用程序时遇到了一些问题。据我们所知,问题源于前端和后端位于不同的 URL 上。
在后端,我们使用此插件
https://github.com/jfoshee/ServiceStack.Authentication.Aad将 AAD 与 ServiceStack 集成。前端是一个用 Typescript 编写的 React 应用程序,@servicestack/client
客户端用于与 API 交互。
当 API 重定向回应用程序时,在通过 Azure Active Directory 进行身份验证后,它会设置一些 cookie,包括ss-id
和ss-pid
. 问题似乎是这些cookie仅设置在API url上,而不是App。因此,每当从应用程序发送任何 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 的工具为前端生成 TypeScript DTO。
我们尝试发出的请求的一个简单示例,但收到 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 在同一个域中?