You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IdentityServer4部署Azure后登录重定向循环,本地及手动访问均正常

基础信息
  • Localhost本地环境运行完全正常
  • 项目部署到Azure开发环境后出现故障
  • 使用IdentityServer4
  • 使用EntityFramework

故障复现步骤
  1. 访问应用内需要登录权限的端点(Home/Claim)
  2. 系统正确跳转至登录页面
  3. 输入用户名密码后,正确携带set cookie响应头跳转回应用的OIDC端点
  4. 随后跳转回最初的Home/Claim端点时,请求中未携带对应cookie
  5. 系统再次跳转回登录页,检测到用户已登录后又返回应用OIDC端点,进入重定向循环

奇怪的是,如果停止浏览器加载,手动导航回应用的Home/Claim端点,功能完全正常!请求头中正确携带c1和c2 cookie,用户身份验证成功,不会跳转回登录页。


相关链路与请求头说明

重定向链路如下(Claim为目标访问端点):
重定向链路图
带client_id的callback接口属于登录服务域名,signin-oidc和Claim接口属于应用域名

首次跳转回Home/Claim端点时的请求头如下:值得注意的是,本地环境下跳转至Home/Claim时会正常设置第二张图中的cookie,首次跳转即可生效,而开发环境下不会设置。
首次跳转请求头

完成上述步骤后手动访问Home/Claim端点的请求头如下,可见请求中已携带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);
  }
});

内容的提问来源于stack exchange,提问作者Jeff B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:24:02