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...
InformationsquelleAutor Burhan Uddin | 2012-11-02
Schreibe einen Kommentar