54 votes

MVC - Comment stocker/attribuer des rôles à des utilisateurs authentifiés

Je me suis mise à niveau d'un site à l'utilisation de MVC et suis à la recherche de la meilleure façon de configuration Authenication.

À ce point, j'ai la connexion qui travaillent en dehors de l'Active Directory, la validation d'un nom d'utilisateur et le mot de passe, puis la configuration de l'authentification par cookie.

Ma question est comment puis-je stocker les utilisateurs du rôle de l'information au moment de la connexion dans l'ordre à mon contrôleurs de voir ces rôles en tant que l'utilisateur navigue.

[Authorize(Roles = "admin")]

Je n'ai pas de problème pour faire cette liste de rôles à partir d'active directory. Je ne sais pas où les mettre, afin que les contrôleurs de les voir.

126voto

David Glenn Points 12819

Les rôles sont ajoutés à la IPrincipal de la HttpContext. Vous pouvez créer un GenericPrincipal, d'analyser la liste des rôles dans le constructeur et le définir comme HttpContext.De l'utilisateur. Le GenericPrincipal sera ensuite accessible par User.IsInRole("role") ou [Authorize(Roles="role")] d'attribut

Une façon de le faire (en C#) est à ajouter votre rôle en tant que séparés par des virgules chaîne de caractères dans les données de l'utilisateur paramètre lors de la création de votre ticket d'authentification

string roles = "Admin,Member";
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
  1,
  userId,  //user id
  DateTime.Now,
  DateTime.Now.AddMinutes(20),  // expiry
  false,  //do not remember
  roles, 
  "/");
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                   FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);

Alors accéder à la liste des rôles du ticket d'authentification et de créer un GenericPrincipal de votre Global.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
  HttpCookie authCookie = 
                Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null) {
      FormsAuthenticationTicket authTicket = 
                                  FormsAuthentication.Decrypt(authCookie.Value);
      string[] roles = authTicket.UserData.Split(new Char[] { ',' });
      GenericPrincipal userPrincipal =
                       new GenericPrincipal(new GenericIdentity(authTicket.Name),
                                            roles);
      Context.User = userPrincipal;
    }
  }
}

6voto

Klaus Byskov Pedersen Points 43779

Lorsque vous authentifier vos utilisateurs, vous générez une nouvelle GenericPrincipal instance. Le constructeur prend un tableau de chaînes de caractères qui sont les rôles de l'utilisateur. Maintenant défini HttpContext.Actuel.L'utilisateur égal au générique de capital et d'écrire l'auth cookie, et qui devrait le faire.

Espérons que cela aide.

Klaus

5voto

Gareth Points 8

Pour ceux d'entre vous en utilisant MVC 4 ou Plus, vous aurez besoin de prendre Jaroslaw Waliszko conseils lors de la prise de l'utilisation de David Glenn réponse:

"Je l'ai testé dans ASP.NET MVC 4 et je suggère d'utiliser Application_PostAuthenticateRequest à la place. Sinon, le générique de capital devra être remplacée." – Jaroslaw Waliszko 7 Sep à 16:18

Donc, comme indiqué ci-dessus, tout ce que vous devez faire est de remplacer le Application_AuthenticateRequest nom de la méthode avec Application_PostAuthenticateRequest pour obtenir que cela fonctionne. A travaillé comme un charme pour moi! Si j'ai été autorisé à upvote Jaroslaw et David, je le ferais.

3voto

DanH Points 1702

Je serais enclin à simplement créer un fournisseur de rôle. Exemple ici:

http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

1voto

Zhaph - Ben Duguid Points 18573

Pourriez-vous ne pas tomber dans un magasin d'autorisation rôle de gestionnaire ou de trouver (par exemple sur Codeplex) ou écrire un autre Fournisseur de Rôle qui fonctionne avec Active Directory pour obtenir les informations de groupes?

Ce serait vous faire économiser les tracas de l'authentification de l'utilisateur, l'obtention de leurs rôles, et puis re-passant, que les informations dans le constructeur, et serait tout se fait automatiquement pour vous en tant que partie du cadre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X