ASP.Net MVC comment faire pour déterminer si un utilisateur peut accéder à une URL?
Donc, je lisais une autre question relative à la connexion de la boucle lorsque vous avez une connexion de l'utilisateur, le retour à une URL qui ils pourraient ne pas avoir accès à après la connexion (ie. un admin de la page, et l'utilisateur se connecte avec un compte normal).
La solution sous WebForms semble être d'utiliser le UrlAuthorizationModule.CheckUrlAccessForPrincipal
méthode. Cependant cela ne fonctionne pas pour les Url va Méthodes d'Action sécurisé avec l'Autoriser Attribut. J'ai pensé que je pouvais travailler sur la méthode de l'URL pointant vers et de réfléchir sur elle pour résoudre mon problème mais je n'arrive pas à trouver comment je peux obtenir cette information de la table de routage.
Quiconque a déjà travaillé avec, ou une solution pour cela? Si je peux obtenir des informations sur l'itinéraire à partir d'une URL, je pense que je pourrais travailler le reste, mais si quelqu'un a une solution générique - ie. certains cachés méthode s'apparente à l'avant de parler d'un pour MVC, alors ce serait vraiment génial.
Je ne demande pas comment faire pour vérifier si l'Utilisateur a accès à une Action de Contrôleur de paire. J'ai d'abord et avant tout besoin de travailler sur la façon d'obtenir la paire Contrôleur/Action de la RouteTable basé sur l'URL. La raison de toute l'histoire de fond, est dans le cas où il existe un équivalent à UrlAuthorizationModule.CheckUrlAccessForPrincipal
pour MVC.
OriginalL'auteur kastermester | 2010-02-04
Vous devez vous connecter pour publier un commentaire.
Quel est le problème que vous essayez de résoudre? Il semble que vous pouvez être dirigé vers le bas un chemin vers une solution complexe qui pourraient utiliser une solution simple à la place.
Si un utilisateur n'a pas les permissions pour accéder à la page après la connexion, vous êtes désireux de non-connecté aux utilisateurs d'accéder à une page, tandis que les utilisateurs connectés aller à une autre page?
Si c'est le cas, je pourrais être tenté de créer un autre contrôleur pour de tels scénarios et de les rediriger vers ce contrôleur n'importe où l'utilisateur n'a pas accès. Ou si vous utilisez votre propre Contrôleur de base je mettrais la fonctionnalité.
Puis le contrôleur pourrait présenter la vue souhaitée. Par exemple, si un utilisateur tente d'accéder à une page, ils pourraient être redirigé vers une page d'erreur générique. Si l'utilisateur est connecté, ils pourraient être redirigé vers une non autorisé page.
Ceci est très similaire à Robert de réponse.
Voici un squelette de base d'un contrôleur de base.
Puis dans disons une AdminController (qui hérite de BaseController) action
OriginalL'auteur 37Stars
jfar la réponse ci-dessus mis à jour pour MVC 4:
OriginalL'auteur bjrichardson
J'ai porté et piraté ce code à partir de la MvcSitemap:
On pourrait utiliser une mise en cache, mais pour mon cas c'était une optimisation prématurée.
Pour ce faire, vous devrez intercepter la demande avant la méthode de contrôleur en cours d'exécution. Pour des idées sur la façon de le faire, regarde ici: stackoverflow.com/questions/2122459/...
Juste ce dont j'avais besoin. J'ai été à la recherche haute et basse pour celui-ci. Merci beaucoup!
Ressemble ActionDescriptor.GetFilters() est Obsolète maintenant. Pas sûr de savoir comment ce code devrait fonctionner avec le Système.Web.Mvc.FilterProviders.
remplacer avec
FilterProviders.Providers.GetFilters(controllerContext, actionDescriptor).Select(f => f.Instance).OfType<IAuthorizationFilter>()
OriginalL'auteur jfar
Cela va probablement son controversé, mais j'ai de sécurité de contrôle au début de chaque méthode de contrôleur, à l'intérieur de la méthode:
La raison pour laquelle je ne pas utiliser le
[Authorize]
attributs de cette est que vous ne pouvez pas passer d'une carte d'identité ou toute autre information d'identification, à l'attribut au moment de l'exécution.OriginalL'auteur Robert Harvey
Dans mon application, j'ai créé un filtre personnalisé dérivé de AuthorizeAttribute, de sorte que tout accès non autorisé il suffit d'aller à AccessDenied page. Pour les liens, j'ai remplacer le Html.ActionLink avec un helper Html.SecureLink. Dans ce helper extension, j'ai vérifier rôles de l'utilisateur l'accès à controller/action contre la base de données. Si il/elle dispose de l'autorisation, le lien de retour sinon renvoyer le lien de texte avec remarques spéciales (peut-être l'image/coloration/js)
OriginalL'auteur Rocky Zairil
Pourquoi ne pas attribuer vos méthodes de contrôleur avec l'exigence en matière de sécurité.
J'ai écrit un attribut pour ce faire comme suit:
OriginalL'auteur Remotec
j'ai juste passé un certain temps à la mise en œuvre de @jfar de la solution (mise à jour pour les non-déconseillé GetFilters() de la version), et puis j'ai réalisé que je ne peux ignorer tout cela.
dans mon cas (et je suppose que la plupart des cas) j'ai un custom AuthorizationAttribute à mettre en œuvre l'autorisation qui à son tour appelle mon service d'autorisation pour effectuer le niveau d'accès determinenation.
Donc, à mon helper html pour générer des liens de menu, j'ai sauté à droite pour le service auth:
*l'utilisateur est déterminé à l'intérieur de l'authentification des clients du service de
*peut également ajouter un peu de comportement pour un accès en lecture seule. c'est agréable parce que mon service de demenagement se charge de la mise en cache, donc je n'ai pas à vous soucier de la performance.
OriginalL'auteur Sonic Soul