如何在ASP.NET Core 2.1中使用角色?解决RoleManager注入问题
解决ASP.NET Core 2.1中AddDefaultIdentity无法注入RoleManager的问题
你说得对,AddDefaultIdentity<TUser>确实是ASP.NET Core 2.1引入的简化身份验证API,但它默认只包含用户管理的基础服务,没有启用角色管理功能,所以你没法获取RoleManager<IdentityRole>实例。下面给你两种简单的解决办法:
方法一:替换为完整的AddIdentity API
直接把AddDefaultIdentity换成ASP.NET Core 2.0里常用的AddIdentity<TUser, TRole>,这样会自动包含角色管理所需的服务。如果需要保留默认的Identity界面,记得加上AddDefaultUI():
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection"))); // 替换AddDefaultIdentity为AddIdentity,启用角色管理 services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultUI() // 保留默认Identity用户界面 .AddDefaultTokenProviders(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
方法二:给AddDefaultIdentity添加角色扩展
如果你想继续使用AddDefaultIdentity的简化写法,只需要在后面链式调用AddRoles<TRole>方法,就能补充角色管理相关服务:
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection"))); // 在AddDefaultIdentity后添加AddRoles,启用角色管理 services.AddDefaultIdentity<IdentityUser>() .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
补充:用户和角色初始化示例代码
解决依赖注入问题后,你就可以在静态初始化类里正常使用RoleManager和UserManager了,比如这样实现初始化逻辑:
public static class DbInitializer { public static async Task InitializeAsync(IServiceProvider serviceProvider) { var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>(); var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>(); // 初始化角色 var roleNames = new[] { "Admin", "Editor", "RegularUser" }; foreach (var roleName in roleNames) { if (!await roleManager.RoleExistsAsync(roleName)) { await roleManager.CreateAsync(new IdentityRole(roleName)); } } // 初始化管理员用户 var adminEmail = "admin@example.com"; var adminUser = await userManager.FindByEmailAsync(adminEmail); if (adminUser == null) { adminUser = new IdentityUser { UserName = adminEmail, Email = adminEmail, EmailConfirmed = true }; await userManager.CreateAsync(adminUser, "AdminPass123!"); await userManager.AddToRoleAsync(adminUser, "Admin"); } } }
然后在Program.cs中调用初始化方法:
public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { // 执行用户和角色初始化 DbInitializer.InitializeAsync(services).Wait(); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "初始化数据库用户和角色时发生错误"); } } host.Run(); }
这样就能同时完成用户和角色的初始化工作了。
内容的提问来源于stack exchange,提问作者Alan T
相关产品推荐
相关产品推荐

