Wie implementiere ich die berechtigungsbasierte Zugriffssteuerung mit Asp.Net Core?

Ich versuche, eine auf Berechtigungen basierende Zugriffssteuerung mit Aspnet Core zu implementieren. Zur dynamischen Verwaltung von Benutzerrollen und Berechtigungen (create_product, delete_product usw.) werden diese in der Datenbank gespeichert. Datenmodell ist wiehttp: //i.stack.imgur.com/CHMPE.pn

Vor dem Aspnet Core (in MVC 5) habe ich custom @ verwendAuthorizeAttribute wie unten, um das Problem zu behandeln:

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;
    }
}

Damals habe ich es in der folgenden Aktionsmethode verwendet:

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

Zusätzlich habe ich HttpContext.Items ["CUSTOM_USER"] in Ansichten verwendet, um den HTML-Teil anzuzeigen oder auszublenden:

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

}

Als ich mich entschied, den Aspnet-Kern zu wechseln, scheiterte mein Plan. Weil es kein virtuelles @ gOnAuthorization Methode in derAuthorizeAttribute. Ich habe versucht, das Problem zu lösen. Das sind unten:

Neue richtlinienbasierte Autorisierung verwenden (meiner Meinung nach nicht für mein Szenario geeignet)

Mit customAuthorizeAttribute undAuthorizationFilter (ich habe diesen Beitrag gelesenhttps: //stackoverflow.com/a/35863514/542633 aber ich konnte es nicht richtig ändern)

Unter Verwendung einer benutzerdefinierten Middleware (So erhalten SieAuthorizeAttribute der aktuellen Aktion?)

ActionFilter verwenden (ist es aus Sicherheitsgründen korrekt?)

Ich konnte mich nicht entscheiden, welcher Weg für mein Szenario der beste ist und wie ich ihn umsetzen soll.

Erste Frag: Ist die Implementierung von MVC5 eine schlechte Praxis?

Zweite Frag: Haben Sie Vorschläge zur Implementierung von Aspnet Core?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage