Ich möchte einem Controller eine Autorisierung für mehrere Rollen gleichzeitig hinzufügen.
Normalerweise würde das so aussehen:
[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}
Aber ich habe meine Rollen in consts gespeichert, da sie sich irgendwann ändern oder erweitern könnten.
public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";
Ich kann dies nicht tun, da die Zeichenfolge zur Kompilierungszeit bekannt sein muss:
[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}
Gibt es eine Möglichkeit, das Problem zu umgehen?
Ich könnte eine Konstante schreiben, die einfach "RoleA, RoleB, RoleC" enthält - aber ich mag keine magischen Strings und dies ist ein magischer String. Das Ändern des Namens einer Rolle und das Vergessen, die kombinierte Zeichenfolge zu ändern, wäre eine Katastrophe.
Ich benutze MVC5. Die ASP.NET-Identität und die Rolle sind zur Kompilierungszeit bekannt.
c#
asp.net-mvc
authorization
Christian Sauer
quelle
quelle
Antworten:
Versuchen Sie, ein benutzerdefiniertes Berechtigungsattribut wie dieses zu erstellen .
Angenommen, Ihre Rollen sind für mehrere Controller gleich, erstellen Sie eine Hilfsklasse:
Dann benutze es so:
quelle
Stellen Sie sicher, dass Sie Ihre benutzerdefinierte Attributklasse deaktivieren
System.Web.Mvc.AuthorizeAttribute
und NICHTSystem.Web.Http.AuthorizeAttribute
.Ich bin auf das gleiche Problem gestoßen. Sobald ich es geändert habe, hat alles funktioniert.
Möglicherweise möchten Sie Ihrer benutzerdefinierten Attributklasse auch Folgendes hinzufügen:
quelle
System.Web.Http.AuthorizeAttribute
STATTSystem.Web.Mvc.AuthorizeAttribute
Der beste und einfachste Weg, um dieses Problem zu lösen, besteht darin, Rollen im Attribut "Autorisieren" zu verketten.
mit CustomRole eine Klasse mit konstanten Zeichenfolgen wie folgt:
quelle
Was ich getan habe, ist die Antwort in @Tieson
Ich ändere seine Antwort ein wenig. Anstelle von string.Join warum nicht in Liste konvertieren?
Hier ist meine Antwort:
Überprüfen Sie anschließend, ob die Rolle gültig ist, und überschreiben Sie OnAuthorization
Und da Sie es haben, wird jetzt überprüft, ob die Rolle zum Zugriff auf die Ressource berechtigt ist
quelle
Ich bin der Meinung, dass ein benutzerdefiniertes Berechtigungsattribut für dieses Problem übertrieben ist, es sei denn, Sie haben eine große Anzahl von Rollen.
Da die Zeichenfolge zur Kompilierungszeit bekannt sein muss, erstellen Sie eine statische Rollenklasse, die öffentliche Zeichenfolgen der von Ihnen definierten Rollen enthält, und fügen Sie dann durch Kommas getrennte Zeichenfolgen mit bestimmten Rollen hinzu, die Sie autorisieren möchten:
Und dann können Sie das Authorize-Attribut wie folgt für die Controller-Klasse oder die Controller-Methode (oder beides) verwenden:
quelle
ADMIN_OR_VIEWER
Rolle in der Aktion beispielsweise redundant, da Sie nicht zurCreate
Methode gelangen dürfen, wenn Sie dieADMIN
Rolle noch nicht haben . In diesem FallVIEWER
kann dieCreate
Methode niemals aufgerufen werden.