¿Cómo configurar la autenticación de tiempo de ejecución en ASP.NET Core?

8

Estoy creando una aplicación en la que hay gestión de módulos basada en roles y se cambia en cualquier momento y en cualquier momento. Guión:

  • Si un usuario tiene acceso para crear y ver Empleado, un usuario solo puede crear y ver empleados, pero en el futuro el administrador cambia la función del usuario de crear y ver para ver y eliminar, de lo que un usuario solo puede hacer esa actividad.

Intento con, [Authorize(Roles ="Staff")]pero si el administrador cambia el tiempo de ejecución, entonces no se administra.

¿Alguien puede investigar esto y volver a mí?

Soni profundo
fuente
Authorize(Roles ="Staff")se asegura de que el usuario con rol Staffsolo pueda acceder a esta acción ... Entonces, si el usuario es eliminado de este rol, el usuario no podrá acceder a este ... ¿No está sucediendo esto?
Chetan Ranpariya
Hasta donde sé, esto no es posible y quizás no sea una buena idea. Los usuarios deben cerrar sesión y volver a iniciarla para que se apliquen los nuevos roles. Incluso puede representar la página de manera diferente.
Emad
Suponiendo que está utilizando una cookie o un token de portador de jwt: los reclamos / roles del usuario persisten en la cookie / token, debe cerrar la sesión del usuario e iniciar sesión nuevamente para asegurarse de que reciba una cookie / token nueva.
itminus
Hola, @itminus Actualmente, la fase inicial se está ejecutando, por lo que en el momento del inicio de sesión, el usuario obtiene el rol y la lista de roles disponibles Create Employee, View Employeey @Emad Sí, necesito cambios al momento del inicio de sesión si hay cambios durante la sesión en vivo, entonces no hay afectar en un papel. ¿Es posible?
Deep Soni
@DeepSoni, ¿podemos implementar atributos de Autorización personalizados para que podamos cumplir este requisito? Por favor sugiéralos para que podamos avanzar.
jishan siddique

Respuestas:

1

Esta es una pregunta complicada y no hay una respuesta correcta, pero hay varias formas de hacerlo. Primero, supondré que está utilizando autenticación sin estado utilizando un jwt basado en notificaciones. La forma más simple es escribir su propia Política que leerá los roles de los usuarios antes de cada solicitud, esta es la forma más sencilla de hacerlo y la más rápida de implementar.

internal class DatabaseRoles : IAuthorizationRequirement
    {
        public string Role { get; }

        public DatabaseRoles(string role)
        {
            Role = role;
        }
    }

    internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
    {
        private readonly UserManager<IdentityUser> userManager;

        public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            this.userManager = userManager;
        }

        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
        {
            //NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
            var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
            if (await userManager.IsInRoleAsync(user, requirement.Role))
            {
                context.Succeed(requirement);
            }
        }

    }

Pero esta solución no es tan eficaz porque requiere una llamada a la base de datos en cada solicitud. Esto está bien en cargas pequeñas pero puede crear problemas en el tráfico. La otra forma es volver a invocar todos los tokens de usuario cuando cambian los roles, pero esto es muy complicado. Estoy seguro de que si crea una tienda de acceso rápido para roles como redis, no habrá problemas para verificar cada llamada. Además, no recomiendo crear su propio almacenamiento de usuario porque es una pesadilla mantener y mantenerse actualizado en lo que respecta a los estándares de seguridad.

Filip Cordas
fuente
Hola, gracias por su respuesta. He intentado con su solución, pero en cada procesamiento de Index, Create, Edit o cualquier otra operación, este método está llamando y un problema es que si hay un panel de control público disponible, no hay un rol dado a ese módulo en particular, entonces no es visible para cualquier persona según su código.
Deep Soni
@DeepSoni Solo una cosa para señalar el código si es demostrativo no recomendaría usarlo tal como está. Debe personalizar esto para satisfacer sus necesidades. El punto de esto es como ejemplo de autenticación basada en recursos . La consulta debe verificar su base de datos con identificación de usuario con una consulta personalizada.
Filip Cordas
Gracias por la respuesta. Déjame probar con tu referencia y solución.
Deep Soni
Intento actualmente cuando hago referencia a Microsoft Doc para la autorización basada en recursos y luego IDocumentRepositoryno puedo usar. me muestra que instale UmbracoCMS. ¿Puedes por favor averiguarlo?
Deep Soni
O, por lo tanto, es una pregunta específica de UmbracoCMS. Realmente no estoy tan familiarizado con eso, podría ser mejor agregar la etiqueta y el código de UmbracoCMS que intentaste para que alguien con experiencia lo vea. Pero por lo que puedo decir, debería funcionar en cualquier lugar siempre y cuando realice la consulta correcta a UmbracoCMS.
Filip Cordas
-1

Si está utilizando Sesión / Cookie para almacenar los detalles del usuario conectado, puede vaciar los detalles cada vez que el Administrador realice cambios de rol. En cada acción puede verificar el rol en Sesión / Cookie y avanzar. Ahora, tan pronto como el usuario haga clic en cualquier lugar de la pantalla que golpee el controlador. Se comprobará la condición y se cerrará la sesión del Usuario cuando el objeto Sesión / Cookie esté vacío.

Bansari Soni
fuente
Hola @BansariSoni Gracias por la respuesta. No tiene sentido que elimine la sesión cada vez y solicite inicio de sesión al usuario. Es solo como un parche (fijo) en la aplicación, por lo que necesita una respuesta adecuada que sea incluso aceptable o alguna pista para descubrir la respuesta.
Deep Soni
Si el rol está en sesión, según yo solo puedo tener dos opciones: cambiar la variable de sesión o eliminarla. Aquí puede hacer otra cosa, como cuando el administrador cambia el rol, puede verificar si ese ID de usuario existe en la sesión, en caso afirmativo, que establecer un indicador en la sesión. Luego, puede crear un trabajo cron que actualice la página cada 5 minutos solo si este indicador en particular es verdadero.
Bansari Soni