.NET Core Identity每次请求冗余查询AspNet系列表及Cookie集成疑问
核心结论
仅用JWT做授权控制时,完全不需要集成Cookie——这就是你移除ConfigureApplicationCookie和UseCookiePolicy后冗余查询消失的原因。
为什么会出现冗余查询
当你通过services.AddIdentity<TUser, TRole>()注册Identity服务时,默认会自动启用Cookie认证作为 fallback 方案,哪怕你在接口上指定了[Authorize(AuthenticationSchemes = "Bearer")],Identity内部的部分逻辑仍会尝试从Cookie中读取用户身份,触发对AspNetUsers、AspNetUserClaims等表的查询。
正确配置步骤
1. 精简Identity服务注册
如果你只需要JWT认证,不需要Identity的Cookie登录、后台管理页面等功能,改用AddIdentityCore<TUser>替代默认的AddIdentity<TUser, TRole>——前者不会自动注册Cookie相关服务:
services.AddIdentityCore<ApplicationUser>(options => { // 按需配置密码复杂度、账户锁定等Identity选项 }) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>();
2. 仅配置JWT Bearer认证
显式配置JWT认证,可直接将其设为默认认证方案,这样接口上的[Authorize]特性无需额外指定AuthenticationSchemes:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; });
3. 移除Cookie相关中间件
在Configure方法中,只保留必要的认证授权中间件,删除app.UseCookiePolicy()及其他Cookie相关配置:
app.UseRouting(); app.UseAuthentication(); // 必须保留,用于处理JWT令牌验证 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
4. 生成JWT时嵌入完整声明
登录生成Token时,将用户的角色、权限等必要信息直接嵌入令牌,这样后续接口请求只需验证Token有效性,无需再查询数据库:
var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim(ClaimTypes.Name, user.UserName), // 按需添加角色或自定义权限声明 new Claim(ClaimTypes.Role, "Admin") }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], claims: claims, expires: DateTime.Now.AddHours(1), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token);
额外注意事项
- 若后续需要使用Identity的用户管理、密码重置等功能,可保留
AddIdentity但显式禁用Cookie认证,或手动覆盖默认的Cookie配置。 - 确保所有授权接口的
[Authorize]要么指定AuthenticationSchemes = "Bearer",要么将JWT设为默认认证方案,避免触发Cookie认证的 fallback 逻辑。
内容的提问来源于stack exchange,提问作者Neslihan Akbaba
相关产品推荐
相关产品推荐

