.NET 8 Minimal API Google外部认证报错:未注册Identity.External方案
解决方案:.NET 8 Minimal API Google外部认证中Identity.External Scheme未注册问题
问题核心在于AddIdentityCore是轻量版Identity组件,不会自动注册Identity.External所需的Cookie认证方案,而SignInManager.GetExternalLoginInfoAsync()依赖这个临时Cookie存储外部登录的中间信息。MVC项目中使用的AddIdentity会自动配置这些方案,但Minimal API的AddIdentityCore需要手动补充。
步骤1:添加Identity.External Cookie认证方案
修改认证授权配置,在原有AddCookie基础上,新增针对IdentityConstants.ExternalScheme的Cookie配置:
services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme; }) // 默认用户登录Cookie方案 .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme) // 新增Identity外部认证临时Cookie方案 .AddCookie(IdentityConstants.ExternalScheme, options => { options.Cookie.Name = IdentityConstants.ExternalCookieName; options.ExpireTimeSpan = TimeSpan.FromMinutes(5); // 临时存储,设置短过期时间 options.SlidingExpiration = true; }) .AddGoogle(googleOptions => { googleOptions.ClientId = configuration["Auth:Google:ClientId"] ?? string.Empty; googleOptions.ClientSecret = configuration["Auth:Google:ClientSecret"] ?? string.Empty; googleOptions.Scope.Add("email"); googleOptions.Scope.Add("profile"); // 确保回调路径与路由映射一致,且已在Google开发者控制台配置 googleOptions.CallbackPath = "/api/auth/google/handler"; }); services.AddAuthorization();
步骤2:配置Identity使用External Scheme
在IdentityCore配置中,指定外部认证使用的Scheme:
services.AddIdentityCore<ApplicationUser>(options => { // 根据业务需求调整其他配置 options.SignIn.RequireConfirmedAccount = false; // 绑定外部认证Scheme options.SignIn.ExternalAuthenticationScheme = IdentityConstants.ExternalScheme; }) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<OctuFitContext>() .AddSignInManager<SignInManager<ApplicationUser>>();
步骤3:确保中间件顺序正确
在Minimal API的管道配置中,认证中间件必须在授权中间件之前:
var app = builder.Build(); app.UseHttpsRedirection(); // 先执行认证 app.UseAuthentication(); // 再执行授权 app.UseAuthorization(); // 映射你的认证路由 app.MapGet("/api/auth/google", async (SignInManager<ApplicationUser> signInManager, HttpContext context) => { // 构建绝对回调URL(避免相对路径在不同环境下的问题) var redirectUrl = $"{context.Request.Scheme}://{context.Request.Host}/api/auth/google/handler"; var properties = signInManager.ConfigureExternalAuthenticationProperties("Google", redirectUrl); return Results.Challenge(properties, new[] { GoogleDefaults.AuthenticationScheme }); }); app.MapGet("/api/auth/google/handler", async (SignInManager<ApplicationUser> signInManager) => { var loginInfo = await signInManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return Results.BadRequest("获取外部登录信息失败"); } // 后续处理:查找用户、创建用户或直接登录 // 示例:var result = await signInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, isPersistent: false); return Results.Ok(new { Email = loginInfo.Principal.FindFirstValue(ClaimTypes.Email) }); }).RequireAuthorization();
关键说明
- Identity.External Scheme的作用是临时存储Google回调后的用户凭证,SignInManager依赖它来获取登录信息,认证完成后该Cookie会被自动清除。
- 必须确保Google开发者控制台中配置的回调URL与代码中
googleOptions.CallbackPath完全一致(包括HTTP/HTTPS、域名、路径)。
内容的提问来源于stack exchange,提问作者DrXSsive
相关产品推荐
相关产品推荐

