2010-01-14 12 views
22

Y at-il un moyen d'obtenir le rôle explicite auquel un utilisateur appartient dans mon contrôleur? Cela suppose l'utilisation des fournisseurs d'appartenance et de rôle ASP.NET. "IsInRole" ne fonctionne pas - J'ai besoin d'obtenir le nom du rôle dans lequel ils se trouvent.Récupère le rôle de l'utilisateur actuel

Répondre

24

Vous pouvez obtenir la liste des rôles de la méthode GetRoles. (À partir du lien)

string[] rolesArray; 

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

Pour d'autres qui se jettent dans cela, si vous avez une erreur ici sur le rôle Gestionnaire de ne pas être activé, pop dans votre config web, trouver l'élément roleManager et ensemble enabled = » vrai "en tant qu'attribut. – MisterJames

25

Un utilisateur peut être dans plus d'un rôle pour que vous ne pouvez pas obtenir le un rôle que l'utilisateur est, mais vous pouvez facilement obtenir la liste des rôles un l'utilisateur est en

vous pouvez utiliser le type Roles pour obtenir la liste des rôles que l'utilisateur actuellement connecté est:.

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

Ou si vous voulez obtenir le rôle d'un utilisateur arbitraire, vous pouvez Pennsylvanie ss dans le nom d'utilisateur lorsque vous appelez Roles.GetRolesForUser().

+0

Et comment obtenir des données spécifiques à l'utilisateur, telles que DOB? – xameeramir

+2

@zameeramir cela ressemble à une bonne question à poser sur StackOverflow. – Eilon

+0

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

12

Vous pouvez obtenir le rôle de l'utilisateur actuel avec Roles.GetRolesForUser().

Pour vérifier si un utilisateur appartient à un rôle ici est ce que je faisais:

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

Vous pouvez aussi vérifier si un utilisateur est dans un rôle en faisant 'User.IsInRole (" RoleName ")' –

+0

La réponse de Scotty.NET (dans le commentaire à cette réponse) semble être une façon plus rapide de vérifier si un utilisateur appartient à un certain rôle pour moi. – VoidKing

10

Simplemembership dans MVC4:

Obtenir de de rôle

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

l'utilisateur de vérifier si le l'utilisateur appartient à un certain rôle-

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

Je ne sais pas s'il me manque un réglage ou une configuration bizarre, mais je ne peux pas l'obtenir par exemple. User.IsInRole ou Roles.GetRolesForUser() pour fonctionner. Je viens d'obtenir une exception (je pense que référence nulle), et l'application s'arrête juste. Même si j'ai configuré un RoleManager à OwinContext et une méthode Create etc. comme dans le projet Identity Sample de Microsoft, ainsi que le rôle Role Manager activé dans web.config. Je résolus cela d'abord en utilisant une autre approche, comme celui-ci (db est le 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(); 

Ce ne peut pas être la plus optimisée façon et peut éventuellement être modifié à une forme plus simple, mais cela a fonctionné pour moi et peut ne nécessite pas autant d'installation/dépendances que d'autres approches. La deuxième approche est ce (ajoutez ceci à votre classe de contrôleur):

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

l'intérieur de votre contrôleur, vous pouvez maintenant faire par exemple:

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

J'utilise l'application ASP.NET MVC 5 juste être clair. Le RoleManager n'est pas utilisé dans cet exemple, mais il peut être utilisé pour créer, trouver, mettre à jour, etc. des rôles. Cette approche permet d'effectuer des appels asynchrones en utilisant wait, dans le cas où cela serait avantageux pour votre application.

0

-je utiliser ce code

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