没有注册类型'Microsoft.AspNetCore.Identity.UserManager`1 [Microsoft.AspNetCore.Identity.IdentityUser]的服务

时间:2018-09-29 12:13:44

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

此错误的可能原因是什么

  

InvalidOperationException:没有注册类型'Microsoft.AspNetCore.Identity.UserManager [Microsoft.AspNetCore.Identity.IdentityUser]'的服务。

我的目标框架是netcoreapp2.1

这是我的用户商店类:

public class MyUserStore : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

还有我的用户角色类:

public class MyUserRole : IdentityRole
{
    public string Description { get; set; }
}

我的DbContext:

public class ApplicationDbContext : IdentityDbContext<MyUserStore,MyUserRole,string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> 
      options): base(options) { }
}

我在ConfigureServices中的Startup.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.AddIdentity<MyUserStore, MyUserRole>(cfg => {
        cfg.User.RequireUniqueEmail = true;
    }).AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddTransient<Seeder>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

我想了解为什么会发生这种情况以及最佳实践是什么。

6 个答案:

答案 0 :(得分:7)

这是_LoginPartial.cshtml中的解决方案, 替换

@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

使用

@using Microsoft.AspNetCore.Identity
@inject SignInManager<MyUserStore> SignInManager
@inject UserManager<MyUserStore> UserManager

注意区别,IdentityUser与MyUserStore

答案 1 :(得分:1)

在为AspNetCore身份注册自己的MyUserStore(错误名称,应为MyUser)时,UserManager <>类型将作为UserManager<MyUserStore>注册到ServiceCollection。

每当您要解析UserManager<>时,请将在启动时注册的身份用户模型指定为type参数。在您的特定情况下为UserManager<MyUserStore>。 / p>

在生成的服务提供商上调用GetRequiredService<UserManager<IdentityUser>>()时,GetRequiredService<UserManager<IdentityUser>>()将引发以上异常。

这通常发生在剃刀视图中。例如

@inject Microsoft.AspNetCore.Identity.UserManager<Microsoft.AspNetCore.Identity.IdentityUser> userManager

或者类似地,当在其他类中自己调用它时,例如您的Seeder服务中的情况。或其他代码部分。异常的调用堆栈应该可以提示您发生这种情况的地方。

答案 2 :(得分:1)

在 _ManageNav.cshtml 文件中,确保您具有以下内容:

@using PROJECTNAME.Models
@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager

请将 PROJECTNAME 更改为您的项目名称。

答案 3 :(得分:1)

在局部视图中出现相同的错误。 事实证明,如果您正在注入登录管理器,则必须在配置服务(在 Startup.cs 中)中注册它

在我的例子中,在 Startup.cs 的 ConfigureServices 函数中添加了这个

services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

答案 4 :(得分:0)

核心2也有同样的问题。文件_ManageNav.cshtml是您需要检查的另一个区域。尝试更新该行

@inject SignInManager<IdentityUser> SignInManager

使用

@inject SignInManager<YOURCUSTOMMODEL> SignInManager.`

答案 5 :(得分:0)

在您的 Startup.cs 或 IdentityHostingStartup.cs 文件中添加以下代码

 services.AddDefaultIdentity<ApplicationUser>()
                    .AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders().AddDefaultUI();