从生产中的身份服务器重定向后,相关在 signin-oidc 失败

Posted

技术标签:

【中文标题】从生产中的身份服务器重定向后,相关在 signin-oidc 失败【英文标题】:Correlation failed at signin-oidc after the redirect from the identityserver in production 【发布时间】:2021-08-31 01:17:29 【问题描述】:

我有一个 OpenID cookie 身份验证的实现,但是当我从 IdentityServer(使用相同的 IP 但使用不同的端口托管)登录并重定向到 Web 应用程序时.

我得到的错误是

System.Exception: Correlation failed.

此外,堆栈跟踪如下所示:

Exception: An error was encountered while handling the remote login.

Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>.HandleRequestAsync()
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

重定向 URL 是 HTTP,而不是 HTTPS。格式为: http://some-ip/signin-oidc

启动配置如下:

 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie(options =>
  
      options.LoginPath = "/login";
      options.ExpireTimeSpan = TimeSpan.FromMinutes(50);
      options.SlidingExpiration = false;

  )
  .AddOpenIdConnect(options =>
  
      options.ClientId = "signal-frontend";
      options.ClientSecret = "signal-frontend-secret";
      options.RequireHttpsMetadata = false;
      options.GetClaimsFromUserInfoEndpoint = true;
      options.SaveTokens = true;
      options.ResponseType = OpenIdConnectResponseType.Code;
      options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
      options.Authority = configuration["IdentityOptions:IdentityUrl"];

      options.Scope.Add("openid");
      options.Scope.Add("email");
      options.Scope.Add("profile");
      options.Scope.Add("roles");
      options.Scope.Add("signal.system.web");

      options.SecurityTokenValidator = new JwtSecurityTokenHandler
      
          // Disable the built-in JWT claims mapping feature.
          InboundClaimTypeMap = new Dictionary<string, string>()
      ;

      options.TokenValidationParameters.NameClaimType = "name";
      options.TokenValidationParameters.RoleClaimType = "role";

  );

services.AddOpenIddict()
.AddValidation(options =>

    options.SetIssuer(configuration["IdentityOptions:IdentityUrl"]);
    options.AddAudiences("signal_resource");
    options.UseIntrospection()
            .SetClientId("signal_resource")
            .SetClientSecret("secrets");
    options.UseSystemNetHttp();
    options.UseAspNetCore();
);

登录控制器实现为:

[HttpGet("~/login")]
public ActionResult LogIn()

    return Challenge(new AuthenticationProperties  RedirectUri = "/" , OpenIdConnectDefaults.AuthenticationScheme);

应用程序在本地服务器上运行没有问题。但是当它托管在生产环境中时,我得到了错误。我试图设置 SameSite.None 和 SameSite.UnSpecified。但是错误是一样的。

我已经在 chrome 和 edge 中检查了它。有同样的错误。我无法在其他浏览器上进行验证。 Chrome 是默认浏览器。

并且该应用程序正在移动 Safari 浏览器、移动 firefox(以及一些桌面版的 firefox)中运行。这个问题看起来很奇怪。我不知道如何使这项工作。解决方法是什么?如何解决问题?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是否使用负载平衡和客户端应用程序的多个副本?

如果是这样,向您的身份提供者创建初始身份验证请求的客户端实例也必须与处理对 /signin-oidc 的回调的客户端实例相同

【讨论】:

不,我没有使用负载平衡。我们已将应用程序托管在 AWS EC2 实例中。 我们使用了托管在 IIS 中的客户端应用程序的单个实例 您是一直遇到问题还是刚刚重新部署后遇到问题? 每次在生产环境中。这是我的第一次部署,我遇到了错误。 如何在生产中部署它?什么环境?

以上是关于从生产中的身份服务器重定向后,相关在 signin-oidc 失败的主要内容,如果未能解决你的问题,请参考以下文章

身份验证过滤器重定向回 Laravel 中的原始 POST 请求

客服端重定向和服务器重定向

如何自动将数据从服务器重定向到客户端

从本地驱动器重定向到服务器

从事件接收器重定向Sharepoint 2010(创建站点后)

如何使用浏览器重定向创建 Facebook 风格的应用内身份验证?