.NET Core 2.1 API中GetRolesAsync()返回空角色的原因排查
解决GetRolesAsync()返回空角色的问题
1. 调整Identity服务注册顺序
在.NET Core 2.1中,AddIdentity必须在AddAuthentication之前注册,因为AddIdentity会初始化身份认证相关的基础服务,顺序颠倒会导致UserManager无法正确访问角色数据。修改Startup.cs中的配置顺序:
// 先注册Identity服务 services.AddIdentity<User, ApplicationRole>() .AddEntityFrameworkStores<AccountContext>() .AddDefaultTokenProviders(); // 再配置认证和授权 var key = Encoding.ASCII.GetBytes(Configuration.GetValue<string>("JwtSettings:Secret")); services .AddAuthorization() .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; });
2. 验证DbContext的继承关系
确保AccountContext正确继承IdentityDbContext,并指定对应的用户和角色类型,否则EF Core无法正确映射AspNetUserRoles关联表:
public class AccountContext : IdentityDbContext<User, ApplicationRole, string> { public AccountContext(DbContextOptions<AccountContext> options) : base(options) { } // 其他DbSet定义... }
3. 确认主键类型一致性
检查User、ApplicationRole的主键类型与数据库表是否一致:默认IdentityUser和IdentityRole使用string作为主键,需确保AspNetUsers.Id、AspNetRoles.Id、AspNetUserRoles.UserId和AspNetUserRoles.RoleId均为字符串类型,避免因类型不匹配导致关联查询失败。
4. 检查角色名称大小写
默认情况下,AddToRoleAsync和GetRolesAsync对角色名称大小写敏感,需保证添加角色时的名称与查询时完全一致,避免因大小写差异返回空结果。
内容的提问来源于stack exchange,提问作者Dermo909
相关产品推荐
相关产品推荐

