ASP.NET Razor页面经FrontDoor部署后AD B2C认证遇redirect_uri_mismatch问题
解决方案
问题根源是ASP.NET Core应用部署在FrontDoor之后,默认会使用App Service的内部URL生成回调地址,而非FrontDoor的自定义域名。以下是可行的解决步骤:
1. 启用Forwarded Headers中间件
在Program.cs中添加转发头配置,让应用识别FrontDoor传递的真实客户端域名和协议:
// 放在AddAuthentication之前 builder.Services.AddForwardedHeaders(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 生产环境建议添加FrontDoor的IP地址到KnownProxies,防止伪造头 // 可从Azure官方文档获取FrontDoor的IP范围,示例添加单个IP: // options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx")); // 若无法指定具体IP,可设置ForwardLimit(FrontDoor作为一级代理,设为2即可) options.ForwardLimit = 2; }); // 在UseRouting之前调用UseForwardedHeaders app.UseForwardedHeaders(); app.UseRouting();
2. 确认FrontDoor转发头配置
Azure FrontDoor默认会自动传递X-Forwarded-Host、X-Forwarded-Proto等头信息,无需额外配置。若曾修改过路由规则,检查"Forward HTTP headers"选项是否处于开启状态。
3. 清理AD B2C回调地址
仅保留FrontDoor自定义域名对应的回调地址:https://abc.testwebsite.com/signin-oidc,移除App Service的URL,避免应用混淆使用错误的回调地址。
备选方案:手动指定回调地址
如果转发头配置生效有问题,可在代码中手动强制指定回调地址的基础URL:
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAdB2C") .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // 配置OpenID Connect选项 builder.Services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options => { var frontDoorBaseUrl = "https://abc.testwebsite.com"; // 替换回调地址 options.Events.OnRedirectToIdentityProvider = context => { context.ProtocolMessage.RedirectUri = $"{frontDoorBaseUrl}{options.CallbackPath}"; return Task.CompletedTask; }; });
优先推荐使用Forwarded Headers中间件方案,它符合反向代理场景的标准配置,无需硬编码域名,灵活性更高。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

