Wie bekomme ich eigene annotation Attribute für eine controller-action in ASP.NET MVC 4?
Ich arbeite mit einer permission-based authorization system für meine app in ASP.NET MVC.
Für diese habe ich eine benutzerdefinierte Autorisierungs-Attribut
public class MyAuthorizationAttribute : AuthorizeAttribute
{
string Roles {get; set;}
string Permission {get; set;}
}
so, dass ich autorisiert einen Benutzer sowohl die Rolle oder eine bestimmte Berechtigung-Schlüssel (mit Anmerkung für Aktionen wie
public class UserController : Controller
{
[MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")]
public ActionResult Add()
[MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")]
public ActionResult Edit()
[MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")]
public ActionResult Delete()
}
dann habe ich überschreiben AuthorizeCore () - Methode in MyAuthorizationAttribute Klasse mit ähnlicher Logik(pseudo-code)
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(user not authenticated)
return false;
if(user has any role of Roles)
return true;
if(user has any permission of Permissions)
return true;
return false;
}
Bis zu diesem ist in Ordnung.
Nun brauche ich eine Art Verlängerung Methoden,, so dass ich dynamisch erzeugen, action-url im Seiten anzuzeigen, die zurückgegeben action-url, basierend auf MyAuthorization Attribut Genehmigung Logik für die gegebene Aktion. Wie
@Url.MyAuthorizedAction("Add", "User")
wird die url zurück zu "Benutzer/Hinzufügen", wenn der Benutzer mit admin-Rolle oder die Berechtigung von "USER_ADD" (definiert in den Parametern für die Aktion) oder zurückgeben, andernfalls ein leerer string.
Aber nach der Suche im internet für ein paar Tage konnte ich es nicht herausfinden. 🙁
Bisher habe ich nur gefunden, das "Security aware" - Aktion link? die arbeitet, indem es die Ausführung aller action-Filter für die Aktion, bis es ausfällt.
Ist es schön, aber ich denke, es wäre ein overhead ausführen alle action-Filter für jedes mal ich rufen Sie die MyAuthorizedAction () - Methode. Außerdem ist Es auch nicht funktioniert mit meiner version (MVC 4 und .NET 4.5)
Was alles, was ich brauche, ist zu prüfen, authentifizierte Benutzer, die Rolle, die Berechtigungen (werden gespeichert in der session) gegen berechtigte Rolle und Berechtigung für die angegebene Aktion. Wie etwas,, wie folgenden (pseudo-code)
MyAuthorizedAction(string actionName, string controllerName)
{
ActionObject action = SomeUnknownClass.getAction(actionName, controllerName)
MyAuthorizationAttribute attr = action.returnsAnnationAttributes()
if(user roles contains any in attr.Roles
or
user permissions contains any attr.Permissions)
{
return url to action
}
return empty string
}
Ich bin auf der Suche, die Lösung zu bekommen-action-Attribut-Wert für eine Recht lange Zeit, konnte gar nicht genug gute Ressourcen. Bin ich fehlen, die richtigen keywords? :/
Wenn jemand kann mir die Lösung, das wäre wirklich eine große Hilfe.
Vielen Dank im Voraus für die Lösungen
- Sie wollen, erstellen Sie Ihre Verknüpfungen auf Basis der Berechtigungen der Benutzer im Gegensatz zu validieren die Benutzer-Berechtigungen, wenn Sie auf den url?
- nevermind, ich vermisste AuthorizeCore ersten Lesen durch...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während ich damit einverstanden, dass der URL-Generierung basierend auf den Berechtigungen ist wahrscheinlich nicht die beste Praxis, wenn Sie wollen, fortsetzen, finden Sie die Aktionen und deren Attribute mithilfe dieser:
Abrufen 'Action' Methoden:
Dies ruft eine Sammlung von Methode infos, denn es ist möglich, mehrere Controller-Klassen mit dem gleichen Namen und mehrere Methoden mit dem gleichen Namen insbesondere mit der Nutzung von Flächen. Wenn Sie zu kümmern, lasse ich die Begriffsklärung bis zu Sie.
Abrufen der Berechtigungen vom MyAuthorizationAttributes:
Schließlich die AuthorizedAction Erweiterung: Warnung:Wenn Sie über mehr als eine übereinstimmung für eine bestimmte controller/action-paar geben wird, die 'autorisierte' - url, wenn der Benutzer autorisiert ist, für einen von Ihnen...
Einen Hinweis auf die Generierung von Urls auf der Grundlage von Berechtigungen:
Ich behaupte das ist wahrscheinlich nicht das beste wegen der vielen kleinen Dinge. Jeder kann seine eigenen level an Relevanz, je nach situation.
Controlling-Page-Rendering Über Aktion Autorisierungs-Attribute:
Ändern Sie die
AuthorizedAction
Methode, um eineboolean
, dann verwenden Sie das Ergebnis, dass die Kontrolle Seitenaufbau.Dann verwenden Sie diese in Ihrem Rasiermesser Seiten.
Ich glaube nicht, dass Sie sollten überprüfen, die Aktion Anmerkungen jedes mal, wenn Sie möchten, erstellen Sie eine url mit der Url.Aktion(). Wenn die Aktion gesichert mit custom authorization-filter es wird nicht ausgeführt, für nicht-privilegierten Benutzer, so was ist der Punkt in der URL versteckt, um diese Aktion?
Stattdessen könnten Sie implementieren extension-Methode auf HtmlHelper um zu überprüfen, ob der aktuelle Benutzer über die premission gegeben, wie:
Dann könnten Sie den Helfer innerhalb der Ansichten zu verbergen buttons und links, die nicht zugänglich sind für den aktuellen Benutzer, wie:
Natürlich das ausblenden von bestimmten links nur für UI-Zwecke - die eigentliche Steuerung des Zugangs erfolgt durch die benutzerdefinierte Autorisierungs-Attribut.
Meine einzige Empfehlung wäre, zu schreiben, eine Erweiterung Methoden auf
IPrincipal
stattdessen Aussehen würdeDann Ihren code in den views/partials ist die Ausgabe ein wenig mehr lesbar, im Sinne von dem, was es eigentlich tut (nichts zu tun mit html, aber die Validierung eines Benutzers), dann wird der code in den views/partials sieht aus wie
Jeder MVC Seite die Eigenschaft hat, WebViewPage.Benutzer für den aktuellen Benutzer.
Das problem mit Ihr gedachte Lösung (und der link zu den security-bewusst-link) ist, dass die Herstellung der Verbindung und die Autorisierung auf den Controllern anders sein könnte (und Misch-Aufgaben, die in dieser Art von Mode MEINER Meinung nach ist eine schlechte Praxis). Durch die Erweiterung
IPrincipal
eine neue Genehmigung würde wie folgt Aussehen:Nun auch Ihre Autorisierung Attribut und Ansichten verwenden die gleichen Rollen/Berechtigungen Daten-Logik.