我有一个使用 ASP.NET Core 3 构建的应用程序,带有一个 React SPA(该应用程序有一个用于 React 应用程序的 useSpa,后端是应用程序的 BL)。
当前应用程序身份验证是Windows身份验证,但我想将其替换为ADFS(本地)身份验证。 我正在使用 Sustainsys.Saml2 包。 我已经成功地使用它进行配置 addAuthentication 和 addSaml2 用于 ADFS saml 请求。但是当浏览器向 adfs 服务器发出请求时,它会抛出 CORS 错误:
Access to XMLHttpRequest at '<adfs_server>/?SAMLRequest=…' (redirected from '<my-server/api/endpoint>') from origin '<adfs_server>' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
为了调查错误,我使用 fiddler 拦截通信并手动添加
'Access-Control-Allow-Origin': "*"
标头,它确实修复了错误(问题是我无法更改 adfs 服务器,它不是我的服务器)。
(所有这些代码都在 c# 应用程序的 Startup.cs 中,而不是在 React 应用程序中,因为我将 useSpa 与 asp.net core 应用程序一起使用)
我尝试过允许 CORS 使用
.SetIsOriginAllowed(origin => true)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
我尝试仅指定 adfs 服务器(使用
WithOrigins("https://<adfs_server>")
)
而不是任何起源,但在它没有帮助之后,我尝试允许一切,但它没有帮助。
CORS 错误仍然存在。当我搜索此错误时,我发现问题出在后端(即 ADFS 服务器),但我无法仅更改我的依赖信任方设置的 adfs 设置,并且我确信解决方案是“请勿更改 adfs 全局设置以允许 CORS,因为使用此 adfs 服务器的其他应用程序不需要此设置。
我尝试使用 AddOpenIdConnect 或 AddWsFederation,以检查 adfs 服务器在其他协议(OAuth2、WS-Federation)中是否会做出不同的响应,但没有帮助。我也遇到同样的错误。
您似乎正在尝试使用 XmlHttpRequest 从 SPA 进行 SAML2 握手。那不是支持。您需要将整个浏览器窗口重定向到 ADFS,并让它重定向回 Asp.Net 服务器端,这将在您的后端生成会话 cookie。会话建立后,您可以重定向回您的 SPA。