2012-12-15 32 views
9

Xây dựng trang web cũng sẽ yêu cầu API và do đó (có thể) hỗ trợ OAuth cho đăng nhập Tôi nghi ngờ cách tiếp cận người dùng và phần xác thực.Xác thực với hỗ trợ Asp.Net, RavenDB và OAuth

Vì vậy, tôi đã có ứng dụng ASP.NET MC4 với RavenDB.

Cách tiếp cận tốt nhất là gì?

  • Để sử dụng một trong các nhà cung cấp thành viên cho RavenDB và xử lý riêng Oauth trong phần API? Ví dụ: Giải pháp của Griffin here.

  • Hoặc để tạo giải pháp tùy chỉnh thực hiện lại thành viên-crap và hỗ trợ OAuth.

Tôi không thực sự chắc chắn bắt đầu từ đâu, mọi đề xuất về cách thực hiện điều này được đánh giá cao.

Trả lời

10

enter image description here

** Clicky-click for da GitHub project **

IMO, quên tên người dùng lưu trữ và mật khẩu. Đó là nói chuyện điên rồ! Cho phép mọi người đăng nhập bằng thông tin đăng nhập Facebook, Google hoặc Twitter của họ. Đó là 80% cho các trang web phổ biến.

Xác thực và lưu trữ thông tin đăng nhập là hai tác vụ khác nhau IMO. Ví dụ, tôi không quan tâm nơi bạn xác thực với .. và một khi bạn làm .. Tôi không quan tâm làm thế nào bạn lưu trữ dữ liệu đó :)

Cá nhân, tôi sẽ lưu nó trong một RavenDb .. nhưng đó là của tôi lựa chọn cá nhân.

Như vậy -> giữ hai nhiệm vụ này là RIÊNG (IMO) rất quan trọng.

enter image description here

Vì vậy lets look at some codez ....

public ActionResult AuthenticateCallback(string providerKey) 
{ 
    // SNIP SNIP SNIP SNIP 

    var model = new AuthenticateCallbackViewModel(); 
    try 
    { 
     // SNIP SNIP SNIP SNIP 

     // Complete the authentication process by retrieving the UserInformation from the provider. 
     model.AuthenticatedClient = _authenticationService.CheckCallback(providerKey, Request.Params, state.ToString()); 


     // Create a new user account or update an existing account. 
     // Whatever you end up doing, this is the part u want to 
     // pass this data to your repository (eg. RavenDb, Sql Server, etc) 
     // I'll use RavenDb in this example... 
     // And yes .. this is a contrite example. U might want to check for 
     // existing email or id or whatever u need to do, etc. 
     var myUser = Mapper.Map(model.AuthenticatedClient); 
     session.Store(myUser); 
     session.SaveChanges(); 

     // SNIP SNIP SNIP SNIP 
    } 
    catch (Exception exception) 
    { 
     model.Exception = exception; 
    } 

    return View(model); 
} 

Vì vậy, cho phép nhìn vào những gì tôi đã thực hiện.Tôi đã rút ra bất kỳ công cụ tiết (kiểm tra giá trị, vv) mà chỉ là tiếng ồn trong câu trả lời SO này.

Trước tiên, tôi xử lý gọi lại Xác thực. Ví dụ. Tôi vừa mới truy cập Facebook và đã nói 'có! bạn là bạn '.. và nó trở lại trang web của tôi, với một số dữ liệu tôi đã yêu cầu nó cho tôi.

Tiếp theo ... chúng tôi được cung cấp một số dữ liệu từ Facebook .. nhưng điều này có thể không có định dạng mà chúng tôi muốn đưa vào trong RavenDb. Vì vậy, tôi chuyển đổi nó từ định dạng cũ sang một lớp học mới sáng bóng User đó là những gì bạn sẽ dính vào Db của bạn.

Thứ ba - Tôi lưu trữ giá trị này trong Db. Đây là nơi bạn sẽ thực hiện bất kỳ logic DB tùy chỉnh nào

.

M O D U L A R I Z E T H A T S H I T

The.End.

Bây giờ xin lỗi .. có vài giờ trước khi The Apocalypse. Tôi phải tự chuẩn bị.

+0

Tôi đã làm chính xác điều này. Nhu cầu của tôi là xác định người dùng, không xác thực - họ có thể làm điều đó chống lại bất cứ điều gì. Vì vậy, điều này hoạt động. Bây giờ tôi đã lưu trữ User trong DB của mình, tôi cần sử dụng nó cùng với hệ thống thành viên ASP.NET. Vì vậy, tôi có thể gắn cờ các hành động với [Ủy quyền] và [AllowAnonymous], trả về url, vv các tính năng dựng sẵn trong ASP.NET. Làm thế nào để làm điều đó? Với điều này: http://www.codethinked.com/setting-up-authentication-in-aspnet-mvc – esbenr

+2

@esbenr Để sử dụng các thuộc tính '[Ủy quyền]', v.v .. bạn ** KHÔNG ** (và tôi lặp lại, ** KHÔNG **) cần sử dụng hệ thống Thành viên ASP.NET. ** XIN VUI LÒNG KHÔNG SỬ DỤNG R ATNG TẤT CẢ NÀO, DƯỚI BẤT K C ĐẶC ĐIỂM ** (Google vì lý do tại sao 1000000). Để tận dụng '[Ủy quyền]', v.v .. u chỉ cần sử dụng lưu trữ thông tin sử dụng trong một 'IPrincipal' và' IIdentity' (có, 2x của tôi). Chỉ cần tạo một 'GenericPrincipal' mới và trong đó, thêm một' GenericIdentity' mới. Google cho những người có thêm mã :) –

+0

Cảm ơn, đó là những gì tôi đã làm. Tôi chỉ sử dụng cookie Auth ticket + để có được tên miền chính của NGƯỜI DÙNG để làm việc - nó hoạt động như một nét duyên dáng :-) Phương pháp này được nói nhiều nơi trên internet-thingie. BTW: Tôi đã tạo ra một triển khai IPrinciple tùy chỉnh và một tùy chỉnh IIdentity impl. do đó tôi muốn nhiều thuộc tính hơn trong ngữ cảnh Người dùng của mình. Cảm ơn vì đã trả lời./esbenr – esbenr

0

Vâng. Các nhà cung cấp thành viên đang cồng kềnh. Nếu bạn không có kế hoạch sử dụng các tính năng trong chúng nhưng chỉ OAuth tôi sẽ không sử dụng chúng. SimpleMembership và nhà cung cấp lời thề được cung cấp trong MVC4 là tiếc là ngay cả một mớ hỗn độn lớn hơn.

Vì vậy, lựa chọn của bạn là:

  1. Sử dụng SimpleMembership
  2. Việc xây dựng trong hỗ trợ OAuth
  3. Sử dụng một nhà cung cấp thành viên tùy chỉnh
  4. Sử dụng một nhà cung cấp tùy chỉnh oauth

Nếu bạn kế hoạch để dính vào # 3 Tôi sẽ khuyên bạn nên sử dụng của tôi (trong Griffin.MvcContrib). Nó không phải tầm thường để xây dựng một nhà cung cấp thành viên.

Đối với oauth bạn có một giải pháp như: https://github.com/rafek/SimpleSocialAuth

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