2017-09-04 2 views
2

J'essaye d'employer Enum à l'annotation [Authorize]. Je configure déjà mais ça ne marche toujours pas, les politiques de sécurité permettent l'accès.Comment configurer l'annotation [Autoriser] pour utiliser Enum?

Je n'ai pas créé mon Enum avec l'exemple des nombres: Administrator = 1 ou quelque chose comme ça, je viens de créer en utilisant la description comme Administrator, Manager, Common. Je ne voudrais pas créer des nombres comme index, je veux juste créer par la description comme je l'ai montré.

Comment résoudre ce problème?

Enum

public enum RoleType{ 
    Administrator, 
    Manager, 
    Common 
}; 

AuthorizeAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Enum | AttributeTargets.Method, AllowMultiple = false)] 
public class PermissionFilter : AuthorizeAttribute{ 

    public RoleType Roles {get;set;} 

    protected override bool AuthorizeCore(HttpContextBase httpContext){ 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (!httpContext.User.Identity.IsAuthenticated) 
      return false; 

     //get the Session of User 
     User user = httpContext.Session["User"] as User; 
     RoleType role = user.role; 

     if (((Roles & role) != role)) 
      return false; 

     return true; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext){ 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult) 
      filterContext.HttpContext.Response.Redirect("/Home/accessDenied"); 
    } 
} 

Méthode

[PermissionFilter(Roles= RoleType.Manager)] 
public ActionResult viewAllAdmin(int? pagina, String nome){ 
} 

Répondre

1

Résolution du problème .

j'ai fait

AuthorizeAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Enum | AttributeTargets.Method, AllowMultiple = false)] 
public class PermissionFilter : AuthorizeAttribute{ 

    public RoleType[] Roles; 

    public PermissionFilter(params RoleType[] roles){ 
     Roles = roles; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext){ 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (!httpContext.User.Identity.IsAuthenticated) 
      return false; 
     try{ 
      Usuario usuario = httpContext.Session["Usuario"] as Usuario; 
      RoleType role = usuario.role; 
      Boolean contain = Roles.Contains<RoleType>((RoleType)role); 
      Console.WriteLine("Contem Role: " + contain); 

      if (!Roles.Contains<RoleType>((RoleType)role)){ 
       return false; 
      } 

      return true; 
     }catch (Exception e){ 
      Debug.WriteLine("PermissionFilter AuthorizeCore: " + e.Message); 
      return false; 
     }  
    } 


    public override void OnAuthorization(AuthorizationContext filterContext){ 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult) 
      filterContext.HttpContext.Response.Redirect("/Home/acessoNegado"); 
    } 
} 

Méthode

[PermissionFilter(RoleType.Administrator, RoleType.Manager)] 
public ActionResult viewAllAdmin(int? pagina, String nome){ 
} 

Et puis, il fonctionne très bien!

+0

Donc, vous n'avez pas besoin d'aide de stackoverflow après tout. – buffjape