c# - ASP.NET Core 2.1 角色管理器注册

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

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

"No service for type Microsoft.AspNetCore.Identity.RoleManager'1[Microsoft.AspNetCore.Identity.IdentityRole] has been registered.

编辑*** 我认为问题是 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

最佳答案

您还没有在 DI 容器中注册角色服务。这一行:

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

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

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

关于c# - ASP.NET Core 2.1 角色管理器注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54065096/

相关文章:

c# - 如何使用 linq2sql 模拟 nhibernate 存储库模式?

c# - 两个相同值的字节数组不相等

c# - Unity3d 随时间围绕特定点旋转

sql - SQL批量插入父子表的操作

c# - 自定义 UserManager 总是返回 null

c# - VS2015 XAML 设计器总是 System.UnauthorizedAccessException

c# - 如何使用 System.Text.Json 访问从字符串反序列化的动态对象的属性?

c# - 无法将 'Microsoft.NETCore.App (>= 2.0.0)' 解析为 '.NETCoreApp,Version=v2.0'

asp.net-core - 将数据传递给 IdentityServer4 中的 IProfileService

c# - 如何在 .Net Core 测试中模拟 UserManager?