2009-11-05 9 views
2

En examinant les formulaires d'autorisation/d'authentification, j'ai constaté qu'il est possible d'autoriser les rôles en ajoutant un tableau de rôles à un formulaire FormsAuthenticationTicket. De cette façon, je peux écrireAutorisation/authentification basée sur les rôles/permissions?

User.IsInRole(role from database) 

Mais est-il possible de faire la même chose avec des autorisations sur un rôle comme:

if (User.IsInRole(role from database)) { 
    if (User.CanRead()) { 
     //--- Let the user read 
    } 
    if (User.CanWrite()) { 
     //--- Let the user write 
    } 
} 

J'ai lu quelques articles et post forum où l'autorisation est ajouté à la matrice au lieu des rôles, entraînant l'utilisation

User.IsInRole(permission from database) 

Cependant ce n'est pas la même chose. Espérons que quelqu'un puisse donner son avis sur ce sujet, jeter un lien vers un article ou, mieux encore, un exemple de code.

+0

Pourquoi la restauration? Vous ne savez pas ce que cela a à voir avec Authentication (tag), car User.CanRead et User.CanWrite sont tous deux des méthodes d'autorisation. http://www.duke.edu/~rob/kerberos/authvauth.html – mxmissile

Répondre

4

Vous feriez mieux de changer votre façon de penser à un rôle. Utilisez le terme "permission" ou "claim" si cela vous aide. Ensuite, créez tous les rôles dont vous avez besoin et associez un utilisateur donné à tous les rôles nécessaires.

Un utilisateur peut appartenir à plusieurs rôles. De cette façon, le code simple suivant fonctionnera correctement et vous n'avez pas besoin de créer votre propre façon de fonctionner.

if(User.IsInRole(someRole) && User.IsInRole(someOtherRole)) 
{ 
    // do something 
} 

Vous pouvez faire des méthodes d'extension en C# pour le rendre plus lisible aussi:

if(User.IsInSomeRoleAndOtherRole()) 
{ 
    // do something 
} 

Les méthodes d'extension peuvent ressembler à quelque chose comme ce qui suit. Créez une nouvelle classe avec le code suivant, puis incluez l'espace de noms de classe dans votre code et vous pouvez utiliser la méthode d'extension comme indiqué ci-dessus.

using System.Security.Principal; 

namespace MyCompany 
{ 
    public static class MyExtensions 
    { 
    public static bool IsInSomeRoleAndOtherRole(this IPrincipal principal) 
    { 
     if (!principal.IsInRole("someRole")) 
     return false; 

     if (!principal.IsInRole("someOtherRole")) 
     return false; 

     return true; // the user meets the requirements 
    } 
    } 
} 
+0

+1 Ouais c'est plutôt cool. – griegs

+0

Ok, je vais le faire. Pouvez-vous me montrer comment faire une méthode d'extension? –

+0

Merci beaucoup; o) –

Questions connexes