Ich versuche ein dynamisches Menü für meine ASP.NET MVC4 web application
zu erstellen. Während ich das Menü erstelle, möchte ich sicherstellen, dass Menüpunkte, auf die ein Benutzer keinen Zugriff haben sollte, nicht im Menü angezeigt werden.
Ich verwende die Formularauthentifizierung und das Attribut [Authorize]
, wobei jede Seite eine bestimmte Rolle erfordert.
Wie kann ich mit zwei Zeichenketten (Controller and Action)
und einem angemeldeten Benutzer feststellen, ob ein Benutzer Zugriff auf diese Controller-Aktion hat?
Alle meine Menüdaten sind in einer Datenbank gespeichert. Mein Plan, das Menü zu rendern, besteht darin, ein JSON-Objekt der Menüdaten zu erstellen und dieses in die Ansicht einzubetten. Dann verwende ich clientseitig Handlebars.js
und schließe das Menü JSON object
an eine Vorlage an.
Was ich versuche, ist die Überprüfung der Berechtigungen für einen bestimmten Controller / eine bestimmte Aktion für einen Benutzer, während ich die Menüdaten rendere. Mein erster Gedanke war, Reflektion zu verwenden und nach der Controller-Aktionsmethode zu suchen und nach dem Vorhandensein eines Authorize-Attributs zu suchen und zu überprüfen, ob der aktuell angemeldete Benutzer die erforderliche Rolle hat, um auf diese Seite zuzugreifen. Wenn nicht, würde der Menüeintrag nicht gerendert werden.
Ich bin immer zurückhaltend, reflection
zu verwenden, aber normalerweise ist dies ein einfacherer Weg, Dinge zu tun.
Ich habe ein sehr ähnliches Szenario implementiert. Der einzige Unterschied ist, dass meine Menüs in XML-Dateien gespeichert sind.
Da Sie Ihre Menüdaten in einer Datenbank gespeichert haben, schlage ich vor, dass Sie jedem Menüeintrag ein xml-Feld hinzufügen, das Sicherheitsinformationen enthält. oder, haben Sie eine neue Tabelle, die Menüelemente den Benutzern zuordnet. Die Tabelle kann wie folgt aussehen:
%Vor%Wenn Ihr Controller nun die Anforderung empfängt, die dazu führt, dass Menüelemente angezeigt werden, und Ihr Controller mit dem Autorize-Attribut versehen ist, empfängt er den Benutzer im HttpContext. Hier fragen Sie einfach die Datenbank nach passenden Menüpunkten ab und rendern das Menü entsprechend.
Erstellen Sie die Klasse namens Rolevalidation und fügen Sie den Code wie folgt hinzu:
%Vor%Fügen Sie diesen Code in den Anfang aller Controller ein * [AuthorizeRoles (Roles="SuperAdmin")]
Die Links werden vom json-Objekt erzeugt, das von einer Aktion und einem Controller kommt.
Das json-Objekt sollte eine Liste von Links haben (oder was auch immer benötigt wird, um den Menüeintrag zu implementieren), die Liste sollte nach Art der in der Datenbank gespeicherten Einstellungen generiert werden und jedem Benutzer mitteilen, welche Links angezeigt werden sollen.
Neben dem, wenn der Benutzer die URL hat, müssen Sie in diesem Fall
verwenden Sie können ein Autorize-Attribut verwenden, mit dem Sie eine Aktion vom Controller [Authorize(AuthorizationContext)]
dekorieren können, oder Sie können das authorize-Attribut für die benutzerdefinierte Autorisierung erweitern;
Sie können auch einige Konventionen in einem Dictionary definieren, in dem Sie definieren, dass eine Create-Aktion eines Controllers eine Berechtigung vom Typ create type a.s.o benötigt.
%Vor% und überschreiben Sie die Methoden OnAuthorization
und Authorize
von AuthorizeAttribute
und überprüfen Sie die Konvention, wenn die Aktion die im Wörterbuch definierten Konventionen einhält, oder überprüfen Sie eine bestimmte Bedingung, in der Sie Authorize(AuthorizationContext)
für die Aktion oder% co_de angeben %.
Mit dem Menü können Sie einen Autorisierungsdienst erstellen, in dem Sie die Rechte des aktuellen Benutzers zurückgeben und eine Klasse hinzufügen, die die Rechte des Benutzers enthält und Sie überprüfen das Modell beim Rendern des Modells, wenn ein Menüelement gerendert werden soll nicht.
Tags und Links c# asp.net asp.net-mvc-4 asp.net-membership