2017-07-25 4 views
0

Ich versuche, meine eigene benutzerdefinierte Attribut zu implementieren, wo ich so alle Rollen für den aktuellen Benutzer zu holen haben:Roles.GetRolesForUser nicht verfügbar in benutzerdefinierte Autorisierung 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; 
       } 
      } 

     } 
} 

Aber aus irgendeinem Grund diese Linie nicht der Fall ist funktioniert:

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

er sagt, dass die Rollen Eigenschaft eine Zeichenfolge ist und daß es keine Methode GetRolesForUser?

Wie kann ich diese Erweiterungsmethode zu meinem Projekt hinzufügen, damit ich beim Anmelden alle Benutzerrollen von der Identität ableiten kann?

@Stephen das ist, wie ich die Rollen bei der Anmeldung festgelegt:

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

Antwort

1

AuthorizeAttribute enthält eine public string Roles { get; set; } Eigenschaft (siehe documentation), so müssen Sie den vollständig qualifizierten Namen

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

oder Sie verwenden kann einen Alias ​​für den Assemblynamen erstellen

+0

Hey Stephen, vielen Dank für die Antwort! Nebenbei habe ich getan, was du gerade geschrieben hast, und als Ergebnis bekomme ich: {string [0]}? Sieht so aus, als würde ich die Rollen nicht richtig einstellen oder ...? – User987

+1

Es schlägt vor, dass Sie keine Rollen für den aktuell angemeldeten Benutzer haben (aber nicht sicher, ob es andere Gründe geben könnte, warum ein leeres Array zurückgegeben werden könnte.) –

+0

Ich habe meine Frage mit der Benutzerrolle – User987

Verwandte Themen