c# - tutorial - ¿Cómo puedo verificar si un usuario tiene alguna de las diferentes funciones con membresía MVC4 Simple?
mvc asp.net c# (7)
En mi caso, solo tengo un rol por usuario. Así que lo hice así:
if (User.Roles.FirstOrDefault().RoleId == "7b433246-5881-4ace-bbaa-e5514191171c") {
//Do something
}
Entiendo que una buena forma de verificar si un usuario tiene un rol es:
if (User.IsInRole("Admin"))
{
}
Sin embargo, ¿cómo puedo verificar si mi usuario está en uno de los roles "Autor", "Administrador" o "Super"? ¿Hay alguna manera de hacerlo sin codificar "User.IsInRole" para cada uno de los roles ?
No hay una forma integrada de verificar si un usuario tiene múltiples roles, pero es bastante trivial crear un buen método de extensión para manejarlo por usted:
public static bool IsInAnyRole(this IPrincipal principal, params string[] roles)
{
return roles.Any(principal.IsInRole);
}
El uso entonces es:
if (User.IsInAnyRole("Admin", "Author", "SuperUser"))
{
}
Por favor, use esta manera simple:
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
if (User.IsInRole("Administrator") || User.IsInRole("Moderator"))
{
... Your code here
}
}
Quise elaborar un poco sobre la respuesta de mattytommo, esto es lo que uso:
Método de extensión:
public static bool IsInAnyRole(this IPrincipal user, string[] roles)
{
//Check if authenticated first (optional)
if (!user.Identity.IsAuthenticated) return false;
var userRoles = Roles.GetRolesForUser(user.Identity.Name);
return userRoles.Any(roles.Contains);
}
Constantes:
public static class Role
{
public const string Administrator = "Administrator";
public const string Moderator = "Moderator";
}
Uso:
if (User.IsInAnyRole(new [] {Role.Administrator,Role.Moderator}))
{
//Do stuff
}
También puedes usar
if(Roles.GetRolesForUser(model.UserName).Contains("Admin")){
}
Usé el siguiente código. En mi caso, tenía una cadena de dos puntos limitada como el parámetro que se lee de web.config. Puede cambiar fácilmente el siguiente código si está pasando una lista.
public class ActiveDirectoryGroup
{
public static bool IsInAnyRole(string adRoles)
{
return adRoles.Split(Convert.ToChar(";")).Any(role => !string.IsNullOrEmpty(role.Trim()) && HttpContext.Current.User.IsInRole(role.Trim()));
//If list is passed use below
//return listParameter.Any(role => !string.IsNullOrEmpty(role.Trim()) && HttpContext.Current.User.IsInRole(role.Trim()));
}
}
En web.config:
<appSettings>
<add key="ADGroup" value="Domain/Admin;Domain/Supervisor;Domain/Manager;" />
</appSettings>
Lo utilicé como abajo en mi carga de página:
if (ActiveDirectoryGroup.IsInAnyRole(ConfigurationManager.AppSettings["ADGroup"]))
{
//do something
}
EDITAR: sin codificar cada rol, hazlo con un método de extensión LINQ, así:
private static bool IsInAnyRole(this IPrincipal user, List<string> roles)
{
var userRoles = Roles.GetRolesForUser(user.Identity.Name);
return userRoles.Any(u => roles.Contains(u));
}
Para el uso, hacer:
var roles = new List<string> { "Admin", "Author", "Super" };
if (user.IsInAnyRole(roles))
{
//do something
}
O sin el método de extensión:
var roles = new List<string> { "Admin", "Author", "Super" };
var userRoles = Roles.GetRolesForUser(User.Identity.Name);
if (userRoles.Any(u => roles.Contains(u))
{
//do something
}