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

ASP.NET Core 2.0部署Kubernetes后Azure AD认证回调地址缺失HTTPS求助

解决ASP.NET Core 2.0 + Kubernetes + Azure AD回调地址缺失HTTPS的问题

这个问题我之前处理过好几个类似的场景,核心原因是你的ASP.NET Core应用在Kubernetes集群内部收到的是HTTP请求——因为Nginx Ingress已经在入口处做了HTTPS终止,把请求转成HTTP转发给后端服务了。这就导致应用生成Azure AD回调地址时,默认用了HTTP协议,而Azure AD只认可你预先配置的HTTPS回调地址,自然就会报错。

下面是一步步的解决方案:

1. 配置ASP.NET Core信任反向代理并读取转发头

ASP.NET Core需要知道它是运行在反向代理之后的,这样才能从代理传递的头信息里获取真实的请求协议(HTTPS)。

在你的Startup.cs里做两处修改:

  • 在ConfigureServices中配置ForwardedHeadersOptions:
    public void ConfigureServices(IServiceCollection services)
    {
        // 先配置转发头选项
        services.Configure<ForwardedHeadersOptions>(options =>
        {
            // 要读取的转发头:客户端IP和请求协议
            options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            // 添加Nginx Ingress控制器的IP或所在网段到可信代理列表
            // 比如Azure Kubernetes Service的集群内部网段通常是10.0.0.0/8,你可以根据实际情况调整
            options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8));
        });
    
        // 你的Azure AD认证配置(比如AddAzureAD等)
        // ...
    
        // 其他服务配置,比如AddMvc
        services.AddMvc();
    }
    
  • 在Configure方法中,必须在UseAuthentication之前启用转发头中间件:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // 先启用转发头,顺序非常关键!
        app.UseForwardedHeaders();
    
        // 其他中间件:错误页、静态文件等
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
    
        // 启用认证中间件
        app.UseAuthentication();
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    

2. 确保Nginx Ingress正确传递转发头

检查你的Ingress资源配置,添加必要的annotations让Nginx把真实的请求协议传递给后端应用:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-app-ingress
  annotations:
    # 强制HTTP跳转HTTPS
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    # 启用转发头传递
    nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
    # 可选:如果需要,设置客户端真实IP的头
    nginx.ingress.kubernetes.io/forwarded-for-header: "X-Forwarded-For"
spec:
  tls:
  - hosts:
    - x.eastus.cloudapp.azure.com
    secretName: your-letsencrypt-tls-secret # 替换成你的Let's Encrypt证书secret名称
  rules:
  - host: x.eastus.cloudapp.azure.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-app-service # 替换成你的应用服务名称
            port:
              number: 80

3. 验证Azure AD应用注册的回调地址

登录Azure门户,找到你的Azure AD应用注册,确认重定向URI是https://x.eastus.cloudapp.azure.com/signin-oidc(如果你的回调路径不是默认的signin-oidc,替换成你自己的路径)。这个地址必须和应用生成的回调地址完全一致,现在配置完上面的步骤后,应用应该会生成HTTPS的回调地址了。

验证配置是否生效

可以在你的应用里加一个简单的测试接口,用来查看当前请求的协议:

[Route("api/test-scheme")]
public IActionResult TestRequestScheme()
{
    return Ok($"当前请求协议: {HttpContext.Request.Scheme}");
}

部署后访问https://x.eastus.cloudapp.azure.com/api/test-scheme,如果返回当前请求协议: HTTPS,说明配置已经生效,此时再点击需要登录的链接,回调地址应该就会是HTTPS的了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:38:29