2014-02-22 81 views
0

我正在開發一個MVC4網站。我開發了用戶角色和權限。在操作篩選器或Authroize篩選器上驗證用戶權限?

我想問我應該在哪裏檢查用戶權限訪問權限:在自定義操作過濾器還是自定義授權過濾器中?

如果用戶無法訪問模塊,則必須顯示烤麪包機錯誤消息。如何在動作過濾器中顯示此消息?

+2

使用授權屬性 - http://stackoverflow.com/questions/2504923/how-to-redirect-authorize-to-loginurl-only-when-roles-are-not-used。讓我知道它是否有幫助。 – ramiramilu

回答

2

我用來編寫自定義操作過濾器屬性,以便在動作調用時調用此方法,如果用戶角色允許他調用此操作,則檢查它。

你必須編寫自定義操作過濾器屬性相同的方式,但你必須寫在CheckAccessRight方法自己的業務邏輯:

public class AuthorizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string actionName = filterContext.ActionDescriptor.ActionName; 
     string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 



     if (!CheckAccessRight(actionName, controllerName)) 
     { 
      string redirectUrl = string.Format("?returnUrl={0}", filterContext.HttpContext.Request.Url.PathAndQuery); 

      filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 


    private bool CheckAccessRight(string Action, string Controller) 
    { 
     if (HttpContext.Current.Session["userId"] != null) 
     { 
      string userID = HttpContext.Current.Session["userId"].ToString(); 
      using (var db = new cloud_clinicEntities()) 
      { 
       assignment objAss = null; 
       if (HttpContext.Current.Session["AccountType"].ToString() == "lab") 
       { 
        objAss = db.assignments.SingleOrDefault(model => model.userid == userID); 
       } 
       else 
       { 
        objAss = db.assignments.SingleOrDefault(model => model.employeeId == userID); 
       } 

       String UserRole = objAss.itemname; 

       itemchildren objChild = db.itemchildrens.SingleOrDefault(model => model.parent == UserRole && model.child == Controller + " " + Action); 

       if (objChild != null) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 


      } 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

,然後在行動像這樣使用這個屬性:

[AuthorizationAttribute] 
     public ActionResult MyAction() 
     { 
     } 
0

Here's一篇好文章。您可以爲管理員等多個角色設置自己的屬性。