2010-01-28 8 views
4

Je cherche à sécuriser différentes zones de mon application MVC pour empêcher les utilisateurs standard d'accéder aux vues de type administrateur. Actuellement, si un utilisateur est connecté et qu'il tente d'afficher la page À propos de (dans le studio visuel), il se contente de les rediriger vers la page de connexion. Je préférerais que l'utilisateur soit informé qu'il n'a pas la permission d'afficher la page.Sécurité de traitement refusée dans ASP.NET MVC avec AspNetSqlRoleProvider

[Authorize(Roles="Admin")] 
public ActionResult About() 
{ 
    return View(); 
} 

Il semble superflu d'envoyer un utilisateur déjà authentifié à la page de connexion quand ils ne sont pas autorisés.

+0

http://stackoverflow.com/questions/1315524/is-it-possible-to-override-the-default-behavior-of-authorize-in-asp-net-mvc – womp

Répondre

3

Voici un attribut que j'ai créé et qui peut être utilisé pour diriger vers une action de sécurité non autorisée. il vous permet également de spécifier une raison qui sera transmise à l'action non autorisée sur le contrôleur de sécurité, que vous pouvez ensuite utiliser pour la vue.

Vous pouvez créer n'importe quel nombre de propriétés pour le personnaliser en fonction de votre application particulière, assurez-vous simplement de l'ajouter à RouteValueDictionary.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public sealed class ApplySecurityAttribute : ActionFilterAttribute 
{ 
    private readonly Permission _permission; 

    public ApplySecurityAttribute(Permission permission) 
     : this(permission, string.Empty) {} 

    public ApplySecurityAttribute(Permission permission, string reason) 
    { 
     _permission = permission 
     Reason = reason; 
    } 

    public string Reason { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!PermissionsManager.HasPermission(_permission)) // Put security check here 
     { 
      var routeValueDictionary = new RouteValueDictionary 
             { 
              { "controller", "Security" }, // Security Controller 
              { "action", "Unauthorized" }, // Unauthorized Action 
              { "reason", Reason }   // Put the reason here 
             }; 

      filterContext.Result = new RedirectToRouteResult(routeValueDictionary); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Voici le contrôleur de sécurité

public class SecurityController : Controller 
{ 
    public ViewResult Unauthorized(string reason) 
    { 
     var vm = new UnauthorizedViewModel { Reason = reason }; 

     return View(vm); 
    } 
} 

Voici la déclaration d'attribut sur un contrôleur que vous souhaitez sécuriser

[ApplySecurity(Permission.CanNuke, Reason = "You are not authorized to nuke!")] 

Voici comment PermissionsManager effectue la vérification pour voir si l'utilisateur a les permissions

public static class PermissionsManager 
{ 
    public static bool HasPermission(EZTracPermission permission) 
    { 
     return HttpContext.Current.GetCurrentUser().Can(permission); 
    } 
} 
Questions connexes