2010-06-02 6 views
1

Nous sommes actuellement en train de réécrire notre application ASP.NET MVC de notre organisation qui a déjà été écrite deux fois. (Une fois MVC1, une fois MVC2). (Dieu merci, ce n'était pas prêt pour la production et trop mature à l'époque).ASP.NET MVC2 Access-Control: Comment faire une autorisation dynamiquement?

Cette fois-ci, de toute façon, il va être l'affaire réelle parce que nous appliquerons de plus en plus caractéristiques que le temps passe et les MVC1 et avec des scénarios de tests MVC2 a montré que nous sommes prêts à haut de gamme.

Jusqu'à présent, nous utilisions l'autorisation Contrôleur et Action avec AuthorizeAttribute.

Mais cela ne le fera plus car nos vues sont censées afficher des résultats différents en fonction de l'utilisateur connecté.

Cas d'utilisation: Disons que vous êtes une grande d'une ville et vous vous connectez à un logiciel géré fédéral et vous ne pouvez accéder et modifier les citoyens dans votre ville.

Si vous êtes autorisé à accéder à ces citoyens via une entrée dans une table MajorHasRightsForCity spécialisée contenant un MajorId et un CityId.

Ce que je pensais est quelque chose comme ceci:

Public ViewResult Edit(int cityId) { 
    if(Access.UserCanEditCity(currentUser, cityId) { 
     var currentCity = Db.Cities.Single(c => c.id == cityId); 
     Return View(currentCity); 
    } else { 
     TempData["ErrorMessage"] = "Yo are not awesome enough to edit that shizzle!" 
     Return View(); 
    } 

La classe statique Access ferait toutes sortes de contrôles et de retour soit vrai ou faux de c'est des méthodes. Cela implique que je devrais changer et éditer tous mes contrôleurs chaque fois que je change quelque chose. (Ce qui serait pénible, parce que tous les tests unitaires devraient être ajustés chaque fois que quelque chose change ..)

Est-ce que quelque chose comme ça fait allowed?

Répondre

2

C'est à peu près ce que je ferais pour une application de taille décente.

Je retournerais une vue d'erreur générique return View("Error"); si l'utilisateur n'a aucun accès de sorte que vous n'avez pas besoin de gérer le message d'erreur sur tous les View.

Conceptuellement, ceci (le Controller) est où la logique déterminant ce que View pour retourner devrait mentir. Il arrête la saignée logique dans le View.

Vous pouvez abstraites certaines parties dépendant du rôle de la page à une vue partielle de garder l'encombrement vers le bas:

<% if (User.IsInRole("Admin")) { %> 
     Html.RenderPartial("AdminPanel"); 
<% } %> 
2

Avez-vous pensé à écrire votre propre filtre d'action Attribut?

De cette façon, vous pouvez simplement décorer votre contrôleur avec l'attribut et vous épargner beaucoup de copier-coller, plus si vous avez besoin de le changer, puis le faire en un seul endroit.

Si vous obtenez le code source de MVC à partir de Codeplex, vous pouvez voir comment l'attribut Authorize est fait et le modifier.