0

我選擇做asp.net MVC3學校的項目和有需要用戶/角色管理的。我認爲隨着asp.net發佈的會員資格對於學校項目來說太大了。 所以我的想法是這樣的。如果我能找到相當於Zend predispatch方法的asp或者更好的方法,我可以將url作爲角色的特權存儲,並在會話中加載它,並檢查特定用戶是否有權訪問它,如果不是,則重定向。微小的自定義角色管理asp.net的MVC 3

我的問題是這樣的:

是否有ASP PreDispatch方法的任何等效?
有沒有更好的方法來解決我的問題?如果是,請上傳資源

感謝您閱讀本

編輯 我生成使用這個從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. 枚舉的角色
  2. FilterAttribute
  3. 菜單
  4. 添加菜單製作動作
  5. 添加菜單_Layout.cshtml
  6. 添加FilterAttribute到控制器或者動作
創建Web.sitemap中

---- 1枚舉------

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

哇真快,我想我喜歡這種方式,但其中身份驗證發生?以及將角色傳遞給過濾器的位置,同時我還使用幫助程序爲databse中的規則生成子菜單。角色來自數據庫too.will更新帖子,包括我如何生成子菜單感謝。 'RequirePermissionFilter'過濾器中發生了 – 2012-02-28 10:04:08

+0

認證。你必須像這樣通過最低要求的角色; '[RequirePermissionFilter(Roles.Student)]'。您必須將用戶角色添加到身份驗證的會話中。然後檢查會話對象是否具有最低要求的角色。 – Yorgo 2012-02-28 10:30:02

+0

我的意思是從數據庫登錄後發生的情況。假設我實現了一切,它如何工作在更大的圖片 '1'我發現一個用戶對應於傳遞的用戶名/密碼 '2'我將該用戶對象存儲在會話中 '3'我通過傳遞實例化RequirePermission角色 '4'過濾器開始檢查每個註釋控制器的角色然後很好去? – 2012-02-28 10:44:31