2011-11-23 49 views
15

什麼大家做處理在ASP.NET MVC應用程序的安全性(檢索和修改)的個人記錄?該應用程序具有與Web用戶界面完全分離的服務/業務層和數據訪問層。我已經在使用會員和角色提供商來處理我的應用程序中特定區域/功能的身份驗證和授權,但現在我需要確保單個記錄的安全。處理記錄/實體級別的安全

例如,假設Bob可以創建和編輯自己的FooBar的記錄。我想確保其他用戶無法查看或編輯Bob的記錄。我想防止URL操作和/或編程錯誤。我們也可能希望允許Bob與其他用戶共享他的FooBars,允許他們查看但不編輯他的記錄。

有幾種方法我想出了:

  • 執行安全檢查的數據訪問層,直接在檢索和修改查詢。
  • 檢查安全服務層,業務邏輯出發之前執行額外的安全性的查詢。
  • 創建用戶界面和服務層之間存在一個安全層。 UI將通過安全層發出所有請求。
  • 使用面向方面編程(AOP)。創建安全方面並使用安全屬性修飾服務層方法。

我已經在以前的項目中的數據訪問層(在查詢中)安全,它總是變成一團糟。我想知道其他人在做什麼,並且使用的是幫你哪些框架

回答

2

我總是拿第二和/或你的方法3日(AOP框架) - 一個明確的安全層某處的UI之間邏輯處理程序。

AOP聽起來像一個辦法徹底失去對代碼控制和DAL安全聽起來像一種錯誤的做法,因爲它混淆了不同的責任。

2

我認爲把邏輯處處可能是一個問題。我有類似的情況。讓我解釋我如何處理它。

public class FooBarController : Controller 
{ 

    //this is easy as compared to edit 
    [Authorized] 
    public ActionResult Create() 
    { 


    } 


    [AjaxAuthorize(Roles = "Administrator")]  
    public ActionResult Edit(int id) 
    { 


    } 
} 

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 


     var id = filterContext.RouteData.Values["id"]; 
     // Here you can check if the id belongs to logged in user 
     var content = SomeRepository.GetById(id); 
     if (contet.OwnerId=LoggedInUser.Id) 
      return; 

     //otherwise check if logged in user is from some Admin or other role. 


     string redirectPage = "/account/logon"; 
     var roles = base.Roles.Trim().Split(','); 
     bool CanAccess = false; 

     //If no role is there 
     if (base.Roles.Equals(string.Empty) || roles.Count() == 0) 
     { 
      CanAccess = true; 
     } 
     else 
     { 
      foreach (var item in roles) 
      { 
       CanAccess = filterContext.HttpContext.User.IsInRole(item); 
       if (CanAccess) 
        break; 
      } 
     } 

     var request = filterContext.RequestContext.HttpContext.Request; 
     if (request.IsAjaxRequest()) 
     { 
      if (!(request.IsAuthenticated && CanAccess)) 
      { 
       filterContext.Result = new AjaxAwareRedirectResult(redirectPage); 
       return; 
      } 
     } 

     base.OnAuthorization(filterContext); 
    } 
} 

public class AjaxAwareRedirectResult : RedirectResult 
{ 
    public AjaxAwareRedirectResult(string url) 
     : base(url) 
    { 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 

      string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); 

      JavaScriptResult result = new JavaScriptResult() 
      { 
       Script = "window.location='" + destinationUrl + "';" 
      }; 
      result.ExecuteResult(context); 
     } 
     else 
      base.ExecuteResult(context); 
    } 
} 

現在您可以允許所有者或管理員編輯內容。 我將此屬性稱爲Ajax,因爲它也會處理AjaxRequest。 我希望這可以幫助。

問候

Parinder

0
public class Entity 
{ 
    public Right[] Rights { get; set; }   
} 

public class Right 
{ 
    public User user {get;set;} 
    public Permission[] permissions {get;set;} 

} 

public class Foo : Entity 
{ 


} 

public class Bar : Entity 
{ 

} 

在上述的方法有一個基類實體,其存儲特定用戶擁有該實體的權利。繼承你想從Entity類中保護的所有類。