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

.NET 7使用Identity调用GetRolesAsync报错:Store未实现IUserRoleStore

问题分析与解决方案

核心原因

你遇到的Store does not implement IUserRoleStore异常,本质是Identity包版本与.NET 7框架不兼容:你使用的Microsoft.AspNetCore.Identity 2.2.0是ASP.NET Core 2.2时代的版本,和.NET 7存在严重的API差异,导致EntityFrameworkStores无法正确实现角色相关的存储接口。

修复步骤

1. 升级Identity相关包到.NET 7兼容版本

在NuGet包管理器中,将以下包升级到7.x版本(与.NET 7框架版本一致):

  • Microsoft.AspNetCore.Identity
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer(或你使用的其他数据库提供者)

2. 简化Program.cs中的Identity配置

AddIdentity<TUser, TRole>方法已经默认包含角色支持,无需额外调用AddRoles<IdentityRole>,可简化配置为:

builder.Services.AddIdentity<MyTypeOfUser, IdentityRole>()
    .AddEntityFrameworkStores<MyDataContext>()
    .AddDefaultTokenProviders(); // 可选,用于密码重置等场景的默认令牌支持

3. 替换同步调用为异步await

避免使用.Result同步阻塞异步方法(可能导致死锁,不符合ASP.NET Core异步编程规范),修改JWT相关代码为:

var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<MyTypeOfUser>>();
var user = await userManager.GetUserAsync(context.Principal);
var roles = await userManager.GetRolesAsync(user);

注意:确保包含这段代码的方法标记为async Task或async Task<T>

4. 验证数据库迁移与表结构

升级包后建议重新生成并应用迁移,确保表结构与新版本Identity兼容:

Add-Migration UpdateIdentitySchema
Update-Database

额外检查点

  • 确认MyTypeOfUser确实继承自IdentityUser,未重写或隐藏导致角色关联失效的属性
  • 建议将MyDataContext的构造函数参数改为强类型DbContextOptions<MyDataContext>(更规范且避免潜在问题):
    public MyDataContext(DbContextOptions<MyDataContext> options)
        : base(options) { }
    

内容的提问来源于stack exchange,提问作者Chris Nevill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:23