2011-11-23 37 views
15

Mọi người đang làm gì để xử lý bảo mật (truy xuất và sửa đổi) các bản ghi riêng lẻ trong một ứng dụng ASP.NET MVC? Ứng dụng này có một lớp dịch vụ/kinh doanh và một lớp truy cập dữ liệu hoàn toàn tách biệt với giao diện người dùng Web. Tôi đã sử dụng các nhà cung cấp thành viên và vai trò để xử lý xác thực và ủy quyền cho các khu vực/tính năng cụ thể trong ứng dụng của tôi, nhưng bây giờ tôi cần phải bảo mật các bản ghi riêng lẻ.Xử lý bảo mật mức kỷ lục/thực thể trong ứng dụng ASP.NET MVC

Ví dụ: giả sử Bob có thể tạo và chỉnh sửa các bản ghi FooBar của riêng mình. Tôi muốn đảm bảo rằng những người dùng khác không thể xem hoặc chỉnh sửa hồ sơ của Bob. Tôi muốn bảo vệ chống lại thao tác URL và/hoặc các lỗi lập trình. Chúng tôi cũng có thể muốn cho phép Bob chia sẻ FooBars của anh ấy với những người dùng khác, cho phép họ xem nhưng không chỉnh sửa hồ sơ của anh ấy.

Có một số cách tiếp cận tôi đã đưa ra:

  • Làm kiểm tra an ninh trong lớp Data Access, trực tiếp trong việc thu hồi và sửa đổi các truy vấn.
  • Kiểm tra bảo mật trong lớp Dịch vụ, thực hiện các truy vấn bảo mật bổ sung trước khi tiếp tục với logic nghiệp vụ.
  • Tạo lớp Bảo mật tồn tại giữa giao diện người dùng và lớp Dịch vụ. Giao diện người dùng sẽ thực hiện tất cả các yêu cầu thông qua lớp Bảo mật.
  • Sử dụng lập trình hướng-khía cạnh (AOP). Tạo các khía cạnh bảo mật và trang trí các phương thức lớp dịch vụ với các thuộc tính bảo mật.

Tôi đã thực hiện bảo mật trong lớp Truy cập dữ liệu (trong truy vấn) trong các dự án trước đó và nó luôn biến thành một mớ hỗn độn. Tôi muốn biết mọi người đang làm gì và bạn đang sử dụng những khuôn khổ nào để giúp bạn (các khuôn khổ AOP.)

Trả lời

2

Tôi luôn sử dụng phương pháp tiếp cận thứ hai và/hoặc thứ ba - một lớp bảo mật rõ ràng ở đâu đó giữa giao diện người dùng và xử lý logic.

AOP âm thanh như một cách để mất hoàn toàn quyền kiểm soát mã và bảo mật trong DAL có vẻ giống như một cách tiếp cận sai vì nó trộn lẫn các trách nhiệm khác nhau.

2

Tôi nghĩ đặt logic ở mọi nơi có thể là một vấn đề. Tôi có tình huống tương tự. Hãy để tôi giải thích cách tôi xử lý nó.

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); 
    } 
} 

Giờ đây bạn có thể cho phép chủ sở hữu hoặc quản trị viên chỉnh sửa nội dung. Tôi gọi thuộc tính này là Ajax, vì nó cũng sẽ xử lý AjaxRequest. Tôi hy vọng điều này sẽ hữu ích.

Trân

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 
{ 

} 

Trong cách tiếp cận trên có một Entity lớp cơ sở mà lưu trữ các quyền một người dùng cụ thể có trên thực thể đó. Kế thừa tất cả các lớp bạn muốn bảo mật từ lớp Entity.

Các vấn đề liên quan