2016-07-19 15 views
20

Tôi đang khám phá lớp SignInManager. Nhưng thông tin được cung cấp trên MSDN rất vô dụng. Nó chỉ cho biết các phương thức và thuộc tính được cung cấp là gì.SignInManager, nó là gì và cách sử dụng?

Điều tôi đang tìm kiếm là,

1) SignInManager là gì? 2) Cách sử dụng? 3) Và tôi có cơ sở dữ liệu riêng chứa thông tin đăng nhập liên quan (tên người dùng và mật khẩu)

Tôi có thể sử dụng SignInmanager như thế nào và sử dụng nó để cơ sở dữ liệu tùy chỉnh của tôi được sử dụng để xác thực người dùng?

Tôi đang sử dụng asp.net MVC 5 và Visual Studio 2015. Trong dự án mẫu của tôi, tôi có tài khoản điều khiển có chứa các phương pháp hành động như

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 

Nhưng tôi không có ý tưởng làm thế nào để sử dụng nó, MSDN là hoàn toàn vô dụng để cung cấp thông tin về điều này. Bất kỳ liên kết hữu ích nào giải thích chi tiết vì tôi không biết SignInManager là gì và nó là gì.

Cảm ơn

Trả lời

28

Disclaimer: Tôi bối rối bởi mô hình được sử dụng trong ASP.NET sắc bản thân mình và những gì tôi nói là sự hiểu biết của tôi về mọi thứ, có thể không chính xác (tôi cũng có thể nêu những điều hiển nhiên, vì vậy tôi xin lỗi) . Ngoài ra, tôi đã chơi với bản sắc của Asp.Net Core gần đây mà là hơi khác so với những gì đã có sẵn cho Asp.Net 4, vì vậy tôi có thể kết hợp mọi thứ lên.

Cookie

Bản sắc ASP.NET hoạt động với hai loại cookie: Cookie ứng dụng và cookie bên ngoài. Cookie ứng dụng chứa thông tin nhận dạng của ứng dụng của bạn và được cấp bởi người quản lý đăng nhập. Cookie bên ngoài chứa danh tính nhà cung cấp xác thực bên ngoài và được cấp bởi phần mềm trung gian xác thực (chẳng hạn như FacebookAuthenticationMiddleware, ví dụ). Bạn sử dụng trình quản lý đăng nhập để sử dụng cookie bên ngoài và phát hành cookie ứng dụng thay thế. Nếu bạn không sử dụng xác thực bên ngoài, bạn không xử lý các cookie bên ngoài.

Đăng nhập quản lý

Lớp tuyên bố như thế này:

public class SignInManager<TUser, TKey> : IDisposable 
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey> 

Vì vậy, bạn có thể sử dụng bất kỳ lớp như người dùng của bạn miễn là nó thực hiện giao diện IUser<TKey>. Hoặc sử dụng IdentityUser làm cơ sở của bạn nếu bạn bắt đầu từ đầu, thực hiện IUser<string>. Trong quá khứ, tôi đã cố tạo một triển khai sử dụng intTKey, nhưng đã bỏ qua nỗ lực sau khi dành một chút thời gian để cố gắng thực hiện và không thấy bất kỳ tiến bộ nào.

Mật khẩu đăng nhập

SignInManager.SignInAsync vấn đề phương pháp Cookie ứng dụng cho người sử dụng xác định ngay lập tức mà không cần bất kỳ séc, vì vậy nếu bạn thực hiện bất kỳ logic xác thực tùy chỉnh, bạn có thể muốn sử dụng nó (asp.net MVC mặc định mẫu sử dụng nó sau khi đăng ký người dùng để họ không phải xác thực ngay sau khi đăng ký).

SignInManager.PasswordSignInAsync khi tên người dùng và mật khẩu kiểm tra tính hợp lệ của chúng và phát hành cookie ứng dụng nếu chúng đúng.

dấu hiệu bên ngoài trong

Thay vì có người dùng tạo đăng nhập và mật khẩu cho trang web của bạn đặc biệt bạn có thể muốn họ sử dụng một số trang web bên ngoài để xác thực và chuyển thông tin xác thực để bạn có OAuth.

Asp.Net nhận dạng có khái niệm về UserLogin, nơi User là ... tốt, người sử dụng (một người), và Login là chứng chỉ mà User xác thực. User có thể có nhiều Login s.

dòng OAuth như đã thấy từ trang web Asp.Net trông như thế này (dựa trên nhật ký mặc định trong dòng chảy được tạo ra bởi VS mẫu):

  1. Bạn thiết lập các nhà cung cấp chứng thực bên ngoài (authentication middleware) mà bạn đang Ví dụ, để sử dụng xác thực Facebook, bạn cần phải tạo ứng dụng Facebook, thiết lập URL trả lại ở đó để trỏ đến trang web của bạn và cấu hình FacebookAuthenticationMiddleware với ID ứng dụng và ứng dụng Facebook bí mật cung cấp cho bạn).
  2. Bạn trình bày người dùng chưa được xác thực với lựa chọn nhà cung cấp bên ngoài mà bạn hỗ trợ.
  3. tài chọn một nhà cung cấp, sự lựa chọn sẽ được gửi đến ứng dụng web Asp.Net của bạn
  4. ứng dụng Web đưa ra một ChallengeResult chứa tên của nhà cung cấp để được sử dụng (điều này thường xảy ra trong AccountController.ExternalLogin), URL trả về được thiết lập để gọi AccountController.ExternalLoginCallback và người dùng URL trả lại thực tế sẽ kết thúc sau được lưu lại sau.
  5. Phần mềm trung gian thích hợp bắt đối tượng ChallengeResult và chuyển đổi nó thành phản hồi chuyển hướng HTTP khiến trình duyệt của người dùng truy cập trang web của bên thứ ba yêu cầu người dùng xác thực.
  6. Trang web phần thứ ba khi xác thực thành công chuyển hướng người dùng trở lại trang web của bạn đến URL cụ thể được tạo bởi phần mềm trung gian xác thực (đối với Facebook là /signin-facebook IIRC).
  7. Phần mềm trung gian xác thực chặn cuộc gọi này, xác thực dữ liệu được chuyển bởi trang web của bên thứ ba và nếu mọi thứ OK phát hành cookie bên ngoài và chuyển hướng bạn đến bất kỳ thứ gì được đặt làm URL trả lại ở bước 4 (phải là AccountController.ExternalLoginCallback).
  8. Trong AccountController.ExternalLoginCallback bạn sẽ phải sử dụng cookie bên ngoài và phát hành cookie ứng dụng thay thế. Đó là những gì SignInManager.ExternalSignInAsync thực hiện: với thông tin đăng nhập, nó cố tìm người dùng với số Login. Nếu nó tìm thấy, nó phát hành Cookie ứng dụng; nếu không, nó sẽ thông báo cho bạn và bạn nên làm những gì bạn nghĩ là đúng khi bạn nhận được không rõ Login (nói chung, bạn tạo người dùng mới tại thời điểm này. Mặc định thực hiện từ mẫu VS yêu cầu thêm thông tin tại thời điểm này và tạo người dùng trong AccountController.ExternalLoginConfirmation). Sau khi người dùng được chuyển hướng đến URL trả về thực tế "cứu sử dụng sau" trong bước 4.

lưu trữ Tuỳ chỉnh

Tôi đã không thành công cho đến nay với việc tạo ra lưu trữ tùy chỉnh cho Asp.Net Identity. Thông thường, việc triển khai lớp người quản lý người dùng của riêng bạn giảm dần UserManager<TUser, TKey> và lớp lưu trữ triển khai một loạt các giao diện như IUserStore<TUser, TKey>, IUserRoleStore<TUser, TKey>, v.v.

+0

Câu trả lời rất hay.Về bước 8 trong đăng nhập bên ngoài, tôi có nên sử dụng signinmanager trong api web không? –

+0

'SignInManager' là một lớp trợ giúp liên quan đến cookie bên ngoài/ứng dụng, xác thực mật khẩu và 2FA. Bạn không biết chắc cách nào trong số đó hữu ích cho API Web. – n0rd

+1

Rất rõ ràng và hữu ích. Ngay cả rõ ràng thường cần phải được trình bày rõ ràng! Cảm ơn bạn! –

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