c# - Autenticación y autorización sin Entity Framework en ASP.NET 5 MVC 6
asp.net-mvc asp.net-core (1)
Un problema que veo es que WrestleStatRole hereda de IdentityRole que puede parecer parte de Identity, pero en realidad es parte de la implementación de IdentityFramework Identity. Si está intentando hacer cosas sin EF, no debería heredar de eso.
Necesitaría su propia clase de rol y no debería usar ninguna clase de la implementación de EF.
De manera similar, el ApplicationUser que hereda en WrestleStatUser se encuentra en la carpeta de modelos de proyectos de la aplicación web, pero asegúrese de que no herede de IdentityUser que es parte de la implementación de identidad de EntityFramework
Para no usar Entity Framework, debe implementar IUserStore e IRoleStore y registrarlos con di servicios
services.AddScoped<IUserStore<WrestleStatUser>, UserStore<WrestleStatUser>>();
services.AddScoped<IRoleStore<WrestleStatRole>, RoleStore<WrestleStatRole>>();
y como se mencionó, las clases de usuario y rol no deberían heredar de las implementaciones de EF, de hecho, no es necesario que se hereden de nada, siempre y cuando haya implementado esas tiendas y funcionen.
Puede usar el UserManager integrado si implementa el almacén de usuario y rolestore, no es necesario que lo implemente usted mismo a menos que tenga otras razones para hacerlo.
Si necesita un código de ejemplo, puede ver mi proyecto de cloudscribe. He implementado una implementación de identidad de varios inquilinos personalizada que no usa el marco de la entidad. En realidad, estoy soportando múltiples capas de datos que pueden ser conectadas y EF es una de ellas, pero está muy alejada de los bits de identidad y no uso nada del espacio de nombres Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Estoy tratando de configurar mi autenticación y autorización usando mi base de datos y tablas existentes, sin usar Entity Framework (usando Dapper).
Tengo el Dapper configurado correctamente, ahora estoy tratando de conectar SignInManager y UserManager para llamar a mi base de datos a través de Dapper, pero antes de que eso ocurra, me encuentro con algunos errores en mi almacén de roles personalizados.
Aquí está el error que recibo cuando hago clic en el botón "Registrar" en el sitio web (esto es solo un proyecto simple con todas las cosas predefinidas de la cuenta, etc.).
InvalidOperationException: Unable to resolve service for type ''Microsoft.AspNet.Identity.IRoleStore`1[TestAsyncWebsite.Configuration.WrestleStatRole]'' while attempting to activate ''Microsoft.AspNet.Identity.RoleManager`1[TestAsyncWebsite.Configuration.WrestleStatRole]''
Por ahora, así es como he configurado mi usuario, rol, almacén de rol, almacén de usuarios, administrador de archivos y administrador de roles personalizados:
public class WrestleStatUser : ApplicationUser
{
public WrestleStatUser() : base()
{
}
}
public class WrestleStatRole : IdentityRole
{
}
public class WrestleStatUserStore : IUserStore<WrestleStatUser>
{
// all methods implemented
}
public class WrestleStatRoleStore : IRoleStore<WrestleStatRole>
{
// all methods implemented
}
public class WrestleStatUserManager : UserManager<WrestleStatUser>
{
public WrestleStatUserManager(IUserStore<WrestleStatUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<WrestleStatUser> passwordHasher, IEnumerable<IUserValidator<WrestleStatUser>> userValidators, IEnumerable<IPasswordValidator<WrestleStatUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IEnumerable<IUserTokenProvider<WrestleStatUser>> tokenProviders, ILogger<UserManager<WrestleStatUser>> logger, IHttpContextAccessor contextAccessor)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, tokenProviders, logger, contextAccessor)
{
}
}
public class WrestleStatRoleManager : RoleManager<WrestleStatRole>
{
public WrestleStatRoleManager(IRoleStore<WrestleStatRole> store, IEnumerable<IRoleValidator<WrestleStatRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<WrestleStatRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
{
}
}
Y aquí está mi startup.cs:
services.AddIdentity<WrestleStatUser, WrestleStatRole>()
.AddUserStore<WrestleStatUserStore>()
.AddUserManager<WrestleStatUserManager>()
//.AddRoleStore<RoleStore>()
.AddRoleManager<WrestleStatRoleManager>()
.AddDefaultTokenProviders();
¿Que me estoy perdiendo aqui? El error dice algo acerca del RoleManager, ya he definido mi RoleManager personalizado ...