2012-06-30 36 views
6

Mặc dù tôi đã quen với việc sử dụng Nhà cung cấp thành viên ASP.Net tiêu chuẩn cho các ứng dụng web MVC mới, tôi đã nhận được một cú đá ra khỏi việc sử dụng RavenDb gần đây nhưng tôi vẫn không tin rằng tôi có một nắm bắt về thực hành tốt nhất để triển khai xác thực người dùng và ủy quyền vai trò.Làm cách nào để xác thực và ủy quyền được triển khai bằng RavenDb trong ứng dụng MVC?

Code tôi đã thay thế các phương pháp đăng ký và đăng nhập của tôi với trong AccountController trông giống như sau:

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    using (IDocumentSession Session = DataDocumentStore.Instance.OpenSession()) 
    { 
     Session.Store(new AuthenticationUser 
     { 
      Name = Email, 
      Id = String.Format("Raven/Users/{0}", Name), 
      AllowedDatabases = new[] { "*" } 
     }.SetPassword(Password)); 
     Session.SaveChanges(); 
     FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false); 
     // ...etc. etc. 


    [HttpPost] 
    public JsonResult JsonLogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      using (IDocumentSession Session = DataDocumentStore.Instance.OpenSession()) 
      { 
       book Ok = Session.Load<AuthenticationUser>(String.Format("Raven/Users/{0}", Username)).ValidatePassword(Password); 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       // etc... 

Tôi đã nhìn thấy mã Provider RavenDb viên rằng một số người đã được tham chiếu trong bài viết tương tự hoặc các câu hỏi, nhưng dường như có một số người cho rằng điều này vượt lên trên và tận dụng một API không hiệu quả cho một kho lưu trữ dữ liệu mà không cần hầu hết những gì được cung cấp bên trong nó.

Vậy chiến lược thiết kế/kiến ​​trúc tốt nhất cho xác thực RavenDb là gì (không phải cho OAuth, nhưng Xác thực Mẫu) và tôi có đang sủa cây đúng không?

+0

Tôi đã cung cấp nhà cung cấp (beta) cho RavenDb tại đây: https://github.com/jgauffin/griffin.mvccontrib/tree/master/source/Griffin.MvcContrib.RavenDb Nó cũng có sẵn dưới dạng gói gói: ' griffin.mvccontrib.ravendb' Cách sử dụng: https://github.com/jgauffin/griffin.mvccontrib/wiki/Membershipprovider – jgauffin

+0

Cảm ơn. Tôi đã nhìn thấy một vài cách tiếp cận vấn đề này và Ayende cũng có các gói (như phần mở rộng, nói lỏng lẻo) để giải quyết auth. Tôi đã viết blog những phát hiện của mình ở đây: http://mytechworld.officeacuity.com/index.php/2012/07/authentication-and-authorization-in-mvc-projects-using-ravendb –

Trả lời

2

Tôi nghĩ có một vài phần trong vấn đề này. Đầu tiên, từ quan điểm của dự án MVC, bạn thực sự muốn sử dụng cái gì đó sẽ làm việc với AuthorizationAttribute. Điều này thực sự không yêu cầu sử dụng một MembershipProvider cho mỗi se, mà là nhồi một IPrincipal thích hợp vào HttpContext.Current.User vì đó là những gì mà các thuộc tính đó xem xét để cho phép mọi thứ. Từ góc độ HTTP, việc tận dụng cơ sở hạ tầng xác thực biểu mẫu hiện có cũng giúp bạn giải quyết được hầu hết các vấn đề bảo mật mà bạn thực sự không nên tự giải quyết và rất linh hoạt trong việc làm việc với những gì bạn cung cấp.

Từ đó bạn có được ý chính của câu hỏi - cách bạn muốn quay lại hệ thống xác thực của mình từ góc độ dữ liệu. Tôi nghĩ đó là một cuộc gọi rất chiến thuật - một số ứng dụng có thể có ý nghĩa khi chỉ sử dụng mô hình kiểu MembershipProvider. Nhưng nếu tôi có một ứng dụng rất tập trung vào người dùng, nơi tôi đã lưu trữ rất nhiều dữ liệu người dùng, tôi có thể xem xét việc cuộn một cửa hàng người dùng tùy chỉnh dựa trên các yêu cầu của tôi. Nếu bạn đang sử dụng gói Xác thực, bạn có thể glom vào đó đến một mức độ nào đó. Nhưng tôi không nghĩ rằng có một quy tắc cứng rắn và nhanh chóng vào thời điểm này - làm những gì có ý nghĩa cho ứng dụng của bạn.

Một điều bạn không nên làm là sử dụng AuthenticationUser như trên - điều đó có nghĩa là cho người dùng hệ thống cơ sở dữ liệu. Trong các điều khoản của SQL Server sẽ giống như làm cho mọi người dùng trong ứng dụng của bạn là một người dùng SQL và sau đó xác thực với điều đó. Đó là cách một số sản phẩm mạng nội bộ cũ được sử dụng để làm việc nhưng thế giới đã vượt qua điều đó ngay bây giờ.

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