繁体   English   中英

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

[英]No service for type 'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered

此错误的可能原因是什么:

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; }
}

我的数据库上下文:

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

我在Startup.cs ConfigureServices方法:

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);
}

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

这通常发生在 _LoginPartial.cshtml razor 视图中。 例如。

@inject UserManager<IdentityUser> userManager

必须改为

@inject UserManager<MyUserStore> userManager

这同样适用于SignInManager

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

每当您想要解析UserManager<> ,请将在您的启动中注册的身份用户模型指定为类型参数。 在您的特定情况下,这将是UserManager<MyUserStore>

或者同样地,在其他类中解析它时,可能是在您的Seeder服务中的情况。 您的异常的调用堆栈应该会提示您发生这种情况。

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

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IndentityUser> UserManager

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

注意区别,IdentityUser 与 MyUserStore

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

@inject SignInManager<IdentityUser> SignInManager

@inject SignInManager<YOURCUSTOMMODEL> SignInManager

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM