Identity Server 4 和 Sustainsys SAML2 拒绝将非 CORS 请求作为 CORS 请求

Identity Server 4 & Sustainsys SAML2 rejecting non-CORS request as a CORS request

正在为 GetExternalLoginInfoAsync 返回 Null。 user.Id 正确并存在于数据库中。

ExternalLoginInfo info = await signInManager.GetExternalLoginInfoAsync(user.Id);
        if (info == null)
        {
            throw new ApplicationException($"Unexpected error occurred loading external login info for user with ID '{user.Id}'.");
        }

据我所知,应该有一组属性已由外部 SAML 提供商返回给:

public async Task<IActionResult> LinkLogin(string provider)

我怀疑这个问题可能与 CORS 错误有关,但是我没有成功解决这个错误,尽管我已经根据 http://docs.identityserver.io/en/release/topics/cors.html 上的文档在 startup.cs 中添加了以下几行.

            var cors = new DefaultCorsPolicyService(_loggerFactory.CreateLogger<DefaultCorsPolicyService>())
        {
            AllowedOrigins = { "https://sso.acme.com" }
        };
        services.AddSingleton<ICorsPolicyService>(cors);

调试信息日志如下:

更新: - 客户发回 Saml 请求说它不是 /Saml2/ACS 的 CORS 请求,因此不明白为什么我们会收到从 Identity Server / Sustainsy

收到的错误

最后这个问题的解决方法很简单。

  • 我正在尝试使用处理来自 Google、Microsoft of Facebook
  • 的响应的方法来处理 Saml 响应(在 ExternalLoginCallback 内)

ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync(user.Id);

  • 显然,Saml 请求的 ExternalLoginCallback 过程略有不同 - 您需要以下代码:

AuthenticateResult samlResult = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);

  • 然后您可以使用 samlResult

  • 中的属性构建一个 ExternalLoginInfo 对象
  • 以下示例中提供了所有相关代码:

https://github.com/Sustainsys/Saml2/blob/netstandard/Samples/SampleIdentityServer4/Quickstart/Account/AccountController.cs

  • 有趣的是,日志文件仍然打印出 针对路径的 CORS 请求:“/Saml2/Acs” 来自来源:“https://sso.acme.com” 但被忽略了因为路径不适用于允许的 IdentityServer CORS 端点 但这似乎对登录过程没有影响。所以 "red-herring".