Comment obtenir des annotations personnalisées attributs pour une action de contrôleur dans ASP.NET MVC 4?

Je travaille avec une autorisation en fonction du système d'autorisation pour mon application dans ASP.NET MVC.
Pour cela, j'ai créé une coutume autorisation attribut

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

afin que je puisse autoriser un utilisateur à la fois de rôle ou d'une autorisation spécifique de la clé avec l'annotation pour les actions de

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()
}

puis-je remplacer AuthorizeCore() la méthode en MyAuthorizationAttribute classe avec la même logique(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;
}

Jusqu'à ce fonctionne bien.

Maintenant j'ai besoin d'une sorte de méthodes d'extension, de sorte que je peux générer dynamiquement url de l'action en vue de pages qui sera de retour l'url de l'action fondée sur MyAuthorization attribut logique d'autorisation pour l'action. Comme

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

sera de retour l'url "Utilisateur/Ajouter" si l'utilisateur a au rôle d'administrateur ou dispose de l'autorisation de "USER_ADD" (tel que défini dans les attributs de l'action) ou renvoie la chaîne vide sinon.

Mais après une recherche sur internet pour quelques jours, je ne pouvais pas le comprendre. 🙁

Jusqu'à présent j'ai trouvé que ce "De sécurité de" lien d'action? qui fonctionne par l'exécution de tous les filtres d'actions pour l'action jusqu'à ce qu'il échoue.

C'est sympa, mais je pense que ce serait une surcharge pour l'exécution de tous les filtres d'actions pour chaque fois que j'appelle le MyAuthorizedAction() la méthode. En outre, Il ne fonctionne pas avec ma version (MVC 4 et .NET 4.5)

Ce que j'ai besoin de vérifier authentifié rôle de l'utilisateur, les autorisations (sera stocké dans la session) contre autorisé d'autorisation et de rôle pour l'action. Comme quelque chose que la suite (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
}

Je suis à la recherche de la solution de l'obtention de l'action des attributs de la valeur pour un temps assez long, ne pouvait pas trouver assez de bonnes ressources à tous. Suis-je manquer les bons mots-clés? :/

Si quelqu'un peut me donner la solution ce serait vraiment d'une grande aide.
Merci d'avance pour les solutions

Vous souhaitez créer vos liens sur la base des autorisations d'utilisateurs plutôt que de valider les autorisations de l'utilisateur quand ils ont frappé l'url?
tant pis, j'ai raté AuthorizeCore lisez tout d'abord...

OriginalL'auteur Burhan Uddin | 2012-11-02