2010-11-30 5 views
1

Ich modifiziere ein System geschrieben in C# MVC im Moment.Autorisieren Attribut arbeitet nicht mit Rollen MVC C#

Ich habe gerade einen zusätzlichen Teil der Funktionalität im Administratorbereich eingebaut, der es dem Administrator ermöglicht, ein Benutzerkonto mit eingeschränkter Administratorfunktionalität zu erstellen. Ich habe das folgende setzen über jede der Steuerungen für die neue Funktionalität:

[Authorize(Roles = "Administrator")] 

Allerdings, wenn ich bei der Verwendung begrenzter Administrator-Konto anmelden und auf dieser Seite navigieren, es lässt mich durch.

Ich bin ratlos, weil ich das anscheinend richtig mache, aber ich bin auch ziemlich neu bei MVC, gibt es noch etwas, das ich überprüfen kann? Ich habe nichts in der Datei web.config geändert, so dass es in Ordnung sein sollte.

Ich weiß, dass es oben begrenzte Informationen gibt, nicht auf der Suche nach einer fertigen Lösung, mehr Ratschläge, was ich überprüfen kann, um das Problem zu beheben.

dank

EDIT:

Dies ist, wie die neue Rolle/Konto erstellt wurde. Gehen Sie auch einfach, das ist ein erster Versuch, es gibt nicht viel Validierung.

[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

Posting, wie Sie die Rolle gesetzt würde helfen. – jfar

+0

Wird tun, zwei Sekunden. – 109221793

+0

Hat der Benutzer mehrere Rollen? – jfar

Antwort

2

Was erwarten Sie von diesem Code?

Mit diesem Attribut erhalten Sie alle Benutzer in der Administratorrolle das Recht, diese Controller-Aktion auszuführen, unabhängig davon, wie begrenzt das Konto ist.

+0

Ja, aber ich habe eine neue Rolle namens LimitedAdmin erstellt, von der ich erwarte, dass sie in diesem Bereich des Systems nicht erlaubt wäre, aber sie erlaubt mir, dieses Konto/diese Rolle zu verwenden. – 109221793

+0

Ist der Benutzer in beiden Rollen enthalten oder nur in der Rolle "LimitedAdmin"? – Mariusz

+0

Ich habe meinen Code aktualisiert, um zu veranschaulichen, wie ich das eingeschränkte Administratorkonto erstellt habe. – 109221793

3

Rollen Attribut

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