Wie erhalte ich benutzerdefinierte Anmerkungsattribute für eine Controller-Aktion in ASP.NET MVC 4?

Ich arbeite mit einem berechtigungsbasierten Autorisierungssystem für meine App in ASP.NET MVC. Hierfür habe ich ein benutzerdefiniertes Berechtigungsattribut angelegt

public class MyAuthorizationAttribute : AuthorizeAttribute
{
    string Roles {get; set;}
    string Permission {get; set;}
}

Damit kann ich einen Benutzer durch beide Rollen oder einen bestimmten Berechtigungsschlüssel mit Annotation für Aktionen wie autorisieren

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 überschreibe ich die AuthorizeCore () - Methode in der MyAuthorizationAttribute-Klasse mit ähnlicher Logik (Pseudocode)

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 dahin funktioniert es gut.

Jetzt benötige ich eine Art Erweiterungsmethode, damit ich in Ansichtsseiten dynamisch eine Aktions-URL generieren kann, die eine Aktions-URL basierend auf der Berechtigungslogik für das MyAuthorization-Attribut für die angegebene Aktion zurückgibt. Mögen

@Url.MyAuthorizedAction("Add", "User")

Die URL wird an "Benutzer / Hinzufügen" zurückgegeben, wenn der Benutzer eine Administratorrolle hat oder die Berechtigung "USER_ADD" (wie in den Attributen für die Aktion definiert) hat. Andernfalls wird eine leere Zeichenfolge zurückgegeben.

Aber nachdem ich einige Tage im Internet gesucht hatte, konnte ich es nicht herausfinden. :(

Bisher habe ich nur dies gefundenAktionslink "Sicherheitsbewusst"? Dies funktioniert, indem alle Aktionsfilter für die Aktion ausgeführt werden, bis sie fehlschlägt.

Es ist nett, aber ich denke, es wäre ein Overhead, alle Aktionsfilter bei jedem Aufruf der MyAuthorizedAction () -Methode auszuführen. Außerdem hat es mit meiner Version (MVC 4 und .NET 4.5) nicht funktioniert

Ich muss lediglich die Rolle und die Berechtigungen des authentifizierten Benutzers (werden in der Sitzung gespeichert) anhand der autorisierten Rolle und der Berechtigung für die angegebene Aktion überprüfen. Wie etwas wie folgendes (Pseudocode)

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 nach einer Lösung, die es mir ermöglicht, lange Zeit den Wert von Aktionsattributen zu ermitteln. Ich habe überhaupt nicht genug gute Ressourcen gefunden. Verpasse ich die richtigen Keywords? : /

Wenn mir jemand die Lösung liefern kann, wäre das wirklich eine große Hilfe. Vielen Dank im Voraus für die Lösungen

Antworten auf die Frage(3)

Ihre Antwort auf die Frage