作者:liuxiaoli8611 | 来源:互联网 | 2022-12-10 05:03
我需要创建自己的类来处理EF Core 2.1中的身份。我有以下内容,但是当要使用控制器的方法时,出现以下错误
尝试激活“ Sample.API.Models .Identity.Managers.ApplicationUserManager”时,无法解决“ Sample.API.Models.Identity.Stores.ApplicationUserStore”类型的服务。
public void ConfigureServices(IServiceCollection servicesCollection)
{
servicesCollection.AddDbContext(currentOptiOns=>
currentOptions.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
servicesCollection.AddIdentity()
.AddEntityFrameworkStores()
.AddRoleStore()
.AddUserStore()
.AddUserManager()
.AddRoleManager()
.AddSignInManager()
.AddDefaultTokenProviders();
servicesCollection.AddTransient, ApplicationUserManager>();
servicesCollection.AddTransient, ApplicationSignInManager>();
servicesCollection.AddTransient, ApplicationRoleManager>();
servicesCollection.AddTransient, ApplicationUserStore>();
servicesCollection.AddTransient, ApplicationRoleStore>();
...
...
...
}
public class MyIndentityContext : IdentityDbContext
{
private readonly IConfiguration _configuration;
private readonly IHttpContextAccessor _httpContextAccessor;
public MyIndentityContext(DbContextOptions dbContextOptions, IHttpContextAccessor httpContextAccessor,
IConfiguration configuration)
: base(dbContextOptions)
{
_cOnfiguration= configuration;
_httpCOntextAccessor= httpContextAccessor;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("Sample.API");
}
}
public class ApplicationRoleManager : RoleManager
{
public ApplicationRoleManager(ApplicationRoleStore roleStore,
IEnumerable> roleValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, ILogger logger) : base(roleStore,
roleValidators,
keyNormalizer, errors, logger)
{
}
}
public class ApplicationSignInManager : SignInManager
{
public ApplicationSignInManager(ApplicationUserManager userManager, IHttpContextAccessor contextAccessor,
IUserClaimsPrincipalFactory claimsFactory, IOptions optionsAccessor,
ILogger logger, IAuthenticationSchemeProvider schemes) : base(userManager,
contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
}
}
public class ApplicationUserManager : UserManager
{
public ApplicationUserManager(ApplicationUserStore userStore, IOptions optionsAccessor,
IPasswordHasher passwordHasher,
IEnumerable> userValidators,
IEnumerable> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider services, ILogger logger) :
base(userStore, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
services, logger)
{
}
}
public class ApplicationRoleStore : RoleStore
{
public ApplicationRoleStore(MyIndentityContext dbContext, IdentityErrorDescriber identityErrorDescriber)
: base(dbContext, identityErrorDescriber)
{}
}
public class ApplicationUserStore : UserStore
{
public ApplicationUserStore(MyIndentityContext dbContext, IdentityErrorDescriber identityErrorDescriber)
: base(dbContext, identityErrorDescriber)
{}
}
public class ApplicationUser : IdentityUser {}
public class ApplicationRole : IdentityRole
{
public ApplicationRole() { }
public ApplicationRole(string roleName) : base(roleName) { }
public ApplicationRole(string roleName, string roleDescription) : base(roleName)
{
Description = roleDescription;
}
}
[Authorize]
[ApiController]
[Route("api/[controller]")]
[EnableCors(CORS.AllowSpecificOrigins)]
public class UserController : BaseController
{
private readonly ApplicationUserManager _applicationUserManager;
public UserController(ApplicationUserManager applicationUserManager)
{
_applicatiOnUserManager= applicationUserManager;
}
// GET: api/User/5
[HttpGet("{id}")]
public async Task Get(int id)
{
var currentuser = await _applicationUserManager.FindByNameAsync("NAME");
return ...;
}
}
编辑:
完成“ Camilo Terevinto”用户的建议后,我使它起作用,但我还必须更改所有管理器的构造函数。例如,我必须通过IRoleStore roleStore更改ApplicationRoleStore roleStore
1> SO used to b..:
使用依赖注入时,具有依赖关系的类不要求实现,而是要求合同。
这个:
private readonly ApplicationUserManager _applicationUserManager;
public UserController(ApplicationUserManager applicationUserManager)
{
_applicatiOnUserManager= applicationUserManager;
}
应该:
private readonly UserManager _applicationUserManager;
public UserController(UserManager applicationUserManager)
{
_applicatiOnUserManager= applicationUserManager;
}
另外,请注意,您不需要任何这些行,这些行已由先前对其.AddIdentity
和选项的调用添加。
servicesCollection.AddTransient, ApplicationUserManager>();
servicesCollection.AddTransient, ApplicationSignInManager>();
servicesCollection.AddTransient, ApplicationRoleManager>();
servicesCollection.AddTransient, ApplicationUserStore>();
servicesCollection.AddTransient, ApplicationRoleStore>();