1
  • 我正在使用带有 AspNetIdentity 的 Identity Server 4。
  • 我使用 Sustainsys 添加了 SAML 身份验证提供程序。
  • 我可以使用本地帐户成功登录。
  • 我想将 SAML 身份验证提供程序链接到我的本地帐户。我按照流程链接外部和社交登录(正如我已成功使用 Google、Microsoft 和 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/上的文档在 startup.cs 中添加了以下行,我也没有成功解决此错误发布/主题/cors.html

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

这是调试信息的日志:

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

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

4

1 回答 1

1

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

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

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 请求:“/Saml2/Acs”,来自原点:“ https://sso.acme.com ”,但由于路径不是允许的 IdentityServer CORS 端点而被忽略,但是这个似乎对登录过程没有影响。所以是“红鲱鱼”。
于 2018-04-19T23:51:31.743 回答