2010-09-11 26 views
8

Tôi đang tạo trang web mới và tôi muốn người dùng có thể sử dụng một số cách để đăng nhập, về cơ bản người dùng sẽ có thể để tạo người dùng mới trên trang web của tôi HOẶC sử dụng kết nối Facebook HOẶC sử dụng tài khoản Twitter để đăng nhập vào trang web.Sử dụng xác thực hỗn hợp với Asp.Net MVC (Biểu mẫu, FB kết nối, twitter, openId)

Tôi đã thấy một số hướng dẫn về cách sử dụng một trong những phương pháp này, những gì tôi muốn biết là bạn nghĩ gì là cách tiếp cận tốt nhất để làm điều này?

Cho đến nay, tôi nghĩ cách tốt nhất là tạo mô hình xác thực tùy chỉnh (giống như phân loại các lớp ủy quyền hiện có).

Đây có phải là cách tiếp cận tốt nhất không? Bạn có thể chỉ cho tôi một ví dụ điển hình về một người nào đó đang cố gắng tương tự không?

Thanks a lot

Trả lời

8

Tôi viết blog về một cái gì đó tương tự gần đây ... Dưới đây là cách tiếp cận tôi mất

public class User { 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public string Page { get; set; } 

    public virtual Authentication Authentication { get; set; } 
} 

public class Authentication { 
    public int Id { get; set; } 
    public string LoginId { get; set; } 
    public string Provider { get; set; } 
    public string Password { get; set; } 

    public virtual User User { get; set; } 
} 

//login methods 
User StandardUserLogin(string username) { 
    IDataContext db = new DataContext(); 
    var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username); 
    if (user != null) { 
     if (user.Authentication.Password == password) { 
      SetAuthenticationTicket(user); 
      return user; 
     } 
    } 
} 

tôi sẽ tạo ra một phương pháp đăng nhập khác nhau đối với từng loại đăng nhập tùy thuộc vào cách chương trình uỷ quyền của họ công việc.

User OpenIdUserLogin(string username) { 
    IDataContext db = new DataContext(); 
    var user = db.Users.SingleOrDefault(u => u.Authentication.LoginId == username && u.Authentication.Provider == "openid"); 
    if (user == null) { 
     //create new openid user 
    } 

    if (user.Authentication.LoginId == id) { 
     SetAuthenticationTicket(user); 
     return user; 
     } 
} 

//openid's authentication method 
[ValidateInput(false)] 
public ActionResult Authenticate(string returnUrl) { 
    IAuthenticationResponse response = OpenId.GetResponse(); 

    if (response == null) { 
     //make openid request here 
    } else { 
     var user = OpenIdUserLogin(response.ClaimedIdentifier); 
    } 
} 

Btw, hai lớp ở phía trên đại diện của tôi Entity Framework POCOs Chìa khóa ở đây là Bảng xác thực đó là tách biệt với bảng dùng. Nó cho phép một người dùng có nhiều phương pháp đăng nhập. Hy vọng điều này sẽ giúp bạn giúp bạn đi đúng hướng.

+0

Câu hỏi nhanh; các phương thức này dành cho OpenID, không phải là Open Authentication, là phương thức mà Twitter sử dụng. Chúng tôi có thể thực hiện thủ tục tương tự cho dù đó là OpenID hay Open Auth không? – FelixMM

+0

Vâng, đó là các lớp POCO khá chung chung. Bạn có thể phải thêm một hoặc hai lĩnh vực nhưng tôi nghi ngờ nó cho kinh nghiệm hạn chế của tôi với twitter bạn chỉ cần lưu trữ mã thông báo auth của họ, mà sẽ được lưu trữ trong trường 'LoginId'. Sau đó, bạn sẽ chỉ gọi một phương thức khác trên các loại đăng nhập khác nhau. Vì vậy, thay vì OpenIdUserLogin bạn sẽ gọi một Twitter. Nếu tôi không quá bận rộn, tôi sẽ thêm một bài mới vào blog của tôi về nó nếu bạn gặp rắc rối :) – Buildstarted

+0

Cảm ơn bạn đã trả lời. Tôi đã thực hiện đăng nhập OpenID theo cách rất giống như bạn đã trả lời ở đây và bây giờ tôi sẽ cho oAuth. Tôi hiện đang theo hai liên kết sau: http://bit.ly/csBrgM và http://bit.ly/i8GwDh Chưa thử nghiệm, do đó, nó có thể thực sự tốt, hoặc thực sự xấu, nhưng một lần nữa, cảm ơn trả lời của bạn :) – FelixMM

1

Nếu bạn mở để chi tiêu một vài đô la mỗi tháng, Windows Azure Access Control Service sẽ cung cấp chức năng này làm nhà cung cấp tư cách thành viên cho ASP.NET. Đây cũng là cơ sở cho dòng thông tin xác thực SSO Windows 8 mới.

Lưu ý rằng Twitter chưa được hỗ trợ, tuy nhiên, do Kiểm soát truy cập không hỗ trợ OAuth 1.0.

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