2010-01-14 54 views
22

¿Hay alguna forma de obtener el rol explícito al que pertenece un usuario en mi controlador? Esto supone el uso de los Proveedores de Membresía y Función de ASP.NET. "IsInRole" no funciona: necesito obtener realmente el nombre del rol en el que están.obtener el rol del usuario actual

Respuesta

24

Puede obtener una lista de Roles del método GetRoles. (Desde el enlace)

string[] rolesArray; 

    public void Page_Load() 
    { 
     RolePrincipal r = (RolePrincipal)User; 
     rolesArray = r.GetRoles(); 
     ...//extra code 
    } 
+8

Para otros que se ejecutan en esto, si llegas a tener un error aquí acerca del Administrador El rol no está habilitado, el pop en su configuración web, encontrar el elemento roleManager y conjunto activado =" verdadero "como un atributo. – MisterJames

25

Un usuario puede estar en más de una función por lo que no se puede conseguir el papel uno que el usuario se encuentra, pero se puede conseguir fácilmente la lista de los roles de una usuario está en

usted puede utilizar el tipo de Roles para obtener la lista de las funciones que el usuario actualmente conectado se encuentra en:.

public ActionResult ShowUserRoles() { 
    string[] roleNames = Roles.GetRolesForUser(); 
    return View(roleNames); 
} 

O si usted quiere conseguir los papeles para un usuario arbitrario que pueda Pensilvania ss en el nombre de usuario cuando llamas al Roles.GetRolesForUser().

+0

¿Y cómo obtener datos personalizados específicos del usuario como DOB? – xameeramir

+2

@zameeramir que suena como una buena pregunta por separado para preguntar en StackOverflow. – Eilon

+0

aquí está: http://stackoverflow.com/questions/30216915/how-to-get-user-profile-data-from-asp-net-mvc-custom-identityuser-model/30217188#30217188 – xameeramir

12

Puede obtener el rol del usuario actual con Roles.GetRolesForUser().

Para comprobar si un usuario pertenece a un papel aquí es lo que hice:

Roles.GetRolesForUser().Contains("Administrator") 
+6

También puede compruebe si un usuario tiene un rol haciendo 'User.IsInRole (" RoleName ")' –

+0

La respuesta de Scotty.NET (en el comentario a esta respuesta) parece que sería una forma mejor (más rápida) de verificar si un usuario pertenece a un cierto papel para mí. – VoidKing

10

Simplemembership en MVC4:

Obtención de roles

var role = System.Web.Security.Roles.GetRolesForUser().Single(); 

Para comprobar si el usuario el usuario pertenece a un cierto rol-

if (User.IsInRole("External")) 
2

No sé si me falta alguna configuración o configuración extraña, pero no puedo obtener, p. User.IsInRole o Roles.GetRolesForUser() para trabajar. Acabo de recibir una excepción (creo que es una referencia nula), y la aplicación simplemente se detiene. Aunque configuré un RoleManager para OwinContext y un método Create, etc., como en el proyecto Identity Sample de Microsoft, y también habilité el Administrador de roles en web.config. He resuelto esto en primer lugar utilizando otro método, como esto (db es la ApplicationDbContext):

var UserID = User.Identity.GetUserId();  
var userRoles = db.Roles.Include(r => r.Users).ToList(); 

var userRoleNames = (from r in userRoles 
          from u in r.Users 
          where u.UserId == UserID 
          select r.Name).ToList(); 

Esto puede no ser la forma más optimizada y, posiblemente, puede ser alterado a una forma más simple pero funcionó para mí y mayo no requiere tanta configuración/dependencias como otros enfoques. El segundo enfoque está presente (añadir esto a su clase controlador):

private ApplicationDbContext db = new ApplicationDbContext(); 
    private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     set 
     { 
      _userManager = value; 
     } 
    } 

    private ApplicationRoleManager _roleManager; 
    public ApplicationRoleManager RoleManager 
    { 
     get 
     { 
      return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 
     } 
     private set 
     { 
      _roleManager = value; 
     } 
    } 

Dentro de su controlador ahora se puede hacer por ejemplo:

var UserID = User.Identity.GetUserId(); 
var RolesForUser = await UserManager.GetRolesAsync(UserID); 

estoy usando ASP.NET MVC 5 aplicación sólo para ser claro. El RoleManager no se usa en este ejemplo, pero se puede usar para crear, encontrar, actualizar, etc. roles. El uso de este enfoque permite realizar llamadas asincrónicas usando await, en caso de que sea un beneficio para su aplicación.

0

Yo uso este código

((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList() 
.OrderBy(x => x.Value == "admin" ? 1 
: x.Value == "Salesperson" ? 2 
: x.Value == "User" ? 3 : 4).First().Value 
Cuestiones relacionadas