2010-11-30 3 views
1

Je suis en train de modifier un système écrit en C# MVC pour le moment.Attribut Authorize ne fonctionnant pas avec des rôles MVC C#

Je viens de créer un peu plus de fonctionnalités dans la zone Administrateur qui permet à l'administrateur de créer un compte d'utilisateur avec des fonctionnalités d'administrateur limitées. J'ai mis les éléments suivants sur chacun des contrôleurs pour la nouvelle fonctionnalité:

[Authorize(Roles = "Administrator")] 

Cependant, si je me connecte en utilisant le compte d'administrateur limité, et accédez à cette page, il me laisse passer.

Je suis perplexe parce que j'ai l'air de le faire de la bonne façon, mais je suis aussi assez nouveau pour MVC, y at-il autre chose que je peux vérifier? Je n'ai rien changé dans le fichier web.config donc ça devrait être ok.

Je sais qu'il y a peu d'informations ci-dessus, je ne cherche pas de solution prête à l'emploi, plus de conseils sur ce que je peux vérifier pour corriger le problème.

grâce

EDIT:

Voici comment le nouveau rôle/compte a été créé. Allez-y aussi, c'est une première tentative, il n'y a pas beaucoup de validation.

[Authorize(Roles = "Administrator")] 
    [HttpPost] 
    public ActionResult AddSalesManager(App.Web.Areas.Administrator.Models.SalesManager model, FormCollection formValues) 
    { 
     if (formValues["Cancel"] != null) 
     { 
      return RedirectToAction("Index"); 
     } 

     if (!string.Equals(model.password, model.confirmpassword)) 
     { 
      ModelState.AddModelError("password", "Password and Confirmation must match"); 
     } 

     if (ModelState.IsValid) 
     { 
      using (ModelContainer ctn = new ModelContainer()) 
      { 
       // First, create the user account inside the ASP.Net membership system. 
       // 

       Membership.ApplicationName = "App"; 
       Roles.ApplicationName = "App"; 

       if (!Roles.RoleExists("LimitedAdmin")) 
        Roles.CreateRole("LimitedAdmin"); 

       // MembershipCreateStatus createStatus = MembershipService.CreateUser(model.email, model.password, model.email); 
       if (Membership.GetUser(model.email) == null) 
       { 
        Membership.CreateUser(model.email, model.password); 
        Roles.AddUserToRole(model.email, "LimitedAdmin"); 
       } 

      } 
     } 
     return RedirectToAction("Index"); 

    } 
+1

Affichage comment vous définissez le rôle aiderait. – jfar

+0

Fera, deux secondes. – 109221793

+0

L'utilisateur a-t-il plusieurs rôles? – jfar

Répondre

2

Qu'attendez-vous de ce code?

Avec cet attribut, vous conférez à tous les utilisateurs du rôle d'administrateur le droit d'exécuter cette action de contrôleur, quelle que soit la limite du compte.

+0

Oui, mais j'ai créé un nouveau rôle appelé LimitedAdmin qui, je suppose, ne serait pas autorisé dans cette zone du système, mais il me permet d'utiliser ce compte/rôle. – 109221793

+0

L'utilisateur dans les deux rôles est-il inclus ou seulement dans le rôle LimitedAdmin? – Mariusz

+0

J'ai mis à jour mon code pour illustrer comment j'ai créé le compte administrateur limité. – 109221793

3

attribut Rôle

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class PermissionsAttribute : ActionFilterAttribute 
{ 
    private readonly PermissionsType required; 

    public PermissionsAttribute() 
    { 
    } 

    public PermissionsAttribute(PermissionsType required) 
    { 
     this.required = required; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Log("OnActionExecuting", filterContext.RouteData); 

     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     Controller controller = filterContext.Controller as Controller; 

     //This is uesd to redirect to same controller but differnect action 
     // controller.HttpContext.Response.Redirect("./Login"); 

     var rjasthan = filterContext; 


     var URK = filterContext.HttpContext.Request.RawUrl; 
     if (session["UserPermissions"] != null) 
     { 
      if (!CheckPermissions((UserPermission)session["UserPermissions"])) 
      { 
       // this is used to signout from sesssion 
       // filterContext.HttpContext.GetOwinContext().Authentication.SignOut(); 

       filterContext.Controller.TempData["AuthenticationMessages"] = "You are not authorized to access"; 

       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary{ 
          { "controller", "Home" },{ "action", "UnAuthorizeAccess" }}); 

      } 
     } 

     base.OnActionExecuting(filterContext); 

    } 

    protected bool CheckPermissions(UserPermission model) 
    { 
     bool result = false; 

     if (this.required == (PermissionsType.Add)) 
     { 
      if (model.AddRight) 
       result = true; 
     } 
     else if (this.required == (PermissionsType.View)) 
     { 
      if (model.ViewRight) 
       result = true; 
     } 
     else if (this.required == (PermissionsType.Edit)) 
     { 
      if (model.EditRight) 
       result = true; 
     } 
     else if (this.required == (PermissionsType.Delete)) 
     { 
      if (model.DeleteRight) 
       result = true; 
     } 
     else if (this.required == (PermissionsType.View | PermissionsType.Edit)) 
     { 
      if (model.ViewRight && model.EditRight) 
      { 
       result = true; 
      } 
     } 
     else if (this.required == (PermissionsType.Add | PermissionsType.Edit)) 
     { 
      if (model.AddRight && model.EditRight) 
      { 
       result = true; 
      } 
     } 


     return result; 
    } 

    private void Log(string methodName, RouteData routeData) 
    { 
     var controllerName = routeData.Values["controller"]; 
     var actionName = routeData.Values["action"]; 
     var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName); 
     Debug.WriteLine(message, "Action Filter Log"); 
    } 
} 

[Flags] 
public enum PermissionsType 
{ 
    View = (1 << 0), 
    Add = (1 << 1), 
    Edit = (1 << 2), 
    Delete = (1 << 3), 
    Admin = (View | Add | Edit | Delete) 
} 



[Permissions(PermissionsType.Add)] 
    public ActionResult Register() 
    { 
     return this.AjaxableView(); 
    } 
Questions connexes