.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
相关产品推荐
相关产品推荐

