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
undAuthorizationFilter
(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?
PermissionRequirement
Implementierung von IAuthorizationRequirement
und einen handler, fügen Sie es anschließend als - Optionen.AddPolicy("PersonList", policy => Politik.Anforderungen.Add(new PermissionRequirement("PersonList")));
InformationsquelleAutor der Frage adem caglin | 2016-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf die Kommentare, hier ein Beispiel, wie die policy-basierte Autorisierung:
Und registrieren Sie es in Ihrem
Startup
Klasse:Und schließlich in der Steuerung
Der Vorteil dieser Lösung ist, dass Sie können auch mehrere Handler für einen Bedarf, d.h. wenn die erste erfolgreich, die zweite handler können feststellen, es ist ein fehl, und Sie können es verwenden, mit resource-based authorization mit wenig zusätzlichen Aufwand.
Den policy-basierten Ansatz ist die bevorzugte Art und Weise, es zu tun durch die ASP.NET Core-team.
Vom blowdart:
InformationsquelleAutor der Antwort Tseng
Für eine Lösung, die nicht erforderlich ist, fügen Sie eine Richtlinie für jede Berechtigung finden Sie unter meine Antwort für eine andere Frage.
Er lässt Sie dekorieren Sie Ihr Controller und Aktionen mit benutzerdefinierten Attribute, die Sie möchten, und greifen Sie in Ihre AuthorizationHandler.
InformationsquelleAutor der Antwort Shawn