ASP.NET MVC Personnalisé Autorisation
J'ai une question à propos de la coutume de l'autorisation dans la MVC.
J'ai un site que je veux limiter l'accès à certaines pages, en fonction de leur appartenance à un groupe. Maintenant, j'ai vu des tonnes d'exemples sur la façon de le faire que si il y a un seul groupe admin et un seul groupe d'utilisateurs, par exemple, mais pas des exemples à un troisième niveau.
Par exemple, seuls les utilisateurs de l'entreprise peut afficher les commandes de leur propre entreprise (et chaque société a ses propres administrateurs, etc). Ces sociétés sont stockées dans une base de données. Donc, j'ai vu des façons de le faire personnalisé autorisation, en remplaçant le AuthorizeCore
méthode sur la AuthorizeAttribute
, mais je ne sais pas comment accéder aux paramètres passés dans la manette pour voir si l'utilisateur a accès à la commande (numéro de commande, par exemple).
Est-ce vraiment le meilleur endroit pour faire le chèque, ou ce devrait juste être traitées directement à partir de la méthode du contrôleur?
Vous devez vous connecter pour publier un commentaire.
La AuthorizationContext (paramètre OnAuthorize) permet d'accéder au Contrôleur, RouteData, HttpContext, etc. Vous devriez être en mesure de les utiliser dans une coutume d'autorisation de filtre pour faire ce que vous voulez. Ci-dessous un exemple de code à partir d'un RoleOrOwnerAttribute dérivé de AuthorizeAttribute.
Si l'autorisation est vraiment dynamique, je voudrais y faire face dans le contrôleur. J'ai une action où je le faire - vous pouvez revenir à une HttpUnauthorizedResult pour rediriger vers la page de connexion, ou vous pouvez afficher un message d'erreur personnalisé de votre point de vue.
Je n'ai pas la redirection par défaut à la page de connexion lorsque quelqu'un est déjà connecté, mais pas dans le bon rôle. C'est très déroutant pour l'utilisateur.
Ma réponse n'est pas très grande, parce qu'il tue les tests unitaires, mais je suis en tirant les valeurs de
System.Web.HttpContext.Current.Session
. Le singleton est disponible tout au long du projet. En économisant de l'utilisateur en cours de session, vous pouvez y accéder à partir de n'importe où, y compris les classes utilitaires commeAuthorizeAttribute
.Je serais ravi de voir une unité-testable solution.