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

时间:2018-04-11 14:10:31

标签: cors saml-2.0 identityserver4 asp.net-core-identity sustainsys-saml2

  • 我正在使用带有AspNetIdentity的Identity Server 4。
  • 我已使用Sustainsys添加了SAML身份验证提供程序。
  • 我可以使用本地帐户成功登录。
  • 我想将SAML身份验证提供程序链接到我的本地帐户。我按照流程链接外部和社交登录(因为我已经成功完成了谷歌,微软和Facebook) - 链接是https://identity.domain.com/Manage/ExternalLogins
  • 我现在可以选择链接SAML2服务
  • 我可以成功链接到外部SSO并进行身份验证;然后我被重定向回https://identity.domain.com/Manage/LinkLoginCallback,但代码在ManageController中失败,如下所示:

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中添加了以下行。< / p>

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

以下是调试信息的日志:

  • LinkLogin redirectUrl:/ Manage / LinkLoginCallback
  • AuthenticationScheme:&#34; Identity.Application&#34;已成功通过身份验证。
  • 提取的SAML断言_ea533182b0cb1781868a660af48ced3​​529d568
  • AuthenticationScheme:&#34; Identity.Application&#34;已成功通过身份验证。
  • LinkLoginCallback User.Id:a0162430-eb22-4154-bf59-0ba49bfd473d
  • 已成功处理SAML回复_402e6060e55e8e5d3b05f52ff5e5d2d7d4d786并通过身份验证test@acme.com
  • System.ApplicationException:为ID为&#39; a0162430-eb22-4154-bf59-0ba49bfd473d&#39;。
  • 的用户加载外部登录信息时发生意外错误
  • 为路径提出的CORS请求:&#34; / Saml2 / Acs&#34;来自原产地:&#34; https://sso.acme.com&#34;但被忽略,因为路径不适用于允许的IdentityServer CORS端点
  • LinkLoginCallback开始
  • SAML2响应的验证条件_402e6060e55e8e5d3b05f52ff5e5d2d7d4d786
  • Http POST绑定解压缩消息
  • Saml Response传递签名验证_402e6060e55e8e5d3b05f52ff5e5d2d7d4d786
  • AuthenticationScheme:&#34; Identity.Application&#34;已成功通过身份验证。

更新: - 客户发回Saml请求说这不是对/ Saml2 / ACS的CORS请求,因此我们不理解为什么我们会从Identity Server / Sustainsy获得错误

1 个答案:

答案 0 :(得分:1)

这个问题的解决方案最终很简单。

  • 我试图处理一个Saml响应(在ExternalLoginCallback内),使用这种方法来处理来自谷歌的微软Facebook的回复

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

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

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

  • 然后,您可以使用ExternalLoginInfo

  • 中的属性构建samlResult对象
  • 以下示例中提供了所有代码:

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

  • 有趣的是,日志文件仍打印出 为路径生成的CORS请求:&#34; / Saml2 / Acs&#34;来自原产地:&#34; https://sso.acme.com&#34;但被忽略,因为路径不适用于允许的IdentityServer CORS端点 但是这似乎对登录过程没有影响。所以&#34;红鲱鱼&#34;。