首页 > 解决方案 > ASP.NET Core 2.1 角色管理器注册

问题描述

在我的种子代码中,我创建了用户和角色,并且错误似乎是每当我通过启动运行它时,我似乎得到了

“没有Microsoft.AspNetCore.Identity.RoleManager'1[Microsoft.AspNetCore.Identity.IdentityRole]注册类型的服务。

编辑*** 我认为问题在于 identityhostingstartup 中的代码没有被执行,这是由脚手架身份创建的。

种子数据库

public static void CreateRolesAndUsers(IServiceProvider serviceProvider)
    {
        var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var userManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();
        var context = serviceProvider.GetService<AuthContext>();
        var configuration = serviceProvider.GetService<IConfiguration>();

        //context.Database.EnsureCreated();
        context.Database.Migrate();

        Task<IdentityResult> roleResult;
        string email = configuration["Admin:Email"];

        //Check that there is an Administrator role and create if not
        Task<bool> hasAdminRole = roleManager.RoleExistsAsync(Roles.ADMIN);
        hasAdminRole.Wait();

        if (!hasAdminRole.Result)
        {
            roleResult = roleManager.CreateAsync(new IdentityRole(Roles.ADMIN));
            roleResult.Wait();
        }

        //Check if the admin user exists and create it if not
        //Add to the Administrator role
        Task<AppUser> testUser = userManager.FindByEmailAsync(email);
        testUser.Wait();

        if (testUser.Result == null)
        {
            CreateAdminUser(userManager, email, configuration["Admin:Password"]);
        }
        else if (configuration.GetValue<bool>("Admin:Reset") == true)
        {
            userManager.DeleteAsync(testUser.Result);
            CreateAdminUser(userManager, email, configuration["Admin:Password"]);
        }

    }

    private static void CreateAdminUser(UserManager<AppUser> userManager, string email, string password)
    {
        AppUser user = new AppUser
        {
            Email = email,
            UserName = email
        };

        Task<IdentityResult> newUser = userManager.CreateAsync(user, password);
        newUser.Wait();

        if (newUser.Result.Succeeded)
        {
            Task<IdentityResult> newUserRole = userManager.AddToRoleAsync(user, Roles.ADMIN);
            newUserRole.Wait();
        }
    }

IdentityHostingStartup.cs

enter [assembly: HostingStartup(typeof(WebApp.Areas.Identity.IdentityHostingStartup))]
namespace WebApp.Areas.Identity
{
    public class IdentityHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {
            });
        }
    }
}

启动.cs

 public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

我得到的完整错误信息是这样的

System.InvalidOperationException
  HResult=0x80131509
  Message=No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityRole]' has been registered.
  Source=Microsoft.Extensions.DependencyInjection.Abstractions

 StackTrace:

 at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService(IServiceProvider provider, Type serviceType) 
    at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService[T](IServiceProvider provider)
   at b.Data.SeedAuth.CreateRolesAndUsers(IServiceProvider serviceProvider) in C:\Users\\source\repos\b\b\Data\SeedAuth.cs:line 17
   at b.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider) in C:\Users\\source\repos\b\b\Startup.cs:line 65

标签: c#asp.net-coreasp.net-core-identity

解决方案


您尚未在 DI 容器中注册角色服务。这一行:

services.AddDefaultIdentity<AppUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

需要通过使用AddRoles方法更改以包含它们。假设您使用的是默认IdentityRole类:

services.AddDefaultIdentity<AppUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

推荐阅读