当试图激活“ AuthController”时,无法解析“ Microsoft.AspNetCore.Identity. UserManager”类型的服务

我在登录控制器中得到这个错误。

InvalidOperationException: 无法解析“ Microsoft”类型的服务。AspNetCore.身份。用户管理器’1[汽车。模特。当试图激活“ Automobile”时。服务器。控制器。AuthController’。

这里是 Auth Controller 的构造函数:

private SignInManager<Automobile.Models.Account> _signManager;
private UserManager<Automobile.Models.Account> _userManager;


public AuthController(UserManager<Models.Account> userManager,
SignInManager<Automobile.Models.Account> signManager)
{
this._userManager = userManager;
this._signManager = signManager;
}

这是 startup.cs 中的 ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.Configure<AppConfig>(Configuration.GetSection("AppSettings"));


//var provider = HttpContext.ApplicationServices;
//var someService = provider.GetService(typeof(ISomeService));




services.AddDbContext<Providers.Database.EFProvider.DataContext>(options => options
.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly("Automobile.Server")
));




services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();
//services.AddScoped<SignInManager<Automobile.Models.Account>, SignInManager<Automobile.Models.Account>>();
//services.AddScoped<UserManager<Automobile.Models.Account>, UserManager<Automobile.Models.Account>>();


services.AddMvc();
App.Service = services.BuildServiceProvider();


// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();


services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.CookieHttpOnly = true;
});


}
164282 次浏览

您需要在 SignInManager、 UserManager 和服务中使用相同的用户数据模型。AddIdentity.如果您使用自己的自定义应用程序角色模型类,则相同的主体为 true。

所以,改变吧

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();

services.AddIdentity<Automobile.Models.Account, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<Providers.Database.EFProvider.DataContext>()
.AddDefaultTokenProviders();

只是想弄清楚答案:

如果在 startup.cs 中使用类 ApplicationUser: services.AddIdentity<ApplicationUser, IdentityRole>()

然后,在注入时,必须在控制器中使用相同的类:

public AccountController(UserManager<ApplicationUser> userManager)

如果你使用其他类,例如:

public AccountController(UserManager<IdentityUser> userManager)

然后你会得到这个错误:

InvalidOperationException: 无法解析类型为“ Microsoft.AspNetCore.Identity. UserManager‘1[ IdentityUser ]”的服务

因为您在启动时使用的是 ApplicationUser,而不是 IdentityUser,所以这种类型没有在注入系统中注册。

这和最初的文章有点不相关,但是因为 Google 把你带到了这里... ... 如果你得到了这个错误并且使用:

services.AddIdentityCore<YourAppUser>()

然后你需要手动注册 AddIdentity所做的事情,可以在这里找到: Https://github.com/aspnet/identity/blob/feedcb5c53444f716ef5121d3add56e11c7b71e5/src/identity/identityservicecollectionextensions.cs#l79

        services.AddHttpContextAccessor();
// Identity services
services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped<IdentityErrorDescriber>();
services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
services.TryAddScoped<UserManager<TUser>>();
services.TryAddScoped<SignInManager<TUser>>();
services.TryAddScoped<RoleManager<TRole>>();

您需要将 TUserTRole替换为它们的实现,或者默认的 IdentityUserIdentityRole

不要忘记在 ConfigureServices 中添加角色管理器

services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>() // <--------
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();

如果使用“ IdentityServer”,IdentityServer 将验证用户并授权客户机。默认情况下,IdentityServer 实际上与用户管理无关。但对 Asp.net 身份也有一些支持

所以你需要加上:

services.AddIdentityServer()
.AddAspNetIdentity<ApplicationUser>();

可以在 Startup 类中单独设置 ConfigureServices 中的 IdentityUser 和 IdentityRole,如下所示:

services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();

或者

您可以直接配置到 AddIdentity:

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

您需要用以下内容更新 Statup.cs 类

AddIdentity < ApplicationUser,IdentityRole > () . AddEntityFrameworkStores () ;

这里: ApplicationUser 是我的自定义模型类。