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

问题描述

我有一个 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)。这个问题看起来很奇怪。我不知道如何进行这项工作。解决方法是什么?如何解决问题?任何帮助将不胜感激。

解决方法

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

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