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
tant pis, j'ai raté AuthorizeCore lisez tout d'abord...
OriginalL'auteur Burhan Uddin | 2012-11-02
Vous devez vous connecter pour publier un commentaire.
Alors que je suis d'accord que la génération d'url en fonction des autorisations est probablement pas les meilleures pratiques, si vous voulez continuer, vous pouvez trouver les actes et de leurs attributs à l'aide de ces:
Récupérer "l'Action" méthodes:
Cela permet de récupérer une collection de méthode d'infos car il est possible d'avoir plusieurs classes de Contrôleur avec le même nom et plusieurs méthodes de même nom en particulier avec l'utilisation des zones. Si vous avez à vous soucier de cela, je vais laisser la désambiguïsation jusqu'à vous.
Récupérer les Autorisations de MyAuthorizationAttributes:
Enfin la AuthorizedAction extension: avertissement:Si vous n'avez plus d'un match pour une paire contrôleur/action ce que va donner la "autorisés" url si l'utilisateur est autorisé pour l'un d'eux...
Une Remarque sur la Génération d'Url Basé sur les Autorisations:
J'ai de l'état c'est probablement pas de meilleure pratique en raison de beaucoup de petites choses. Chacun peut avoir son propre niveau de pertinence en fonction de votre situation.
De contrôler le Rendu de la Page Via l'Action attributs d'Autorisation:
Modifier la
AuthorizedAction
méthode à unboolean
, puis utiliser le résultat pour contrôler le rendu de la page.Ensuite l'utiliser dans vos pages razor.
Comme je l'ai commenté dans une autre réponse, "Mon point est que si un MyAuthorization annotation Autorisation de changement de la valeur de l'action, je dois changer tout cela sur l'interface utilisateur où j'utilise l'url" c'est ce Que je ne veux pas faire.
Quel est exactement votre but avec le vide des url?
Je suis en train d'essayer de cacher l'url à l'action en vue de pages à partir de ces utilisateurs qui n'ont pas l'autorisation d'accéder à cette action. Je pourrais utiliser si le reste de rasoir vue, mais je vous demande de modifier ces conditions si l'autorisation d'une action modifications
Comme le besoin de changer de lame de rasoir le long avec les autorisations: Voir la dernière section de cette Réponse:Contrôler le Rendu de la Page Via l'Action attributs d'Autorisation:Html.AuthorizedAction prend le contrôleur et l'Action même Url.L'Action n'. Elle renvoie true si autorisé false dans le cas contraire. Comme les autorisations sur l'action de changement, il ne nécessite pas de mises à jour pour le rasoir pour les garder en ligne.
OriginalL'auteur Mr.Mindor
Je ne pense pas que vous devriez vérifier l'action des annotations à chaque fois que vous voulez créer une url avec l'Url.Action(). Si l'action est assurée avec la coutume d'autorisation de filtre, il ne sera pas exécutée pour l'utilisateur non-privilégié, quel est donc le point à cacher l'URL de cette action?
Au lieu de cela, vous pourriez mettre en œuvre la méthode d'extension sur HtmlHelper pour vérifier si l'utilisateur courant a la premission, comme:
Vous pouvez vous servir de l'aide à l'intérieur de la vue de masquer les boutons et les liens qui ne sont pas accessibles pour l'utilisateur actuel, comme:
Bien sûr, cette dissimulation de liens spécifiques est uniquement pour les fins de l'INTERFACE utilisateur - le réel, le contrôle d'accès est effectué par la coutume de l'autorisation de l'attribut.
Peut-être que le traitement de la paire (ControllerName,ActionName) pour une autorisation de définition ferait l'affaire. Chaque contrôleur+action serait de définir certains d'autorisation précis, description. Inconvénient c'est qu'il y aura beaucoup d'autorisations, mais vous pouvez les regrouper dans des rôles. Comme un avantage - vous n'aurez pas besoin d'annoter des actions avec les autorisations, car ils seraient auto-descriptif.
OriginalL'auteur PanJanek
Ma seule recommandation serait d'écrire une des extensions de méthodes sur
IPrincipal
à la place qui ressembleraitPuis votre code dans la vue/partiels est un peu plus lisible en termes de ce qu'est réellement en train de faire (ne pas faire n'importe quoi avec html, mais la validation d'un utilisateur), puis le code de la vue/partiels ressemble
Chaque MVC Page a la propriété WebViewPage.L'utilisateur pour l'utilisateur actuel.
Le problème avec votre dessein solution (et le lien à la sécurité conscients lien), c'est que la création du lien, et de l'Autoriser sur les contrôleurs pourraient être différents (et le mélange des responsabilités dans ce type de mode à MON avis est une mauvaise pratique). Par extension
IPrincipal
une nouvelle autorisation serait:Maintenant Autoriser à la fois vos attributs et de points de Vue utiliser les mêmes rôles et les autorisations données logique.
OriginalL'auteur Erik Philips