2016-06-24 1 views
0

TL; DRC# MVC simple authentification personnalisée avec les rôles

EDit

Fondamentalement, je veux juste dire à une fonction: Ok, je l'ai vérifié cet utilisateur moi-même, il est ok. Maintenant stocker des données arbitraires sur lui et créer une session pour lui qui lui donne des autorisations pour accéder à certaines parties de mon application.

quelque chose de ce genre:

logInUserFrameworkFunction(new UserStruct(int id, string username, RolesEnum[] roles)); 

Et que tout est géré en arrière-plan pour faire [Authorize(Roles = RolesEnum.Admin | RolesEnum.Manager)] travail d'attribut.

Je pourrais faire cela avec des séances moi-même mais je voudrais sauter cette partie: D


Je joue avec MVC et Entity Framework, et maintenant je voudrais mettre en œuvre l'authentification utilisateur simple avec des rôles.

je User classe/table de ma base de données qui ressemble à ceci:

public class User { 
    int ID; 
    string Email; 
    string Password; 
    Role Role; 
... 
} 

Et Role classe qui ressemble à ceci:

public class Role { 
    int ID; 
    RoleType Type; // this is an Enum 
} 

public Enum RoleType { 
    visitor, employee, admin 
} 

Maintenant, la vérification dans le contrôleur de connexion si l'utilisateur avec le nom d'utilisateur et le mot de passe spécifiés est facile, je fais juste quelque chose comme ceci:

[HttpPost] 
    public ActionResult LogIn(LogIn login) { 
     // If credentials are valid 
     if(new UserManager().IsValid(login.Username, login.Password)) { 
      var user = db.getUserByEmail(login.Username); 
... 

Je pourrais facilement stocker l'utilisateur ID et Role en session et que vérifier les informations d'identification en appelant certains function sur chaque contrôleur pertinent, mais je veux utiliser une partie de C# et caractéristiques MVC.


Chose est que je préfère le faire avec des attributs, mais je ne sais pas comment.

C'est ce que je l'imaginais ressemblerait à ceci:

[Roles(RoleType.visitor, RoleType.employee)] 
public ActionResult SomeProtectedAction() { 
// only employee and visitor can access this, 
// others get redirected to where ever 
... 
} 

Répondre

1

Vous pouvez autoriser l'utilisation des rôles comme celui-ci:

[Authorize(Roles= MyEnum.Admin | MyEnum.Moderator)] 
public ActionResult myAction() 
{ 
} 

L'attribut Autorisez est ici appliqué au niveau du contrôleur, mais vous peut l'appliquer uniquement aux méthodes d'action, en fonction de vos besoins.

Si vous avez configuré correctement votre logique d'authentification (Identité ASP.NET), un cookie d'authentification, y compris les rôles utilisateur, sera renvoyé. Maintenant, après une connexion réussie, si vous faites une demande à une méthode de contrôleur, le cookie est décompressé en arrière-plan et la propriété utilisateur this.User est remplie avec ces données, y compris les rôles de cet utilisateur.

L'attribut authorize effectuera automatiquement la vérification pour vous.

+0

Il s'agit d'une véritable puissance des rôles, dans laquelle vous pouvez fournir un accès à grande échelle au contrôleur, puis réduire l'accès au niveau par méthode. Supposons que vous ayez un rôle appelé Staff, qui doit accéder à un contrôleur (l'ensemble du contrôleur est décoré pour que tout le monde dans le rôle Staff puisse y accéder). Supposons que vous souhaitiez limiter les capacités de suppression aux administrateurs uniquement. Vous devez donc décorer les méthodes de suppression avec le rôle Admin spécifiquement afin que seules les personnes * * * Personnel * et * Administrateurs puissent être supprimées. Les gens qui sont juste le personnel et les utilisateurs ne peuvent pas. (Logique métier: 2 rôles requis pour chaque compte) –

+0

Je comprends comment utiliser des rôles comme celui-ci, mais comment puis-je me connecter à mon utilisateur. Y a-t-il une fonction comme celle-ci que je peux appeler? : 'identityLoginUser (new identityUser (int id, nom d'utilisateur de la chaîne, rôles RolesEnum []), et qu'il crée un cookie en arrière-plan et que tout fonctionne avec un minimum d'effort – Reygoch

+0

Il est bon de comprendre les bases de l'identité ASP.NET: -) Regardez [ici] (http://www.codeproject.com/Articles/762428/ASP-NET-MVC-and-Identity-Understanding-the-Basics) et recherchez "Sign-In Helper - L'identité de base 2.0 API de connexion ". Cette v2.0, il y en a une plus récente, mais elle ne devrait pas être très différente. – Legends