IDS4 - 登录时重定向循环(手动导航工作和本地主机工作)

IDS4 - Redirect Loop When Logging In (Manual Navigation Works and Localhost Works)

先了解一些信息:


  1. 我转到需要用户登录的应用程序端点 (Home/Claim)。
  2. 它正确地重定向到登录屏幕。
  3. 输入用户名和密码,然后使用设置的 cookie headers 正确重定向回应用程序的 OIDC 端点。
  4. 然后重定向到原始的 Home/Claim 端点。它没有请求中的 cookie。
  5. 然后它重定向回登录屏幕,看到用户已登录并returns返回初始应用程序的 OIDC 端点 - 将应用程序置于循环中。

奇怪的是,如果我停止浏览器加载页面然后手动导航回应用程序的 Home/Claim 端点,它会起作用吗!? c1 和 c2 cookie 在 header 中是正确的,并且用户已正确验证。它不会重定向回登录。

这是重定向模式的样子(声明是我尝试访问的端点):

callback?client_id 在登录域中 signin0oidc 在应用程序的域中 声明在应用程序的域中

这是重定向回 Home/Claim 端点时第一次调用时的初始请求 Header(值得注意的是,在 Localhost 上,第二张图片中的 cookie 是在执行它的操作时设置的重定向到 Home/Claim。它是第一次设置它们,而在开发中它不是):

当我手动导航到 Home/Claim 端点时(在上述步骤之后),这就是请求 Header 的样子(注意 cookie 在那里):


一些最后的说明:



修复: 标记的答案解决了这个问题。具体来说,我只是使用了链接文章中的这段代码(将其放在希望使用 Identity Server 的任何客户端的 startup.cs 中)。

app.Use(async (ctx, next) => {
  if (ctx.Request.Path == "/signout-oidc" &&
    !ctx.Request.Query["skip"].Any()) {
    var location = ctx.Request.Path +
      ctx.Request.QueryString + "&skip=1";
    ctx.Response.StatusCode = 200;
    var html = $ @ " <
      html > < head >
      <
      meta http - equiv = 'refresh'
    content = '0;url={location}' / >
      <
      /head></html > ";
    await ctx.Response.WriteAsync(html);
    return;
  }

  await next();

  if (ctx.Request.Path == "/signin-oidc" &&
    ctx.Response.StatusCode == 302) {
    var location = ctx.Response.Headers["location"];
    ctx.Response.StatusCode = 200;
    var html = $ @ " <
      html > < head >
      <
      meta http - equiv = 'refresh'
    content = '0;url={location}' / >
      <
      /head></html > ";
    await ctx.Response.WriteAsync(html);
  }
});

您为 Cookie 使用的 SameSite 值是多少?

请记住,SameSite 的 Strict 值告诉浏览器它不应包含 cookie,以防从其他域重定向。

但是,cookie 在那里,因此如果您在应用程序中访问任何 url(不再是重定向),cookie 将被包含在内。只需转到地址栏并使用相同的 url 点击 Intro。如果发送了 cookie,则表示这肯定是您的问题。

如果这是您的问题,请将您的 Cookie 设置为 SameSite = Lax。 Lax 允许在交叉重定向时发送 cookie。

您可以了解有关此问题的更多信息并尝试从 Brockallen 博客提出的其他解决方案:Same-site cookies, ASP.NET Core, and external authentication providers。此解决方案在您的 Cookie 中维护 Strict 属性。