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

.NET Core Identity每次请求冗余查询AspNet系列表及Cookie集成疑问

.NET Core Identity 结合 JWT 认证: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:36:31