ASP.NET Core OIDC反向代理下如何修改回调重定向URL?
解决方案:修复OIDC回调地址无法访问的问题
优先方案:在ASP.NET Core后端配置
核心问题是后端向身份提供商(IdP)发送的授权请求中,redirect_uri使用了后端server1的地址,导致IdP重定向到用户无法访问的https://server1:8081/signin-oidc。通过以下步骤修复:
配置转发头中间件
ASP.NET Core需要识别反向代理传递的真实请求地址(server2的地址),在Program.cs中添加转发头配置:builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; // 生产环境请替换为server2的实际IP或主机名,限制可信代理 options.KnownProxies.Add(IPAddress.Parse("server2的IP地址")); }); // 在UseRouting之前添加转发头中间件 app.UseForwardedHeaders();修正OIDC回调地址配置
在OIDC中间件配置中,显式设置公开的回调地址(反向代理后的地址),同时确保IdP后台的回调地址与之一致:builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.Authority = "你的IdP地址"; options.ClientId = "客户端ID"; options.ResponseType = "code"; options.UsePkce = true; // 回调路径对应后端的路径,代理后变为https://server2/myApp/signin-oidc options.CallbackPath = "/signin-oidc"; // 显式设置IdP重定向的完整地址 options.RedirectUri = "https://server2/myApp/signin-oidc"; options.PostLogoutRedirectUri = "https://server2/myApp/signout-callback-oidc"; options.Scope.Add("openid"); options.Scope.Add("profile"); // 其他必要配置... });配置完成后,后端向IdP发送的授权请求会使用
https://server2/myApp/signin-oidc作为redirect_uri,IdP重定向时会指向用户可访问的server2地址,再通过代理转发到后端处理。
备选方案:通过反向代理(IIS URL重写)修复
如果无法修改后端配置,可通过以下步骤调整代理规则:
更新IdP回调地址
在IdP后台将回调地址修改为https://server2/myApp/signin-oidc,确保IdP重定向到用户可访问的地址。添加IIS入站转发规则
在server2的IIS URL重写模块中,添加新的入站规则:- 匹配URL模式:
^myApp/signin-oidc$ - 重写URL:
https://server1:8081/signin-oidc - 确保启用ARR(Application Request Routing)模块,允许反向代理。
- 匹配URL模式:
传递转发头信息
在URL重写规则的“服务器变量”中,添加以下变量,确保后端能识别真实请求地址:HTTP_X_FORWARDED_PROTO:设置为{HTTPS}(值为on时填https,否则http)HTTP_X_FORWARDED_HOST:设置为{HTTP_HOST}HTTP_X_FORWARDED_FOR:设置为{REMOTE_ADDR}
内容的提问来源于stack exchange,提问作者anders
相关产品推荐
相关产品推荐

