Stocker / atsortingbuer des rôles d’utilisateurs authentifiés

Je mets à niveau un site pour utiliser MVC et je recherche le meilleur moyen de configurer l’authentification.

À ce stade, j’ai ouvert une session avec Active Directory: validation d’un nom d’utilisateur et d’un mot de passe, puis définition du cookie d’authentification.

Comment puis-je stocker les informations de rôle de l’utilisateur au moment de la connexion, afin que mes contrôleurs puissent voir ces rôles lorsque l’utilisateur navigue sur le site?

[Authorize(Roles = "admin")] 

Je n’ai aucun problème pour obtenir une liste de rôles dans Active Directory. Je ne sais pas où les placer pour que les contrôleurs les voient.

Lorsque vous authentifiez votre utilisateur, vous générez une nouvelle instance GenericPrincipal. Le constructeur prend un tableau de chaînes qui sont les rôles de l’utilisateur. Maintenant, définissez HttpContext.Current.User sur le principal générique et écrivez le cookie d’authentification.

Les rôles sont ajoutés à l’ adresse IPrincipal du HttpContext. Vous pouvez créer un GenericPrincipal , parsingr la liste des rôles dans le constructeur et la définir comme HttpContext.User. Le GenericPrincipal sera alors accessible via l’ User.IsInRole("role") ou [Authorize(Roles="role")]

Une façon de le faire (en C #) consiste à append vos rôles en tant que chaîne séparée par des virgules dans le paramètre de données utilisateur lors de la création de votre ticket d’authentification.

 ssortingng 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); 

Accédez ensuite à la liste de rôles à partir du ticket d’authentification et créez un fichier GenericPrincipal à partir de votre fichier 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); ssortingng[] roles = authTicket.UserData.Split(new Char[] { ',' }); GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name),roles); Context.User = userPrincipal; } } 

Pour ceux d’entre vous qui utilisent MVC 4 ou Greater, vous devrez suivre les conseils de Jaroslaw Waliszko lorsque vous utiliserez la réponse de David Glenn:

“Je l’ai testé dans ASP.NET MVC 4 et je suggère d’utiliser plutôt Application_PostAuthenticateRequest. Sinon, le principal générique sera remplacé.” – Jaroslaw Waliszko 7 sept à 16h18

Ainsi, comme indiqué ci-dessus, il vous suffit de remplacer le nom de la méthode Application_AuthenticateRequest par Application_PostAuthenticateRequest pour que cela fonctionne. A fonctionné à merveille pour moi! Si je pouvais autoriser Jaroslaw et David, je le ferais.

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

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

Ne pourriez-vous pas déposer un gestionnaire de rôle de magasin d’permissions ou rechercher (par exemple sur Codeplex) ou écrire un autre fournisseur de rôle qui fonctionne avec Active Directory pour obtenir les informations sur les groupes?

Cela vous éviterait d’authentifier l’utilisateur, d’obtenir ses rôles, puis de renvoyer ces informations au constructeur, et cela se produirait automatiquement pour vous dans le cadre de la structure.