此错误的可能原因是什么
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);
}
我想了解为什么会发生这种情况以及最佳实践是什么。
答案 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();