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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:30