Recientemente comencé un nuevo proyecto usando MVC y un marco de entidad (todo nuevo para mí). En mi aplicación tengo 2 tipos de usuarios, administradores y no administradores.

He sembrado un administrador en mi base de datos en el archivo configuration.cs bajo el método de semilla:

var userStore = new UserStore<Users>(context);
            var userManager = new ApplicationUserManager(userStore);

            var admin1 = new Users
            {
                UserName = "admin@email.com"
            };

            userManager.Create(admin1, "password");
            AddUserAndRole(context, userManager, admin1);

Método AddUserAndRole:

bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user)
        {
            IdentityResult ir;
            var rm = new RoleManager<IdentityRole>
                (new RoleStore<IdentityRole>(context));

            ir = um.Create(new IdentityRole("canEdit"));
            ir = um.AddToRole(user.Id, "canEdit");
            return ir.Succeeded; 
        }

Una vez que migré y ejecuté la solución, verifiqué la tabla AspNetUserLogins para asegurarme de que la ID del usuario se haya asociado correctamente con el nuevo rol de reclamos, pero por alguna razón no se actualiza, pero cuando miro dentro de la tabla AspNetRoles, el reclamo se agregado a eso junto con un ID que no está asociado con el admin1 creado.

Me pregunto si alguien podría señalar en qué me equivoco.

Gracias de antemano por cualquier ayuda y por favor infórmeme si me he perdido alguna información requerida en esta publicación. :)

0
user6845426 15 dic. 2016 a las 15:00

2 respuestas

La mejor respuesta

Sin embargo, lo que @War dice sobre roles y afirmaciones es muy cierto:

La tabla AspNetRoles contiene dos columnas:

  • Id: el id del rol , no el usuario

  • Nombre: el nombre del rol

En su lugar, debe mirar la tabla AspNetUserRoles, que vincula los ID de usuario con los ID de rol (columnas UserID y RoleId)

Pero también tienes otro problema:

Está creando un nuevo rol cada vez que intenta asignar un usuario a, por ejemplo, "canEdit". Es por eso que obtiene una nueva entrada en AspNetRoles cada vez. Solo debe haber una fila por nombre de rol en esa tabla.

Entonces, en lugar de usar CreateRole cada vez, intente algo como

    bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user)
    {
        IdentityResult ir;
        var rm = new RoleManager<IdentityRole>
            (new RoleStore<IdentityRole>(context));

        if(!rm.RoleExists("canEdit"))
        {
            var createResult = rm.Create(new IdentityRole("canEdit"));
            if(!createResult.Succeeded)
            {
                return false;
            }
        }
        return um.AddToRole(user.Id, "canEdit").Succeeded;
    }

O mejor:

    bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user, string roleName)
    {
        return AddUserToRole(context, um, user, "cadEdit");
    }
    bool AddUserToRole(ApplicationDbContext context, ApplicationUserManager um, Users user, string roleName)
    {
        IdentityResult ir;
        var rm = new RoleManager<IdentityRole>
            (new RoleStore<IdentityRole>(context));

        if(!rm.RoleExists(roleName))
        {
            var createResult = rm.Create(new IdentityRole(roleName));
            if(!createResult.Succeeded)
            {
                return false;
            }
        }
        return um.AddToRole(user.Id, roleName).Succeeded;
    }
0
K Ekegren 15 dic. 2016 a las 12:51

Está mezclando sus conceptos de seguridad según el aspecto de las cosas.

Hay varias cosas en juego aquí, las típicas explicaciones "simplificadas" de estas son ...

Usuario = Alguien que puede iniciar sesión Inicio de sesión = Un conjunto de credenciales para un usuario

Rol = Agrupa usuarios y permisos juntos
Claim = Algo que dice un proveedor de reclamaciones sobre un usuario

A partir de la pregunta, parece que está mezclando autenticación basada en reclamos y autenticación basada en roles cuando en realidad parece que solo tiene 2 roles simples (Usuarios y Administradores)

Básicamente, elija la autenticación basada en reclamos o la autenticación basada en roles y use una u otra a menos que realmente necesite la complejidad, en tal caso, tiene un valor mínimo de 3 meses para leer y entender todas estas cosas.

En resumen, yo ...

Cree el usuario, agregue el usuario a un rol y luego use la autenticación basada en roles hasta que necesite ir más allá.

var adminUser = new Users
{
    UserName = "admin@email.com",
    Roles = new [] { "Admins", "Users" } 
};

userManager.Create(adminUser);
1
Community 20 jun. 2020 a las 09:12