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

.NET中反向代理HTTPS转HTTP导致微软登录失败问题

解决.NET应用通过Traefik反向代理时OAuth redirect_uri不匹配问题

1. 修复ForwardedHeaders中间件配置

默认情况下ForwardedHeaders仅信任本地回环地址的代理请求,Traefik作为K8s集群内代理,需将其IP/网段加入信任列表,否则会忽略传入的X-Forwarded-*头。修改代码如下:

var forwardedHeadersOptions = new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost,
    // 替换为Traefik的实际IP或集群网段
    KnownProxies = { IPAddress.Parse("10.0.0.10") },
    // 若为集群网段,可替换为:KnownNetworks = { new IPNetwork(IPAddress.Parse("10.0.0.0"), 24) }
};
// 关闭头对称性校验,允许代理覆盖原始请求头
forwardedHeadersOptions.RequireHeaderSymmetry = false;
forwardedHeadersOptions.ForwardLimit = null;

// 此中间件必须放在UseAuthentication、UseAuthorization等中间件之前
app.UseForwardedHeaders(forwardedHeadersOptions);

2. 简化Traefik配置

Traefik默认会自动向后端发送X-Forwarded-Proto、X-Forwarded-Host等头,无需手动配置customRequestHeaders,删除以下自定义配置避免冲突:

# 移除该段配置
# customRequestHeaders:
#   X-Forwarded-Host: instance.mydomain.com
#   X-Forwarded-Proto: https

确保Ingress注解启用SSL重定向:

annotations:
  traefik.ingress.kubernetes.io/ssl-redirect: "true"

3. 移除手动修改redirect_uri的代码

当ForwardedHeaders配置生效后,.NET会自动生成https协议的redirect_uri,删除你添加的OnRedirectToAuthorizationEndpoint事件处理代码,避免OAuth中间件校验时出现地址不匹配。

4. 验证AAD应用注册的回复地址

确认Azure AD应用注册中已添加https://instance.mydomain.com/authpath作为有效回复地址,同时移除旧的http协议地址。

5. 最后手段:强制OAuth使用HTTPS回调

若上述配置仍无效,可直接在OAuth选项中强制回调地址使用HTTPS:

.AddMicrosoftAccount(AuthenticationSchemas.Microsoft, m =>
{
    m.ClientId = "你的ClientId";
    m.ClientSecret = "你的ClientSecret";
    m.CallbackPath = new PathString("/authpath");
    m.Events = new OAuthEvents
    {
        OnRedirectToAuthorizationEndpoint = ctx =>
        {
            var redirectUri = new Uri(ctx.RedirectUri);
            if (redirectUri.Scheme == "http")
            {
                ctx.RedirectUri = new UriBuilder(redirectUri)
                {
                    Scheme = "https",
                    Port = -1 // 使用HTTPS默认端口443
                }.ToString();
            }
            ctx.Response.Redirect(ctx.RedirectUri);
            return Task.CompletedTask;
        }
    };
})

同时可在请求管道中强制设置Scheme:

app.Use((context, next) =>
{
    context.Request.Scheme = "https";
    return next();
});

内容的提问来源于stack exchange,提问作者greg-e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:55:09