Almacenar / asignar roles de usuarios autenticados

Estoy actualizando un sitio para usar MVC y estoy buscando la mejor manera de configurar la Autenticación.

En este punto, tengo el inicio de sesión activo de Active Directory: validar un nombre de usuario y contraseña, y luego configurar la cookie de autenticación.

¿Cómo almaceno la información del rol del usuario al momento de iniciar sesión, para que mis controladores vean esos roles mientras el usuario navega a través del sitio?

[Authorize(Roles = "admin")] 

No tengo problemas para obtener una lista de roles de Active Directory. Simplemente no sé dónde colocarlos para que los controladores los vean.

Cuando autenticas a tu usuario, generas una nueva instancia de GenericPrincipal. El constructor toma una matriz de cadenas que son las funciones para el usuario. Ahora configure HttpContext.Current.User igual al principal genérico y escriba la cookie de autenticación, y eso debería hacerlo.

Las funciones se agregan al IPrincipal de HttpContext. Puede crear un GenericPrincipal , analizar la lista de roles en el constructor y establecerlo como HttpContext.User. A continuación, se podrá acceder a User.IsInRole("role") mediante el User.IsInRole("role") o [Authorize(Roles="role")]

Una forma de hacerlo (en C #) es agregar sus roles como una cadena separada por comas en el parámetro de datos de usuario al crear su ticket de autenticación.

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

A continuación, acceda a la lista de roles desde el ticket de autenticación y cree un GenericPrincipal desde su 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; } } 

Para aquellos de ustedes que usen MVC 4 o Greater, necesitarán seguir los consejos de Jaroslaw Waliszko cuando hagan uso de la respuesta de David Glenn:

“Lo probé en ASP.NET MVC 4 y sugiero utilizar Application_PostAuthenticateRequest en su lugar. De lo contrario, se anulará el principal genérico”. – Jaroslaw Waliszko, 7 de septiembre a las 16:18

Como se indicó anteriormente, todo lo que necesita hacer es reemplazar el nombre del método Application_AuthenticateRequest con Application_PostAuthenticateRequest para que esto funcione. Trabajó como un encanto para mí! Si pudiera votar contra Jaroslaw y David, lo haría.

Me inclino a solo crear un proveedor de roles personalizado. Ejemplo aquí:

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

¿No podría incluir un administrador de roles de la tienda de autorización o buscar (por ejemplo, en Codeplex) o escribir otro proveedor de funciones que funcione con Active Directory para obtener la información de los grupos?

Esto le ahorrará la molestia de autenticar al usuario, obtener sus roles y luego repasar esa información en el constructor, y todo sucederá automáticamente para usted como parte del marco.