Wie Permission-basierte Zugriffskontrolle mit Asp.Net Core implementieren

Bin ich versucht zu implementieren-permission-based access control mit aspnet-core. Für die dynamische Verwaltung von Benutzerrollen und Berechtigungen(create_product, delete_product etc.), Sie werden in der Datenbank gespeichert. Daten Modell wie http://i.stack.imgur.com/CHMPE.png

Bevor aspnet-core (im MVC 5) ich war mit custom AuthorizeAttribute wie unten zu behandeln Sie das Problem:

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

Dann war ich mit ihn in der action-Methode wie folgt:

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

Zusätzlich war ich mit HttpContext.Posten["CUSTOM_USER"], in Ansichten ein-oder ausblenden von html-Teil:

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

}

Wenn ich mich entschieden habe zu wechseln aspnet-core, mein plan war fehlgeschlagen. Da gab es keine virtuellen OnAuthorization Methode in der AuthorizeAttribute. Ich habe versucht, einige Möglichkeiten, um Probleme zu lösen. Diese sind unten:

  • Mit neuen policy-basierte Autorisierung(ich denke, es ist nicht geeignet für
    meine scenerio)
  • Mithilfe von benutzerdefinierten AuthorizeAttribute und AuthorizationFilter(ich Las dieses
    post https://stackoverflow.com/a/35863514/5426333 aber ich konnte es nicht ändern, es richtig)
  • Mithilfe von benutzerdefinierten middleware(wie man AuthorizeAttribute des aktuellen
    Aktion?)
  • Mit ActionFilter(ist es richtig für die Sicherheit Zweck?)

Ich konnte nicht entscheiden, welcher Weg der beste für meine scenerio und wie es zu implementieren.

Erste Frage: Ist MVC5 Umsetzung schlechte Praxis?

Zweite Frage: haben Sie schlagen vor, zu implementieren aspnet-core?

Kommentar zu dem Problem
Warum denkst du, policy-basierte Autorisierung nicht geeignet ist für Ihren Fall? Sie können immer noch PermissionRequirement Implementierung von IAuthorizationRequirement und einen handler, fügen Sie es anschließend als - Optionen.AddPolicy("PersonList", policy => Politik.Anforderungen.Add(new PermissionRequirement("PersonList"))); Kommentarautor: Tseng
weil, ich möchte, um Benutzer-Berechtigungen aus der Datenbank. Kommentarautor: adem caglin
Nichts hindert Sie daran, das Sie innerhalb der Prozedur. Nur injizieren Sie Ihr Kontext/repository/service/was auch immer Sie benötigen in Ihre Anforderung-handler: docs.asp.net/en/latest/security/authorization/... Kommentarautor: Tseng
wenn die Anwendung über 500 Berechtigungen, brauche ich zum erstellen 500 Anforderungen und Prozeduren? Kommentarautor: adem caglin
Nein, es ist 1 Voraussetzung und 1 hf (obwohl eine Anforderung kann behandelt werden, indem Sie mehr als 1-handler). Sie würde müssen nur 500 politische Registrierungen, die man nur in einer Schleife Kommentarautor: Tseng

InformationsquelleAutor der Frage adem caglin | 2016-04-06

Schreibe einen Kommentar