[英]No service for type 'Microsoft.AspNetCore.Identity.UserManager`1[testLogin.Areas.Identity.Data.testLoginUser]' has been registered
[英]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.