Build Menu Based on Authorized Roles

Create an interface ‘INavData’ which holds values for the menu and Create a class ‘NavData’ from the interface with all those properties.

  1. public interface INavData   
  2. {  
  3.     string ImageFileNameWithNoExtn   
  4.     {  
  5.         get;  
  6.         set;  
  7.     }  
  8.     string AreaName   
  9.     {  
  10.         get;  
  11.         set;  
  12.     }  
  13.     bool IsActive   
  14.     {  
  15.         get;  
  16.         set;  
  17.     }  
  18.     bool IsDivider   
  19.     {  
  20.         get;  
  21.         set;  
  22.     }  
  23.     bool IsHeader   
  24.     {  
  25.         get;  
  26.         set;  
  27.     }  
  28.     string Text   
  29.     {  
  30.         get;  
  31.         set;  
  32.     }  
  33.     string ContorllerName   
  34.     {  
  35.         get;  
  36.         set;  
  37.     }  
  38.     string ActionName   
  39.     {  
  40.         get;  
  41.         set;  
  42.     }  
  43.     string AlternateUrl   
  44.     {  
  45.         get;  
  46.         set;  
  47.     }  
  48.     bool OpenNewWindow   
  49.     {  
  50.         get;  
  51.         set;  
  52.     }  
  53.   
  54.     IEnumerable < INavData > Children   
  55.     {  
  56.         get;  
  57.         set;  
  58.     }  
  59. }  
Create a class ‘MenuBuild’ and a method ‘RenderMenu’ to hold the role based menu generation algorithm.
  1. public static class MenuBuild   
  2. {  
  3.     public static IEnumerable < INavData > RenderMenu(IPrinciple User, Func < ActionResult, string > urlAction)   
  4.     {  
  5.         List < INavData > ComponentMenuList = new List < INavData > ();  
  6.   
  7.         if (User.IsInRole("Authenticated_User"))   
  8.         {  
  9.             NavData Home = new NavData   
  10.             {  
  11.                 IsActive = true,  
  12.                 AlternateUrl = urlAction(MVC.Home.Actions.Index()),  
  13.                 ActionName = MVC.Home.ActionNames.Index,  
  14.                 ControllerName = MVC.Home.Name,  
  15.                 Text = "Home"  
  16.             }  
  17.             ComponentMenuList.Add(Home);  
  18.         }  
  19.   
  20.         List < INavData > subMenu1 = new List < INavData > ();  
  21.   
  22.         if (IPrincipleExtensions.IsInAnyRole(User.IsInRole, ComponentViewer.ComponentViewerRoles))   
  23.         {  
  24.             NavData newCompMenu1 = new NavData   
  25.             {  
  26.                 IsActive = true,  
  27.                 AlternateUrl = urlAction(MVC.Comp.Actions.Index()),  
  28.                 ActionName = MVC.Comp.ActionNames.Index,  
  29.                 ControllerName = MVC.Comp.Name,  
  30.                 Text = "Comp"  
  31.             }  
  32.             subMenu1.Add(newCompMenu1);  
  33.         }  
  34.   
  35.         if (IPrincipalExtensions.IsInAnyRole(User.IsInRole, ComponentViewer.ComponentViewerRoles))   
  36.         {  
  37.             NavData newCompMenu2 = new NavData   
  38.             {  
  39.                 IsActive = true,  
  40.                 AlternateUrl = urlAction(MVC.Comp.Actions.Edit()),  
  41.                 ActionName = MVC.Comp.ActionNames.Edit,  
  42.                 ControllerName = MVC.Comp.Name,  
  43.                 Text = "Comp Edit"  
  44.             }  
  45.             subMenu1.Add(newCompMenu2);  
  46.         }  
  47.   
  48.         if (subMenu.Count > 0)   
  49.         {  
  50.             List < INavData > subMenu1Child = new List < INavData > ();  
  51.   
  52.             NavData subMenu1Header = new NavData   
  53.             {  
  54.                 Text = "New",  
  55.                 Children = subMenu1Child  
  56.             }  
  57.             ComponentMenuList.Add(subMenu1Child);  
  58.         }  
  59.     }  
  60. }  
Write an extension class to the ‘IPrincipal’ with ‘IsInAnyRole’ method to loop the roles.
  1. public static class IPrincipalExtensions    
  2. {    
  3.     public static bool IsInAnyRole(Func<string,bool> IsInRole, IEnumerable<string> roles)    
  4.     {    
  5.         foreach(string role in roles)    
  6.             if(IsInRole(role)) return true;    
  7.         return false;    
  8.     }   
  9. }   

Next Recommended Reading Role Based login Form using SQL Database