asp.net - tutorial - usuarios roles y permisos c# mvc
Almacenar/asignar roles de usuarios autenticados (5)
¿No podría incluir un administrador de roles de la tienda de autorización o buscar (por ejemplo, en Codeplex) o write 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.
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;
}
}
Me inclino a solo crear un proveedor de roles personalizado. Ejemplo aquí:
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.