.NET Identity /login端点无法返回Bearer Token求助
核心问题
你碰到的/login只返回200 OK却没有Bearer Token的情况,十有八九是认证配置里缺了JWT Bearer的生成逻辑,或者SignInManager被改成只走Cookie认证了。
排查步骤及解决办法
1. 检查JWT Bearer服务是否正确配置
你的项目必须先注册JWT Bearer认证服务,并且配置好密钥、签发方、受众这些参数。要是之前的配置被删了或者注释掉,SignInManager根本没法生成Token。
对应你提供的构建方法,正确的配置应该是这样:
builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });
2. 确认Identity配置支持Token生成
用MapIdentityApi<TUser>的时候,得保证SignInManager的配置允许生成Bearer Token。要是你的Identity只开了Cookie认证,登录后自然只会返回Cookie,不会出Token。
检查AddIdentityCore或者AddIdentity的配置:
builder.Services.AddIdentityCore<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddSignInManager() .AddDefaultTokenProviders();
注意:AddIdentityCore默认不会加Cookie认证,但如果手动加了Cookie认证又没配JWT,SignInManager会优先用Cookie。
3. 检查MapIdentityApi的路由配置
确保在路由里正确调用了MapIdentityApi<ApplicationUser>(),而且没被自定义的/login端点或者中间件拦截响应。要是后来加了自己的登录逻辑,可能把原始的Token返回给覆盖了。
正确的路由配置示例:
app.MapIdentityApi<ApplicationUser>(); app.MapControllers();
4. 排查登录逻辑是否被修改
要是你自定义了SignInManager,或者在登录时改了AuthenticationProperties,可能会跳过Token生成。比如登录时强制指定用Cookie方案,就不会生成Bearer Token:
// 错误示例:硬指定Cookie方案 await _signInManager.PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure: false); // 正确做法:别指定方案,让SignInManager按配置自动选 // 或者明确指定JWT方案(如果需要)
5. 检查配置文件的JWT参数
appsettings.json里的JWT参数必须存在且有效,Key的长度至少16字节,不然加密逻辑会出问题:
{ "Jwt": { "Key": "your-strong-secret-key-at-least-16-characters", "Issuer": "your-issuer-url", "Audience": "your-audience-url" } }
快速验证方案
先把所有自定义的认证中间件、端点都去掉,只保留基础的Identity和JWT配置,重启项目后调用/login,看有没有Token返回。如果正常了,再一点点加回自定义代码,排查哪部分出的问题。
内容的提问来源于stack exchange,提问作者hutonahill

