Cómo implementar el control de acceso basado en permisos con Asp.Net Core

Estoy tratando de implementar el control de acceso basado en permisos con aspnet core. Para gestionar dinámicamente los roles y permisos de usuario (create_product, delete_product, etc.), se almacenan en la base de datos. El modelo de datos es comohttp://i.stack.imgur.com/CHMPE.png

Antes de aspnet core (en MVC 5) estaba usando una costumbreAuthorizeAttribute como a continuación para manejar el problema:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    private readonly string _permissionName { get; set; }
    [Inject]
    public IAccessControlService _accessControlService { get; set; }

    public CustomAuthorizeAttribute(string permissionName = "")
    {
        _permissionName = permissionName;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        var user = _accessControlService.GetUser();
        if (PermissionName != "" && !user.HasPermission(_permissionName))
        {
            // set error result
            filterContext.HttpContext.Response.StatusCode = 403;
            return;
        }
        filterContext.HttpContext.Items["CUSTOM_USER"] = user;
    }
}

Luego lo estaba usando en el método de acción como a continuación:

[HttpGet]
[CustomAuthorize(PermissionEnum.PERSON_LIST)]
public ActionResult Index(PersonListQuery query){ }

Además, estaba usando HttpContext.Items ["CUSTOM_USER"] en las vistas para mostrar u ocultar la parte html:

@if (CurrentUser.HasPermission("<Permission Name>"))
{

}

Cuando decidí cambiar el núcleo de aspnet, todo mi plan falló. Porque no había virtualOnAuthorization método en elAuthorizeAttribute. Intenté algunas formas de resolver el problema. Esos están abajo:

Uso de una nueva autorización basada en políticas (creo que no es adecuada para mi escenario)

Usando personalizadoAuthorizeAttribute yAuthorizationFilter(leí esta publicaciónhttps://stackoverflow.com/a/35863514/5426333 pero no pude cambiarlo correctamente)

Uso de middleware personalizado (cómo obtenerAuthorizeAttribute de la acción actual?)

Uso de ActionFilter (¿es correcto por motivos de seguridad?)

No pude decidir cuál es la mejor opción para mi escenario y cómo implementarlo.

Primera pregunta: ¿La implementación de MVC5 es una mala práctica?

Segunda pregunta: ¿Tiene alguna sugerencia para implementar aspnet core?

Respuestas a la pregunta(3)

Su respuesta a la pregunta