5

Chúng tôi có một ứng dụng web hiện có được xây dựng trên MVC & Nhà cung cấp thành viên SQL để xác thực người dùng. Ứng dụng này cũng bao gồm màn hình quản lý quản trị để tạo/chỉnh sửa người dùng, đặt lại mật khẩu, kích hoạt tài khoản, v.v ... Đó là một hệ thống khá trưởng thành và đã được sản xuất trong ~ 2,5 năm.ASP.NET Identity & ASP.NET Membership Provider "Mashup"

Hiện tại chúng tôi có yêu cầu mới để hiển thị một số dữ liệu từ hệ thống qua API và chúng tôi đang xem xét WebApi như một công nghệ ứng cử viên.

Một trong những vấn đề tôi đang gặp phải là xung quanh xác thực. Tôi muốn tận dụng chức năng quản lý vai trò người dùng/vai trò hiện có trong ứng dụng của chúng tôi, để tạo và quản lý tài khoản API. Tuy nhiên vì tùy chọn ưa thích cho WebAPI là sử dụng ASP.NET Identity (yêu cầu/mã thông báo của người gửi, v.v ...) Tôi hơi bối rối về những lựa chọn tốt nhất sẽ là gì.

Có thể là một ý tưởng tồi hoặc không tốt bằng cách nhấn còi nào đó trong xác thực người dùng/mật khẩu của nhà cung cấp thành viên hiện tại vào mechs api auth web. Có một phương pháp trong ApplicationOAuthProvider, có vẻ như tôi có thể thao tác bằng cách thay thế dòng IdentityUser user = await userManager.FindAsync(context.UserName, context.Password); bằng một cuộc gọi đến MembershipProvider. Điều này có vẻ như rất cludgy.

Tư tưởng & các tùy chọn sẽ được đánh giá rất nhiều.

Trả lời

1

Điều này có thể được thực hiện bằng cách triển khai UserStore của riêng bạn. Tôi nghĩ rằng sẽ có rất nhiều con rồng mặc dù. Bạn sẽ phải suy nghĩ thông qua tất cả các kịch bản khác và đối chiếu cả hai: quên mật khẩu, xác nhận email, đếm số lần đăng nhập và thời gian chờ, v.v. Về cơ bản, mọi thứ cập nhật dữ liệu người dùng của bạn sẽ phải được suy nghĩ và có thể được thực hiện gấp đôi trong mỗi bộ bảng. Nếu bạn có thể thêm các cột vào bảng thành viên hiện có của mình để hỗ trợ giao diện của danh tính asp.net có thể hữu ích, nhưng tại một số điểm bạn sẽ kết thúc phần lớn phần truy cập dữ liệu và triển khai UserStore đầy đủ thay vì một phần lớn ủy quyền cho mã dựa trên Khuôn khổ thực thể gốc.

3

Không thực sự là câu trả lời, chỉ 0,02 xu của tôi.

Tôi nghĩ bạn sẽ dành nhiều thời gian cho Thành viên cung cấp giày thành viên để nhận dạng mới, vì sẽ cần phải cập nhật chính xác khung công tác Idenitty mới.

Tôi đã nâng cấp ở 2 hệ thống khác nhau, cả hai đều không nhỏ (một 200K, một dòng mã 70K khác) với số lượng người dùng mở rộng. Hệ thống nhỏ hơn đã cho tôi 7 ngày người đàn ông, lớn hơn một 5 ngày (tôi biết những gì tôi đã làm lần thứ hai -). Cả hai hệ thống đã mở rộng số lượng mã quản lý người dùng, một trong các hệ thống đã có cách mạo danh người dùng khác đối với quản trị viên. Mọi thứ hoạt động trơn tru và không có thời gian chết. Người dùng không nhận thấy sự khác biệt.
Nhưng sau khi nâng cấp mọi thứ với quản lý/xác thực người dùng dễ dàng hơn nhiều, bạn sẽ nhận được 5 ngày chi cho việc nâng cấp không mất thời gian. Hãy nghĩ đây là một khoản đầu tư -))

Tôi đã xem mã nguồn (trong trình biên dịch ngược) của MembershipProvider và rất nhiều thứ tĩnh, lộn xộn, niêm phong và chỉ đơn giản là không thể quản lý được. Tôi muốn nói nó sẽ dễ dàng đổ nó thay vì xây dựng thêm mã di sản, chỉ để duy trì thư viện sắp chết.

Nói cách khác, sẽ dễ dàng cập nhật mọi thứ thay vì cố gắng sử dụng lại nội dung cũ.

1

Tôi muốn tận dụng chức năng quản lý vai trò người dùng/vai trò hiện tại trong ứng dụng của chúng tôi, để tạo và quản lý tài khoản API.Tuy nhiên vì tùy chọn ưa thích cho WebAPI là sử dụng ASP.NET Identity (xác nhận quyền sở hữu/mã thông báo người gửi, v.v ...) Tôi hơi bối rối về những tùy chọn tốt nhất của .

Không nên kết hợp với nhà cung cấp thành viên SQL hiện tại và API Web trong một dự án duy nhất.

Trong trường hợp của tôi, tôi đã tạo một dự án API Web 2 riêng biệt. Sau đó, tôi đã tạo một dự án thư viện lớp riêng biệt để giữ container IoC ở một vị trí duy nhất, và cả ứng dụng Web và tham chiếu API Web là thư viện lớp.

Dự án API Web vẫn có thể sử dụng bảng của nhà cung cấp Thành viên SQL. Tuy nhiên, bạn cần phải xác thực người dùng một mình bằng cách sử dụng Membership Provider Encode Algorithm và tạo đối tượng IPrincipal với Xác nhận quyền sở hữu của chính bạn. Sau đó, chỉ định cho Thread.CurrentPrincipal.

Để xác thực dựa trên mã thông báo, bạn chỉ có thể sử dụng JSON Web Token.

Cập nhật: Nếu bạn có nhiều thời gian hơn, bạn có thể di chuyển thành viên SQL thẳng tới ASP.NET Identity bằng cách sử dụng this example. Sau đó, bạn có thể giữ MVC và Web API trong một dự án duy nhất, vì cả hai đều sử dụng ASP.NET Identity.

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