2016-10-04 1 views
1

Ich arbeite an einem Projekt, in dem ich die Rollenautorisierung zum ersten Mal verwende und ich kann es nicht zum Laufen bringen.Richten Sie die Autorisierung für Benutzerrollen ein, die in Gruppen verschachtelt sind.

Die Sache ist, dass das Projekt auf eine Weise eingerichtet wird, dass wenn ein neuer Benutzer erstellt wird, sie zu einer Gruppe hinzugefügt werden. Diese Gruppen enthalten eine oder mehrere Rollen. Zum Beispiel die Gruppe "ReadOnly" enthält die Rollen "userReadOnly" und "groupsReadOnly" (dieser Benutzer kann auf die Seiten Benutzer und Gruppen gehen, sehen die Daten, aber nicht bearbeiten)

Der Teil, den ich bekomme ist die [Authorize(Roles = "..., ...")] in den Controllern und @if(user.IsInRole("...") in den Ansichten, aber wenn ich dies zum Projekt Dinge hinzufügen aufhören zu arbeiten. Ich weiß, ich muss eine benutzerdefinierte AccountRoleProvider erstellen, aber hier bleibe ich stecken. Ich verstehe nicht, wie das geht, und ich verstehe nicht, wie ich die (Standard) -Anbieter, die online gefunden werden, an mein Projekt anpassen kann. Ein Anstupsen in die richtige Richtung oder eine Erklärung dessen, was der Anbieter tatsächlich tut, würde sehr geschätzt werden.

Antwort

0

Um einen benutzerdefinierten Autorisierungsfilter zu erstellen, müssen Sie einen Ordner in Ihrer Lösung erstellen und eine Datei namens AuthorizedRoles.cs darin hinzufügen.

AuthorizedRoles.cs Datei als:

sealed class AuthorizedRoles : ActionFilterAttribute 
    { 
     public string Roles { get; set; } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var status = false; 
      string[] roles = Roles.Split(','); 
      var currentUserRole = Session.UserRole; // Get here the role of the user 
      var Role = ""; 
      switch (currentUserRole) 
      { 
       case 1: 
        Role = "Role1"; 
        break; 
       case 2: 
        Role = "Role2"; 
        break; 
       case 3: 
        Role = "Role3"; 
        break; // Check here for more role 
       default: 
        break; 
      } 

      if (Role != ""){ 
       foreach (var role in roles) 
       { 
        if (role.Contains(currentRoleName)) 
        { 
         status = true; 
        } 
       } 
      } 

     if (status == false)//That means user is not in the role, so redirect it to the new controller returning a view showing information that you are not autorized 
      { 
       if (filterContext.HttpContext.Request.IsAjaxRequest()) 
       { 
        //The request can be ajax callso it will redirect to another ajax method 
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
        { 
         controller = "ControllerName", 
         action = "AjaxActionName", 
         area = "" 
        })); 
       } 
       else 
       { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
        { 
         controller = "ControllerName", 
         action = "ActionName", 
         area = "" 
        })); 
} 
     } 
     base.OnActionExecuting(filterContext); 
     } 

} 

Die Umleitungsmethoden wie sein wird;

//This method will execute only if the user have Role1 and Role2 other wise redirected to other no permission methods before the action executes. 
    [AuthorizedRoles(Roles = "Role1,Role2")] 
     public ActionResult NeedPermissionAction(int id) 
     { 

} 
:

public ActionResult ActionName() 
     { 
      return View(); //Create view for this action 
     } 

public JsonResult AjaxActionName() 
     { 
      return Json(new { status = false, message = "Unauthorized access." }, JsonRequestBehavior.AllowGet); 

     } 

Vor jedem Verfahren, in dem Sie einen Scheck möchten, können benutzerdefinierte Autorisierung Filter aufrufen verwendet werden

Verwandte Themen