.NET:Web Authenticator在子域名下无法正常工作
MAUI谷歌登录迁移至子域名后重定向报错问题
问题说明
MAUI应用通过Web Authenticator实现谷歌登录,后端基于.NET 8 ASP.NET Core WebAPI开发。在顶级域名https://example.com下运行正常,迁移到子域名https://api.example.com后,谷歌完成账号登录并重定向到https://api.example.com/signin-google?.....时,出现“api.example.com当前无法处理此请求”的错误。
现有代码
Program.cs 认证配置
builder.Services.AddAuthentication(o => { o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie() .AddGoogle(g => { g.ClientId = GoogleClientId; g.ClientSecret = GoogleClientSecret; g.SaveTokens = true; // 原代码存在笔误:多余的a.SaveTokens = true需删除 });
Controller 登录处理逻辑
[HttpGet(ApiRoutes.MobileAuth.Google)] public async Task Google() { string scheme = "Google"; var auth = await Request.HttpContext.AuthenticateAsync(scheme); if (!auth.Succeeded || auth?.Principal == null || !auth.Principal.Identities.Any(id => id.IsAuthenticated) || string.IsNullOrEmpty(auth.Properties.GetTokenValue("access_token"))) { await Request.HttpContext.ChallengeAsync(scheme); } else { var claims = auth.Principal.Identities.FirstOrDefault()?.Claims; string access_token = auth?.Properties?.GetTokenValue("access_token") ?? string.Empty; // 其他业务操作 var url = callbackScheme + "://#access_token=" + (access_token.Trim()); Request.HttpContext.Response.Redirect(url); } }
问题排查与解决
1. 更新谷歌开发者控制台的重定向URI
迁移到子域名后,必须在谷歌开发者控制台的OAuth 2.0客户端设置中,添加https://api.example.com/signin-google到授权重定向URI列表。谷歌会严格校验重定向地址,未配置的地址会被拒绝,导致后端无法处理请求。
2. 调整Cookie认证的域名配置
Cookie默认仅在当前域名生效,迁移到子域名后,需显式配置Cookie的作用域,让子域名能正常读取认证Cookie:
.AddCookie(options => { options.Cookie.Domain = ".example.com"; // 顶级域名前加.,允许所有子域名共享Cookie options.Cookie.SameSite = SameSiteMode.Lax; // 根据业务场景调整SameSite策略 })
3. 确认认证中间件顺序与路由映射
ASP.NET Core的OAuth中间件会自动注册/signin-google回调端点,但如果中间件顺序错误或自定义路由覆盖了该端点,会导致请求无法匹配。确保Program.cs中中间件顺序正确:
var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthentication(); // 认证中间件必须放在授权中间件之前 app.UseAuthorization(); app.MapControllers(); // 避免自定义路由规则拦截/signin-google端点
4. 修正代码笔误
删除Program.cs中多余的a.SaveTokens = true;代码,避免配置异常导致认证流程出错。
5. 优化回调URL的生成方式
生成重定向URL时,对access_token进行URL编码,避免特殊字符导致的解析问题:
var url = $"{callbackScheme}://#access_token={Uri.EscapeDataString(access_token.Trim())}"; Request.HttpContext.Response.Redirect(url);
内容的提问来源于stack exchange,提问作者Anuj Karki
相关产品推荐
相关产品推荐

