AKS中Nginx Ingress返回HTTP跳转地址导致OIDC redirect_uri报错如何解决
问题根因
你的Ingress层已经配置了TLS终结,用户到Ingress的流量走HTTPS,但Ingress转发到后端Pod的流量是HTTP协议,应用无法感知外层的HTTPS协议,所以生成OIDC重定向地址时默认使用了HTTP协议,导致和身份提供商配置的HTTPS回调地址不匹配。
排查步骤
- 先验证Ingress TLS配置是否生效:直接访问
https://test-api.dev.net,确认证书有效,不会自动跳转到HTTP地址 - 执行
kubectl get ingress <你的ingress资源名> -o yaml,确认spec.tls字段已正确渲染,host和secretName配置符合预期 - 执行
kubectl describe secret <你的tls secret名>,确认secret类型为kubernetes.io/tls,且包含有效tls.crt和tls.key字段
解决方案
第一步:修改Ingress注解配置
在你的ingress.yml的annotations段新增3个配置,强制HTTPS跳转并传递原始请求协议头给后端应用:
annotations: kubernetes.io/ingress.class: nginx # 新增配置1:强制所有HTTP请求自动跳转HTTPS nginx.ingress.kubernetes.io/ssl-redirect: "true" # 新增配置2:开启转发头传递,将原始请求信息传递给后端 nginx.ingress.kubernetes.io/use-forwarded-headers: "true" # 新增配置3:明确传递原始请求协议头 nginx.ingress.kubernetes.io/proxy-set-header: X-Forwarded-Proto $scheme nginx.ingress.kubernetes.io/configuration-snippet: | more_clear_headers Server;
更新Ingress配置后重新发布即可。
第二步(可选,针对ASP.NET Core应用):配置应用信任转发头
如果你的应用是ASP.NET Core(signin-oidc是该栈的默认OIDC回调路径),需要额外配置应用读取转发头,否则应用不会识别X-Forwarded-Proto的内容:
在应用启动配置的最开头添加转发头中间件:
// 注册转发头配置 builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 生产环境建议配置为Ingress的具体IP段,测试环境可直接清空放行 options.KnownProxies.Clear(); options.KnownNetworks.Clear(); }); // 务必放在所有中间件的最前面,优先读取转发头 app.UseForwardedHeaders(); // 后续再添加认证、授权等其他中间件 app.UseAuthentication(); app.UseAuthorization();
其他语言的应用同理,配置框架读取X-Forwarded-Proto请求头判断原始请求协议即可。
临时应急方案
如果不方便修改应用代码,可以在Ingress的configuration-snippet中强行重写重定向响应头:
nginx.ingress.kubernetes.io/configuration-snippet: | more_clear_headers Server; # 强制将所有HTTP开头的重定向地址改为HTTPS if ($http_location ~* ^http://(.*)$) { set $location_https https://$1; add_header Location $location_https always; }
内容的提问来源于stack exchange,提问作者Vitalii Fedorenko
相关产品推荐
相关产品推荐

