身份服务器4&;Sustainsys SAML2拒绝非CORS请求作为CORS请求 我正在使用具有网络身份的Identity Server 4 我使用Sustainsys添加了一个SAML身份验证提供程序 我可以使用本地帐户成功登录 我想将SAML身份验证提供程序链接到我的本地帐户。我按照流程链接外部和社交登录(正如我成功地与谷歌、微软和Facebook进行了链接一样)-链接是 我现在可以选择链接SAML2服务 我可以成功链接到外部SSO并进行身份验证;然后,我被重定向回,但ManageController中的代码在以下点失败:

身份服务器4&;Sustainsys SAML2拒绝非CORS请求作为CORS请求 我正在使用具有网络身份的Identity Server 4 我使用Sustainsys添加了一个SAML身份验证提供程序 我可以使用本地帐户成功登录 我想将SAML身份验证提供程序链接到我的本地帐户。我按照流程链接外部和社交登录(正如我成功地与谷歌、微软和Facebook进行了链接一样)-链接是 我现在可以选择链接SAML2服务 我可以成功链接到外部SSO并进行身份验证;然后,我被重定向回,但ManageController中的代码在以下点失败:,cors,saml-2.0,identityserver4,asp.net-core-identity,sustainsys-saml2,Cors,Saml 2.0,Identityserver4,Asp.net Core Identity,Sustainsys Saml2,GetExternalLoginInfoAsync返回Null。user.Id正确并且存在于数据库中 ExternalLoginInfo info = await signInManager.GetExternalLoginInfoAsync(user.Id); if (info == null) { throw new ApplicationException($"Unexpected error occurred loading ext

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错误有关,但是我没有成功地解决这个错误,尽管我已经根据上的文档在startup.cs中添加了以下行

var cors=new DefaultCorsPolicyService(\u loggerFactory.CreateLogger())
{
AllowedOriginates={”https://sso.acme.com" }
};
服务。添加单例(cors);
以下是调试信息的日志:

  • LinkLogin重定向url:/Manage/LinkLoginCallback
  • AuthenticationScheme:“Identity.Application”已成功通过身份验证
  • 提取的SAML断言_ea533182b0cb1781868a660af48ced3529d568
  • AuthenticationScheme:“Identity.Application”已成功通过身份验证
  • LinkLoginCallback用户Id:a0162430-eb22-4154-bf59-0ba49bfd473d
  • 已成功处理SAML响应_402E6060E55E8E5D3B05F52F5E5D2D7D4D786并通过身份验证test@acme.com
  • System.ApplicationException:加载ID为“a0162430-eb22-4154-bf59-0ba49bfd473d”的用户的外部登录信息时发生意外错误。
  • CORS请求来自源:“/Saml2/Acs”的路径,但被忽略,因为路径不是允许的IdentityServer CORS终结点的路径
  • LinkLoginCallback启动
  • SAML2响应的验证条件_402E6060E55E8E5D3B05F52F5E5D2D7D4D786
  • Http后绑定提取消息
  • Saml响应的签名验证已通过_402E6060E55E8E5D3B05F52F5E5D2D7D4D786
  • AuthenticationScheme:“Identity.Application”已成功通过身份验证
更新:
-发送回Saml请求的客户表示,这不是对/Saml2/ACS的CORS请求,因此不理解为什么我们会收到来自Identity Server/Sustainsy的错误。这个问题的解决方案最终很简单

  • 我试图使用处理来自Facebook的微软Google的响应的方法来处理Saml响应(在
    ExternalLoginCallback
ExternalLoginInfo info=wait _signInManager.getexternallogininfosync(user.Id)

  • 很明显,Saml请求的ExternalLoginCallback过程略有不同-您需要以下代码:
AuthenticateResult samlResult=wait-HttpContext.authenticateSync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme)

  • 然后,您可以使用
    samlResult

  • 以下示例中提供了用于此操作的所有代码:

  • 有趣的是,日志文件仍然打印出对路径“/Saml2/Acs”的CORS请求,该路径来自源:”但被忽略,因为该路径不是用于允许的IdentityServer CORS端点,但是这似乎对登录过程没有影响。所以这是一条“红鲱鱼”

很高兴听到你找到了它。日志中的CORS错误是一个已知的危险因素。但是对
\u signinManager.getexternallogininfosync(user.Id)
的调用应该可以工作-我希望Saml2提供程序的行为与其他提供程序相同。你能在Sustainys.Saml2 GitHub repo中提交一个bug来描述这一点吗?@AndersAbel-我不清楚这是一个bug还是仅仅是我没有正确遵循方法?最后,我在我链接到的示例中使用了这种方法。您是说要更改代码,使其使用
\u signInManager.getExternalLoginFoAsync(user.Id)
并且我应该声明当前的方法是一个bug?是的,您应该能够使用
\u signinManager.GetExternalLoginInfoAsync(user.Id)
,因此如果这不起作用,请在repo中提交一个bug,并说明此情况。
            var cors = new DefaultCorsPolicyService(_loggerFactory.CreateLogger<DefaultCorsPolicyService>())
        {
            AllowedOrigins = { "https://sso.acme.com" }
        };
        services.AddSingleton<ICorsPolicyService>(cors);