0

Я выбрал школьный проект с asp.net mvc3, и есть необходимость в управлении пользователем/ролью. Я думаю, что членство, которое поставляется с asp.net, слишком велико для школьного проекта. Так я и думал. если бы я мог найти эквивалент метода Zend predispatch для asp или даже лучшего, я мог бы хранить URL-адреса, доступные в качестве привилегии для роли, и загружать их в сеанс и проверять, имеет ли конкретный пользователь доступ к нему и перенаправляет, если нет.крошечное управление ролью для asp.net mvc 3

мой вопрос в следующем:

Есть ли эквивалент PreDispatch метода в жереха?
Есть ли лучший подход к моей проблеме? если да, пожалуйста, напишите ресурсы

Спасибо за чтение этого

EDIT я генерировать sublinks из Databse с помощью этого:

public static class SubMenuHelper 
{ 


    public static MvcHtmlString GetSubMenu() 
    { 
     var db = new SchoolContextExpress(); 
     var submenu = from s in db.Disciplines select s; 
     var sbuilder = new StringBuilder(); 
     foreach (var discipline in submenu) 
     { 
      sbuilder.AppendFormat("<li><a class='sublink' href='/Discipline/Details/{0}'>{1}</a></li>", discipline.DisciplineID, discipline.Name); 
     } 
     return new MvcHtmlString(sbuilder.ToString()); 
    } 
} 

ответ

4

Вы можете реализовать подобное.

  1. Enum для роли
  2. FilterAttribute
  3. Создать Web.sitemap для меню
  4. Добавить меню Создатель Действие
  5. Добавить меню в _Layout.cshtml
  6. Добавить FilterAttribute в контроллер или действие

---- 1 Enum ------

public enum Roles{ 
    Common=1, 
    Student = 2, 
    Teacher=4 
    Administration=8 
} 

---- 2 ---- RequirePermissionFilter

public class RequirePermissionFilter : ActionFilterAttribute, IAuthorizationFilter 
{ 

     private readonly Roles[] _requiredRoles; 
     public RequirePermissionFilter(Roles requiredRoles) 
    { 
     _requiredRoles = new Roles[] { requiredRoles }; 
    } 

    public RequirePermissionFilter(Roles[] requiredRoles) 
    { 
     _requiredRoles = requiredRoles; 
    } 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var success = false; 

     foreach (Roles role in _requiredRoles) 
     { 
      success |= _authManager.HasPermission(role); 
     } 

     if (success) 
     { 
      var cache = filterContext.HttpContext.Response.Cache; 
      cache.SetProxyMaxAge(new TimeSpan(0)); 
      cache.AddValidationCallback((HttpContext context, object data, ref HttpValidationStatus validationStatus) => 
      { 
       validationStatus = this.OnCacheAuthorization(new HttpContextWrapper(context)); 
      }, null); 
     } 
     else 
     { 
      this.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
    private void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // Ajax requests will return status code 500 because we don't want to return the result of the 
     // redirect to the login page. 
     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new HttpStatusCodeResult(500); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult("Error - 401", null); 
     } 
    } 
    public HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext) 
    { 
     var success = false; 

     foreach (Roles role in _requiredRoles) 
     { 
      success |= _authManager.HasPermission(role); 
     } 

     if (success) 
     { 
      return HttpValidationStatus.Valid; 
     } 
     else 
     { 
      return HttpValidationStatus.IgnoreThisRequest; 
     } 
    } 
} 

---- 3 ----- Web.sitemap Создатель

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="" roleName="" title="" menuVisible="True"> 
     <siteMapNode url="~/Home/Index" roleName="-1" title="Home" menuVisible="True"/> 
     <siteMapNode url="~/Student/Index" roleName="2 title="Student" menuVisible="True"> 
      <siteMapNode url="~/MyLessons/Index" roleName="2 title="My Lessons" menuVisible="True"/> 
     </siteMapNode> 
     <siteMapNode url="~/Teacher/Index" roleName="4 title="Teacher" menuVisible="True"/> 
     <siteMapNode url="~/Administration/Index" roleName="8 title="Administration" menuVisible="True"/> 
    </siteMapNode> 
</siteMap> 

---- 4 меню Действие ----

public class CommonController : Controller{ 

    public ActionResult NavigationMenu() 
     { 
      return Content(SiteMapMenu()); 
     } 
     public string SiteMapMenu() 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("<div class='menu'><ul>"); 
      var topLevelNodes = SiteMap.RootNode.ChildNodes; 


      foreach (SiteMapNode node in topLevelNodes) 
      { 
       if (HasPermission(node) && IsVisible(node)) 
       { 
        if (SiteMap.CurrentNode == node) 
         sb.Append("<li class='selectedMenuItem'>"); 
        else 
         sb.Append("<li>"); 

        if (!string.IsNullOrEmpty(node.Url)) 
         sb.AppendFormat("<a href='{0}'>{1}</a>", Url.Content(node.Url), node.Title); 
        else 
         sb.AppendFormat("<a href='javascript:void(0)'>{0}</a>", node.Title); 
        if (node.HasChildNodes && AnyOfChildIsVisible(node)) 
        { 

         foreach (SiteMapNode childNode in node.ChildNodes) 
         { 
          if (HasPermission(childNode) && IsVisible(childNode)) 
          { 
           sb.Append("<li>"); 
           sb.AppendFormat("<a href='{0}'>{1}</a>", Url.Content(childNode.Url), childNode.Title); 
           sb.Append("</li>"); 
          } 
         } 

         sb.Append("</ul></div>"); 
        } 

        sb.AppendLine("</li>"); 
       } 
      } 
      sb.AppendLine("</ul></div>"); 
      return sb.ToString(); 
     } 
     private bool HasPermission(SiteMapNode node) 
     { 
      int roleName = int.Parse(node["roleName"].ToString()); 
      if ((roleName == -1) || (_authManager.HasPermission((Roles)roleName))) 
       return true; 
      return false; 
     } 
     private bool IsVisible(SiteMapNode node) 
     { 
      return bool.Parse(node["menuVisible"]); 
     } 

     private bool AnyOfChildIsVisible(SiteMapNode node) 
     { 
      foreach (SiteMapNode item in node.ChildNodes) 
      { 
       if (IsVisible(item)) 
        return true; 
      } 
      return false; 
     } 
} 

---- 5 Добавить помощник _Layout.cshtml

@Html.Action("NavigationMenu", "Common") 

---- 6 ---- Контроллер

[RequirePermissionFilter(Roles.Student)] 
public class StudentController : Controller{ 
    /* 
    * 
    * 
    * 
    * 
    */ 

} 

---- AuthManager ---

public interface IAuthManager 
{ 


    bool HasPermission(Roles requiredRole); 
} 

public class AuthManager : IAuthManager 
{ 
    private ISessionManager _sessionManager; 
    private ISuggestionConfig _config; 

    public bool HasPermission(Roles requiredRoles) 
    { 
     if (HttpContext.Current.Session["USER"] != null) 
      return (requiredRoles & ((User)HttpContext.Current.Session["USER"]).Roles) == requiredRoles; 
     else 
      return false; 
    } 
} 
+0

ничего себе, что было быстро, я думаю, что мне нравится этот способ, но где аутентификация происходит? и где передать роль фильтру также я использую помощник для создания подменю для дисциплины из базы данных. роли также из базы данных. Обновите сообщение, чтобы включить, как я генерирую благодарность подменю. Аутентификация –

+0

происходит в фильтре 'RequirePermissionFilter'. Вы должны выполнить минимальную требуемую роль; '[RequirePermissionFilter (Roles.Student)]'. Вы должны добавить роль пользователя в сеанс при аутентификации. Затем проверьте объект сеанса, если у пользователя есть минимальная требуемая роль. – Yorgo

+0

Я имею в виду сценарий, который происходит после входа в систему из базы данных. Предполагая, что я реализовал все, как он работает в увеличенной картине '1' я нахожу пользователя, соответствующего переданному имени пользователя/паролю ' 2' Я сохраняю этот пользовательский объект в сеансе '3' Я создаю RequestPermission, передав role it '4' фильтр начинает проверку ролей для каждого аннотированного контроллера, тогда хорошо идти? –