You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:04:58