我有一个 AspNetCore 后端 api(在 F# 中带有 Giraffe),它使用 AzureAD 身份验证和 Microsoft.AspNetCore.Authentication.AzureAD.UI、有状态会话存储和仅 https cookie。
前端是使用 Fable 编译为 js 的 Elmish SPA。
如果我只是在 url 栏中输入我的后端的受保护端点,一切正常,如果尚未登录,我将被重定向到 login.microsoft 端点,带有 clientID 等等,成功登录后,原始请求完成,我得到受保护端点的响应。
但是,如果我尝试从 SPA 代码访问相同的端点,例如:使用 fetch 或 Fable.Remoting,如果未登录,后端仍会重定向,但重定向到 login.microsoft 的请求不再有效。使用 Fable.Remoting 有一个 CORS 标头,登录端点会拒绝该标头。如果我使用 nocors 发送 fetch,登录端点有 200 OK 响应,但没有响应正文(例如登录页面没有 html 代码),似乎什么也没发生。
我只是不知道在 SPA 方面应该如何处理,也找不到任何关于它的信息。如果从 Fable.Remoting 启动与从浏览器 url 栏启动,为什么后端会在重定向中包含 CORS 标头?没有响应主体的 fetch-ed 响应有什么问题?我可以只将 js 代码写入我的客户端,但甚至无法弄清楚如何在纯 js SPA 中处理它。
还在生产中尝试了整个过程,从等式中删除了 webpack devServer 代理,但一切都保持不变。