web-dev-qa-db-fra.com

Comment puis-je vérifier si un utilisateur est dans l'un des quelques rôles différents avec l'adhésion MVC4 Simple?

Je comprends qu'un bon moyen de vérifier si un utilisateur est dans un rôle est:

if (User.IsInRole("Admin"))
{

}

Cependant, comment puis-je vérifier si mon utilisateur est dans l'un des rôles "Auteur", "Admin" ou "Super"? Existe-t-il un moyen de le faire sans coder "User.IsInRole" pour chacun des rôles?

35
user1943020

EDIT: sans coder chaque rôle, faites-le comme une méthode d'extension LINQ, comme ceci:

private static bool IsInAnyRole(this IPrincipal user, List<string> roles)
{
    var userRoles = Roles.GetRolesForUser(user.Identity.Name);

    return userRoles.Any(u => roles.Contains(u));
}

Pour l'utilisation, faites:

var roles = new List<string> { "Admin", "Author", "Super" };

if (user.IsInAnyRole(roles))
{
    //do something
}

Ou sans la méthode d'extension:

var roles = new List<string> { "Admin", "Author", "Super" };
var userRoles = Roles.GetRolesForUser(User.Identity.Name);

if (userRoles.Any(u => roles.Contains(u))
{
    //do something
}
46
mattytommo

Il n'y a aucun moyen intégré de vérifier si un utilisateur est dans plusieurs rôles, mais il est assez trivial de créer une méthode d'extension Nice pour le gérer pour vous:

public static bool IsInAnyRole(this IPrincipal principal, params string[] roles)
{
    return roles.Any(principal.IsInRole);
}

L'utilisation est alors:

if (User.IsInAnyRole("Admin", "Author", "SuperUser"))
{

}
44
Paul Turner

Je voulais développer un peu la réponse de mattytommo, voici ce que j'utilise:

Méthode d'extension:

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

tilisation:

if (User.IsInAnyRole(new [] {Role.Administrator,Role.Moderator}))
{
    //Do stuff
}
1
Cyberdrew

Dans mon cas, je n'ai qu'un seul rôle par utilisateur. Alors je l'ai fait comme ça:

if (User.Roles.FirstOrDefault().RoleId == "7b433246-5881-4ace-bbaa-e5514191171c") {
    //Do something
}
0
César León

Vous pouvez aussi utiliser

if(Roles.GetRolesForUser(model.UserName).Contains("Admin")){
}
0
Venkata Tata

Veuillez utiliser cette méthode simple:

@using Microsoft.AspNet.Identity

@if (Request.IsAuthenticated)
{
    if (User.IsInRole("Administrator") || User.IsInRole("Moderator"))
    {
        ... Your code here
    }
}
0
Francesco Ceresa

J'ai utilisé le code ci-dessous. Dans mon cas, j'avais une chaîne non limitée du point-virgule comme paramètre qui est lu depuis web.config. Vous pouvez facilement changer le code ci-dessous si vous passez une liste.

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

Dans web.config:

<appSettings>
  <add key="ADGroup" value="Domain\Admin;Domain\Supervisor;Domain\Manager;" />
</appSettings>

Je l'ai utilisé comme ci-dessous dans mon chargement de page:

if (ActiveDirectoryGroup.IsInAnyRole(ConfigurationManager.AppSettings["ADGroup"]))
{
  //do something
}
0
user007