Autenticación y autorización sin Entity Framework en ASP.NET 5 MVC 6

asp.net asp.net-core asp.net-mvc c# dapper

Pregunta

Estoy intentando configurar mi autenticación y autorización usando mi base de datos y tablas existentes, sin utilizar Entity Framework (usando Dapper).

Tengo el Dapper configurado correctamente, ahora estoy tratando de conectar el SignInManager y UserManager para llamar a mi base de datos a través de Dapper, pero antes de que eso ocurra, me estoy encontrando con algunos errores en mi tienda de roles personalizada.

Aquí está el error que estoy recibiendo cuando hago clic en el botón "Registrarse" en el sitio web (este 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 configuré mi usuario personalizado, rol, userstore, role store, usermanager y rolemanager:

    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 sobre RoleManager, ya he definido mi RoleManager personalizado ...

Respuesta aceptada

Un problema que veo es que WrestleStatRole hereda de IdentityRole, que puede sonar como parte de Identity, pero es realmente parte de la implementación de IdentityFramework Identity. Si intentas hacer cosas sin EF, no debes heredar de eso.

Necesitarías tu propia clase de roles y no deberías usar ninguna clase de la implementación de EF.

Del mismo modo, el ApplicationUser que hereda de WrestleStatUser se encuentra en la carpeta de modelos de proyecto de la aplicación web, pero asegúrese de que no herede de IdentityUser, que forma parte de la implementación de identidad de EntityFramework.

Para no utilizar Entity Framework, debe implementar IUserStore e IRoleStore y registrar aquellos con servicios di

services.AddScoped<IUserStore<WrestleStatUser>, UserStore<WrestleStatUser>>();
services.AddScoped<IRoleStore<WrestleStatRole>, RoleStore<WrestleStatRole>>();

y, como se mencionó, su usuario y las clases de roles no deberían heredar de las implementaciones de EF, de hecho, no necesitan heredar nada de nada, siempre y cuando haya implementado esas tiendas y funcionen.

Puede usar el UserManager integrado si implementa el usertore y el servidor de roles, no es necesario que lo implemente 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 múltiples inquilinos personalizada que no usa el marco de entidad. En realidad, estoy soportando capas de datos mutlple que pueden ser conectadas y EF es una de ellas, pero está lejos de bits de identidad y no estoy usando nada del espacio de nombres Microsoft.AspNetCore.Identity.EntityFrameworkCore.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué