0

J'ai actuellement un système où il y a une table d'utilisateur, une table de rôle et une table d'association de rôles d'utilisateur, où un utilisateur peut être associé à plusieurs rôles (comme Admin, BasicUser, etc.). Je suis capable d'autoriser des méthodes d'action basées sur ces rôles. Cela vient du cadre d'identité.Comment définir un privilège dans un rôle dans ASP.NET MVC?

Maintenant, je veux ajouter la prise en charge des privilèges afin que les méthodes d'action puissent être restreintes en fonction de celles-ci, plutôt que par des rôles. Par exemple, dans un contrôleur, je peux avoir une action HTTPPost que seule une personne avec un privilège "Write" devrait être en mesure d'effectuer avec succès.

De quels changements ai-je besoin pour attribuer des privilèges aux rôles? I.E., je veux sélectionner le rôle "Admin" pour avoir les privilèges "Write" et "Read", tandis qu'un rôle "BasicUser" ne se verra attribuer qu'un privilège "Read". De cette façon, un administrateur peut accéder à toute méthode autorisée par le privilège Write, contrairement à BasicUser.

Si je devais créer une autre table appelée "Privilege" et une table d'association entre cela et les rôles, et le code pour définir les privilèges dans un rôle, comment puis-je utiliser le privilège comme un filtre? Ainsi, par exemple, l'action ci-dessous ne doit être autorisée à être exécutée par un utilisateur que dans un rôle auquel le privilège "Write" est attribué.

[Write] 
public ActionResult Create() 
{ 
    return View(); 
} 

Merci.

Répondre

1

De la même façon les AuthorizeAttribute œuvres, vous pouvez créer un attribut d'autorisation personnalisée héritant de ce:

public class AuthorizePrivilegeAttribute : AuthorizeAttribute 
{ 
    // Custom property 
    public string Privilege { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // Reusing default authentication. 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     {     
      return false; 
     } 

     return YourCustomCode.HasPrivilege(this.Privilege))  
    } 
} 

Ensuite, en utilisant sur le dessus de votre méthode:

[AuthorizePrivilege(Privilege = "Write")] 
public ActionResult Create() 
{ 
    return View(); 
} 
+0

Merci pour le point de départ. En utilisant cette technique, la classe YourCustomCode contiendra-t-elle le code qui vérifie si l'association entre le rôle et le privilège? C'EST À DIRE. tout le code de la base de données? – ITWorker

+0

Exactement! N'oubliez pas de marquer comme réponse si vous êtes satisfait de la réponse. – bsoulier