2017-07-25 1 views
0

Je suis en train de mettre en œuvre mon propre attribut personnalisé où je dois chercher tous les rôles pour l'utilisateur actuel comme celui-ci:indisponible Roles.GetRolesForUser dans l'autorisation personnalisée attirbute

public class CustomRoleAuthorization: System.Web.Mvc.AuthorizeAttribute 
    { 

    public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 
      if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult("~/Login"); 
       return; 
      } 
      var requiredRoles = Roles.Split(Convert.ToChar(",")).ToList(); 

      var userRoles = Roles.GetRolesForUser(filterContext.HttpContext.User.Identity.Name); 

      foreach (var item in requiredRoles) 
      { 
       if (!filterContext.HttpContext.User.IsInRole(item)) 
       { 
        filterContext.Result = new RedirectResult("~/Index/Index"); 
        return; 
       } 
      } 

     } 
} 

Mais pour une raison quelconque cette ligne ne fonctionne pas fonctionne:

var userRoles = Roles.GetRolesForUser(filterContext.HttpContext.User.Identity.Name); 

il dit que la propriété des rôles est une chaîne et qu'elle ne contient pas une méthode GetRolesForUser?

Comment puis-je ajouter cette méthode d'extension à mon projet pour que je puisse obtenir tous les rôles utilisateur à partir de l'identité lors de la connexion?

@Stephen voici comment je définir les rôles lors de la connexion:

if (user.PasswordHash == PasswordSecurity.CreatePasswordHash(model.Password, user.PasswordSalt)) 
{ 
    ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie); 
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, model.Email)); 
    List<Claim> claims = new List<Claim>(); 
var roles = user.UserRoles.Where(x=>x.Active==true).ToList(); 
foreach (var item in roles) 
{ 
    claims.Add(new Claim(ClaimTypes.Role, item.Roles.RoleName)); 
    } 
identity.AddClaims(claims); 
identity.AddClaim(new Claim(ClaimTypes.Name, model.Email)); 
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTimeOffset.UtcNow.AddHours(3) }, identity); 
return Json("ok"); 
} 

Répondre

1

AuthorizeAttribute contient une propriété public string Roles { get; set; } (voir documentation) si vous avez besoin d'utiliser le nom complet

var userRoles = System.Web.Security.Roles.GetRolesForUser(... 

ou vous peut créer un alias pour le nom de l'assemblée

+0

Salut Stephen, merci beaucoup pour la réponse! Au fait, j'ai fait ce que vous venez d'écrire, et par conséquent j'obtiens: {string [0]}? On dirait que je ne définis pas les rôles correctement ou ...? – User987

+1

Il suggère que vous n'avez aucun rôle pour l'utilisateur connecté (mais je ne sais pas s'il pourrait y avoir d'autres raisons pour lesquelles il pourrait retourner un tableau vide.) –

+0

J'ai modifié ma question avec comment j'ajoute les rôles utilisateur – User987