.NET 6+下ASP.NET Identity强制HTTPS登录重定向问题求助
.NET 6+ 强制OAuth外部登录重定向使用HTTPS
问题场景
在.NET 6+中使用ASP.NET Identity实现OAuth外部登录(如Google)时,若服务器存在SSL卸载配置,应用无法识别真实的HTTPS请求,导致生成的第三方认证重定向URI协议为HTTP,触发认证服务(如Google)的验证失败。本地HTTPS开发环境测试正常,部署到生产环境后出现问题,且无法控制主机配置,需要硬编码强制使用HTTPS。
当前相关代码:
builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<my_db_context>(); builder.Services.AddAuthentication().AddGoogle(goog => { goog.ClientId = builder.Configuration["GoogleAuthClientId"]; goog.ClientSecret = builder.Configuration["GoogleAuthClientSecret"]; });
解决方案
方法1:配置转发头识别(优先推荐)
当存在SSL卸载时,代理服务器会通过X-Forwarded-Proto等转发头告知应用真实的请求协议。在应用内配置转发头中间件,让ASP.NET Core识别真实的请求协议:
// 在builder.Build()之前添加转发头配置 builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 若代理服务器IP固定,可添加到可信列表(可选) // options.KnownProxies.Add(IPAddress.Parse("代理服务器IP")); }); // 在app.UseRouting()之前启用转发头中间件 var app = builder.Build(); app.UseForwardedHeaders();
方法2:直接修改OAuth重定向地址为HTTPS
针对Google OAuth单独配置,在跳转认证服务前强制修改重定向URI的协议为HTTPS:
builder.Services.AddAuthentication().AddGoogle(goog => { goog.ClientId = builder.Configuration["GoogleAuthClientId"]; goog.ClientSecret = builder.Configuration["GoogleAuthClientSecret"]; goog.Events = new OAuthEvents { OnRedirectToAuthorizationEndpoint = context => { // 将原重定向地址的协议替换为HTTPS var uriBuilder = new UriBuilder(context.RedirectUri); uriBuilder.Scheme = Uri.UriSchemeHttps; uriBuilder.Port = -1; // 使用HTTPS默认端口443 context.Response.Redirect(uriBuilder.Uri.ToString()); return Task.CompletedTask; } }; });
方法3:全局强制所有URL生成使用HTTPS
通过路由配置,强制ASP.NET Core生成的所有URL都使用HTTPS协议:
builder.Services.Configure<RouteOptions>(options => { options.EnforceHTTPS = true; });
内容的提问来源于stack exchange,提问作者EdSF
相关产品推荐
相关产品推荐

