- 我正在使用带有 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 断言 _ea533182b0cb1781868a660af48ced3529d568
- 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 的错误