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

.NET Core 3.1集成Google登录报错:Bearer方案无法用于SignInAsync

问题描述

为已实现JWT认证的系统添加Google登录功能,已获取ClientId和ClientSecret,调用以下代码触发Google登录:

AuthenticationProperties properties = await _accountApiClient.GoogleLogin1();
return new ChallengeResult("Google", properties);

但触发后出现错误:

InvalidOperationException: The authentication handler registered for scheme 'Bearer' is 'JwtBearerHandler' which cannot be used for SignInAsync. The registered sign-in schemes are: Cookies.

错误来自回调地址 https://localhost:XXXXX/signin-google?state=XXXX,Startup.cs中的认证配置如下:

services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddGoogle(options =>
    {
        options.ClientId = CLIENTID
        options.ClientSecret =SECRET
    })
    .AddJwtBearer("Bearer", options =>
    {
        options.SaveToken = true;
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidAudience = Configuration["JWT:ValidAudience"],
            ValidIssuer = Configuration["JWT:ValidIssuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
        };
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                context.Token = context.Request.Cookies[CommonNames.AuthCookieName];
                return Task.CompletedTask;
            },
        };
    }).AddCookie("Cookies"); 
    services.AddLocalization(options =>
    {
        options.ResourcesPath = "Resources";
    });
错误原因及解决方案

错误原因

  • Google OAuth认证完成后,默认会使用系统默认SignInScheme保存登录状态,但你当前把全局默认的认证/挑战Scheme都设为了JwtBearerDefaults.AuthenticationScheme(Bearer),而JwtBearerHandler是无状态令牌认证方案,不支持SignInAsync会话存储操作——只有Cookie认证方案具备会话式登录的处理能力。
  • 你虽然注册了Cookie认证方案("Cookies"),但既没指定它作为Google登录的专属SignInScheme,也没设置为系统全局默认的SignInScheme。

解决方案

方案1:为Google登录指定专属SignInScheme

修改Google认证配置,明确指定用Cookie方案处理登录会话:

.AddGoogle(options =>
{
    options.ClientId = CLIENTID;
    options.ClientSecret = SECRET;
    // 指定Google登录成功后用Cookie方案完成SignIn
    options.SignInScheme = "Cookies";
})

方案2:设置系统全局默认SignInScheme

在Authentication全局配置中添加DefaultSignInScheme,让所有需要SignIn的操作默认使用Cookie方案:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    // 新增:指定全局默认登录方案为Cookies
    options.DefaultSignInScheme = "Cookies";
})

补充说明

配置完成后,Google登录回调成功时会通过Cookie方案创建临时会话,后续你可以在回调逻辑中生成JWT令牌并返回给前端(比如写入Cookie或响应体),衔接原有JWT认证流程。

内容的提问来源于stack exchange,提问作者barba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45