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.
Authorize(Roles ="Staff")
se asegura de que el usuario con rolStaff
solo 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?