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

如何配置Microsoft Identity认证重定向到应用代理URL而非内部URL

问题根因

你的Blazor应用运行在内网服务器上,默认接收的请求Host为内网域名myapp.domain.local,生成OIDC认证重定向地址时会直接使用当前请求的Host拼接回调路径,因此返回的重定向地址为内网地址。Azure AD应用代理会将原始外部请求的域名、协议等信息通过X-Forwarded-*系列标准请求头传递给后端应用,只要让应用识别并使用这些头信息生成重定向地址即可解决问题。

解决步骤

方案1:配置转发头中间件(推荐,无需硬编码域名)

ASP.NET Core内置了转发头中间件,可自动识别代理传递的原始请求信息,修改当前请求上下文的Scheme、Host为外部访问的实际值,后续生成的重定向地址会自动适配内部/外部访问场景。

  1. 修改项目的Program.cs文件,在所有中间件注册的最开头添加转发头配置,示例代码如下:
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// 注册转发头配置
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    // 启用识别X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host三个头
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | 
                               ForwardedHeaders.XForwardedProto | 
                               ForwardedHeaders.XForwardedHost;
    // 开发环境可直接清空已知代理/网络列表,生产环境建议填写应用代理连接器的实际IP,提升安全性
    options.KnownNetworks.Clear();
    options.KnownProxies.Clear();
});

// 你原有身份认证配置保持不变
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));

// 其他服务注册逻辑保持不变...

var app = builder.Build();

// 注意:这行必须放在所有中间件的最前面,优先级高于UseHttpsRedirection、UseAuthentication等
app.UseForwardedHeaders();

// 原有中间件逻辑保持不变...
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.Run();

方案2:手动修改OIDC重定向地址(兜底方案)

如果配置转发头后仍未生效,可以通过配置OIDC的认证事件,强制重定向地址使用外部域名:

// 在原有AddMicrosoftIdentityWebApp配置后添加如下代码
builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.Events.OnRedirectToIdentityProvider = context =>
    {
        // 优先从X-Forwarded-Host头获取实际访问的域名
        if (context.Request.Headers.TryGetValue("X-Forwarded-Host", out var forwardedHost))
        {
            context.ProtocolMessage.RedirectUri = $"https://{forwardedHost.FirstOrDefault()}/signin-oidc";
        }
        // 也可以硬编码为固定的外部域名:context.ProtocolMessage.RedirectUri = "https://myapp-company.msappproxy.net/signin-oidc";
        return Task.CompletedTask;
    };
});

验证注意事项

  • 确认Azure AD应用注册中两个重定向URI都已正确配置,类型为Web,无拼写错误
  • 生产环境建议补全ForwardedHeadersOptions中的KnownProxies配置,避免伪造转发头带来的安全风险

内容的提问来源于stack exchange,提问作者Jordan James Sell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:04