.NET6配置Azure AD OpenIDConnect自定义RedirectURI不生效问题
问题根因
出现带44345端口的默认域名作为OAuth授权请求redirect_uri参数的核心原因,是Azure App Service前端反向代理转发请求到应用运行实例时,携带的原始对外主机名、访问协议信息没有被ASP.NET Core中间件正确识别,OpenID Connect认证中间件自动拼接回调地址时,拿到的是代理侧的内部访问地址,而非用户实际访问的自定义域名。
注意:直接在Azure AD应用注册的重定向URI列表中添加带44345端口的默认域名无法解决问题,该端口是Azure内部转发使用的端口,公网用户无法直接访问,回调时会直接触发连接失败。
解决方案
你可以根据实际场景二选一配置:
方案1:代码强制指定固定回调地址
该方案配置最简单,不受部署环境请求头影响,适合使用固定自定义域名的场景。
直接修改现有OpenID Connect配置,在跳转至AAD授权页的事件中显式指定正确的回调地址,覆盖中间件自动生成的错误值:
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => { options.Authority = options.Authority + "/v2.0"; options.TokenValidationParameters.ValidateIssuer = false; // 配置授权跳转事件,强制指定重定向URI options.Events.OnRedirectToIdentityProvider = context => { // 此处地址必须和Azure AD中配置的自定义域名回调地址完全一致 context.ProtocolMessage.RedirectUri = "https://custom_domain/signin-oidc"; return Task.CompletedTask; }; });
配置后所有发往AAD的授权请求都会使用你指定的自定义域名作为回调地址,不会再自动生成内部域名地址。
方案2:配置转发头中间件,修复域名自动识别逻辑
该方案无需硬编码域名,中间件会自动识别用户实际访问的域名、协议生成正确的回调地址,适合绑定多个自定义域名、后续可能调整域名的场景。
- 首先在
ConfigureServices方法中添加转发头配置,放行Azure App Service的反向代理网段:
public void ConfigureServices(IServiceCollection services) { services.Configure<ForwardedHeadersOptions>(options => { // 配置需要转发的头信息:源IP、协议、主机名 options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedHost; // 放行Azure反向代理的内网网段,避免被安全规则拦截 options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:10.0.0.0"), 104)); }); // 保留你原有的服务配置,包括Azure AD认证、MVC等相关注册代码 // services.AddAuthentication(AzureADDefaults.AuthenticationScheme) // .AddAzureAD(options => Configuration.Bind("AzureAd", options)); // services.AddControllersWithViews(); }
- 在
Configure方法中,将转发头中间件放在所有其他中间件的最前面,确保后续所有中间件都能拿到正确的请求信息:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 必须放在第一行注册 app.UseForwardedHeaders(); // 保留你原有的中间件配置顺序 // app.UseHttpsRedirection(); // app.UseStaticFiles(); // app.UseRouting(); // app.UseAuthentication(); // app.UseAuthorization(); // app.UseEndpoints(endpoints => // { // endpoints.MapControllerRoute( // name: "default", // pattern: "{controller=Home}/{action=Index}/{id?}"); // }); }
配置完成后重启应用,OpenID Connect中间件会自动从转发头中读取用户实际访问的自定义域名,拼接出正确的回调地址。
注意事项
- 使用方案1时,代码中填写的
RedirectUri必须和Azure AD应用注册中配置的重定向URI完全匹配,包括HTTP/HTTPS协议、域名、路径、端口,任意字符不一致都会触发AAD的重定向URI不匹配错误。- 如果配置后出现回调地址为HTTP协议的情况,先检查Azure App Service「配置-常规设置」中是否开启了「HTTPS Only」选项,开启后会强制所有访问使用HTTPS协议。
内容的提问来源于stack exchange,提问作者CodeDon
相关产品推荐
相关产品推荐

