2009-05-17 9 views
1

J'apprécierais vraiment des commentaires sur ce que je suis en train de réaliser:ASP.Net MVC et affiliations

Le problème:

  1. Je voudrais d'autoriser un utilisateur de ma demande à une seule action sur le contrôleur. Par exemple: un utilisateur peut effectuer l'action "save" sur ma classe de contrôleur s'il a l'autorisation requise.
  2. Dans le projet sur lequel je travaille, la création des rôles & leur autorisation est effectuée par l'équipe de déploiement du client & qui n'est pas sous mon contrôle. Donc, je programme à un "point de contrôle" qui peut être assigné à un rôle/utilisateur, alors que mon application doit seulement vérifier ce point de contrôle.
  3. Comment obtenir un concept de point de contrôle dans ASP.Net MVC? Plus spécifiquement, comment activer/désactiver les boutons sur la vue en fonction de l'autorisation de l'utilisateur sur le contrôleur?

Ma solution:

  1. Ref .: http://weblogs.asp.net/fredriknormen/archive/2008/03/12/asp-net-mvc-framework-2-interception-and-creating-a-role-action-filter.aspx - comme point de départ
  2. Au lieu de créer un filtre de rôle comme expliqué dans le lien ci-dessus, j'aurais une classe ControlPointFilter qui obtiendrait la modèle & faire le contrôle d'autorisation.
  3. Le problème que j'ai est dans la classe View & Je passe actuellement la collection de points de contrôle à laquelle l'utilisateur a accès dans la collection ViewData [].
  4. Dans la classe View, je vérifie si le point de contrôle associé est présent dans la collection ViewData (ce que je n'aime pas - veut garder le code au minimum dans la classe View)
  5. L'autre problème est - alors que le nom du point de contrôle actuel est défini dans l'attribut de la classe de contrôleur, où/comment puis-je transmettre ces attributs à la vue & tout en gardant la vue propre?

Espérons que cela aide & à apprécier votre temps et vos efforts pour y répondre!

Ensoleillé

Répondre

1

Une solution possible est de traduire les points de contrôle en vue des attributs dans vos actions de contrôleur (peut-être ce sont les mêmes choses, cependant, ce n'est pas clair d'après votre question). L'idée serait que votre point de contrôle se traduise par des directions de vue significatives telles que "AllowEdit", "AllowSave", "AllowDetailedView", etc. Ceux-ci deviendraient des entrées dans ViewData.

Utilisez une classe de contrôleur de base pour étendre Controller et lui donner une collection ControlPoint. Faites en sorte que votre filtre remplisse cette collection dans le contrôleur.La méthode OnActionExecuted du contrôleur de base utilise cette collection et, dans le cas d'un ViewResult, remplit ViewData avec les valeurs appropriées pour la collection de directives de vue. Les actions de contrôleur individuelles peuvent également utiliser la collection ControlPoint pour déterminer si elles doivent fournir des données pour des vues individuelles, selon que la vue affiche ou non des données supplémentaires. À votre avis, ne comptez pas sur les points de contrôle eux-mêmes, mais sur les directions d'affichage déterminées par le contrôleur de base. De cette façon, vous avez découplé les vues de la logique du point de contrôle. Les vues fonctionnent uniquement sur les données d'affichage de manière significative pour la vue, et non sur les données d'autorisation ayant une signification dans le contexte de l'application. La vue ne se souciera pas de savoir comment ou pourquoi la directive particulière est définie, elle n'a besoin que d'un rendu approprié en fonction de la valeur de la directive.

+0

Salut tvanfosson - cette solution a l'air bien et je vais certainement essayer. Je ne suis pas encore clair comment un attribut sur le contrôleur peut être passé à la classe de base du contrôleur pour l'ajouter à une collection de points de contrôle. Peut-être que je manque un point ici - mais je crois qu'en utilisant votre solution, j'aurais un code comme: base.ControlPointCollection.Add ("my_control_point"); alors que le même aurait déjà été mis en tant qu'attribut à la méthode d'action (ou devrais-je PAS utiliser un attribut dans ce cas?) Ensoleillé – Sunny

+0

Si vous dérivez de AuthorizeAttribute, le AuthorizationContext qui est un paramètre de la méthode OnAuthorize contiendra une référence au contrôleur. Transmettez-le à la classe de contrôleur de base (en utilisant "as" et vérifiez null) et vous pouvez ensuite accéder à ses propriétés. Votre collection devra être publique. – tvanfosson

0

Hmm, pourriez-vous pas créer simplement un système de modèles, d'attribuer des rôles aux utilisateurs? C'est à dire. Créez un modèle d'utilisateur "Utilisateur avancé" disposant des rôles "CustomerService" et "ConfigurationEditor", puis utilisez le système de rôles comme d'habitude (par exemple, Roles.IsUserInRole (nom d'utilisateur, nom_rôle))?

Pour les actions, vous utilisez ensuite

[Authorized(Roles="CustomerService,CustomerServiceAdmin")] 
public ActionResult Edit(...) 
{ 
} 

Pour les vues, vous utilisez

<% if (Roles.IsUserInRole(Context.User.Name, "CustomerService")) %> 
+0

Salut Soraz - merci beaucoup pour la réponse. Ouais - Je pourrais faire ce que vous suggérez, mais il y a un couplage entre le View & Controller et je voudrais éviter cela car je créerais View qui pourrait être partagé et ne changerait que sur les différentes actions qui pourraient être effectuées . – Sunny