【问题标题】:Asp.Net Core No Service for Type Microsoft.AspNetCore.Identity.RoleManager类型 Microsoft.AspNetCore.Identity.RoleManager 的 Asp.Net Core 无服务
【发布时间】:2019-10-29 14:29:33
【问题描述】:

我在访问 Startup.cs 类中的 RoleManagerUserManager 时遇到问题。这是我用来注册Identity的代码:

services.AddIdentity<User, IdentityRole>(cfg =>
{
    cfg.User.RequireUniqueEmail = true;
    cfg.SignIn.RequireConfirmedEmail = true;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<CarinioContext>()
.AddDefaultTokenProviders()
.AddErrorDescriber<CustomIdentityErrorDescriber>();

User 是我的自定义类,它继承自 IdentityUser,并通过一些附加属性对其进行扩展。

我在startup.cs 类中有一个函数来创建角色和用户。我知道这不适合播种,我将来会改变它,但我需要先让它以这种方式工作。这是我的代码:

private async Task CreateRoles()
{
    //adding custom roles
    var UserManager = _serviceProvicer.GetRequiredService<UserManager<IdentityUser>>();
    var RoleManager = _serviceProvicer.GetRequiredService<RoleManager<IdentityRole>>();
    string[] roleNames = { "Admin", "Client", "Driver" };
    IdentityResult roleResult;

    foreach (var roleName in roleNames)
    {
        //creating the roles and seeding them to the database
        var roleExist = await RoleManager.RoleExistsAsync(roleName);
        if (!roleExist)
        {
            roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
        }
    }

    //creating a super user who could maintain the web app
    var poweruser = new User
    {
        UserName = _configuration.GetSection("UserSettings")["UserName"],
        Email = _configuration.GetSection("UserSettings")["UserEmail"],
        PhoneNumber = _configuration.GetSection("UserSettings")["PhoneNumer"],
    };

    string UserPassword = _configuration.GetSection("UserSettings")["UserPassword"];
    var _user = await UserManager.FindByEmailAsync(_configuration.GetSection("UserSettings")["UserEmail"]);

    if (_user == null)
    {
        var createPowerUser = await UserManager.CreateAsync(poweruser, UserPassword);
        if (createPowerUser.Succeeded)
        {
            //here we tie the new user to the "Admin" role
            await UserManager.AddToRoleAsync(poweruser, "Admin");
        }
    }
}

程序总是崩溃说:

"One or more errors occurred. (No service for type 'Microsoft.AspNetCore.Identity.RoleManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.)"

UserManager 也是如此:

"One or more errors occurred. (No service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.)"

我的猜测是我没有以正确的方式访问UserManagerRoleManager。有谁知道解决办法吗?

【问题讨论】:

    标签: c# asp.net asp.net-core dependency-injection asp.net-identity


    【解决方案1】:

    dotnet core 具有很棒的功能,可以在第一时间为角色或用户播种 在 efcore 的实体配置部分,您可以使用打击类来创建您的默认角色:

    public class RoleConfiguration : IEntityTypeConfiguration<Role>
    {
        public void Configure(EntityTypeBuilder<Role> builder)
        {
           builder.HasData(new Role() {Id=1, Name = "Manager", NormalizedName = "MANAGER",Title="manager" }, new Role() {Id=2, Name = "Student", NormalizedName = "STUDENT",Title="student" });
        }
    }
    

    【讨论】:

      【解决方案2】:

      尝试修改您的代码:

      var UserManager = _serviceProvicer.GetRequiredService<UserManager<IdentityUser>>();
      

      到:

      var UserManager = _serviceProvicer.GetRequiredService<UserManager<User>>();
      

      如果您创建继承自 IdentityUser 的自定义类,则需要在 ConfigureServices 中注册新的 User

      services.AddIdentity<User, IdentityRole>
      

      CarinioContext 类似:

      public class CarinioContext: IdentityDbContext<User, IdentityRole, string>
      

      _LoginPartial.cshtml:

      @inject SignInManager<User> SignInManager
      @inject UserManager<User> UserManager
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        • 2022-12-01
        • 2021-06-20
        • 1970-01-01
        • 2021-06-11
        相关资源
        最近更新 更多