TL; DR
IdentityServer = dịch vụ mã hóa và xác thực mã thông báo qua OAuth 2.0 / OpenId-Connect
ASP.NET Identity = chiến lược quản lý danh tính hiện tại trong ASP.NET
Làm cách nào tôi có thể xác thực tương tự như cách thực hiện trong phiên bản trước của .Net, cách cũ vẫn hoạt động hay có phiên bản mới hơn.
Tôi không hiểu lý do gì khiến bạn không thể đạt được cách cũ trong ASP.NET Core, nhưng nói chung, chiến lược đó đã được thay thế bằng ASP.NET Identity và ASP.NET Identity vẫn tồn tại và tốt trong ASP.NET Core.
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity
ASP.NET Identity sử dụng một kho dự phòng như SQL Server để lưu giữ thông tin người dùng như tên người dùng, mật khẩu (băm), email, điện thoại và dễ dàng được mở rộng để lưu trữ FirstName, LastName hoặc bất kỳ thứ gì khác. Vì vậy, thực sự không có lý do gì để mã hóa thông tin người dùng thành một cookie và chuyển nó qua lại từ máy khách đến máy chủ. Nó hỗ trợ các khái niệm như xác nhận quyền sở hữu của người dùng, mã thông báo người dùng, vai trò người dùng và thông tin đăng nhập bên ngoài. Đây là các thực thể trong ASP.NET Identity:
- AspNetUsers
- AspNetUserRoles
- AspNetUserClaims
- AspNetUserLogins (để liên kết các nhà cung cấp danh tính bên ngoài, như Google, AAD)
- AspNetUserTokens (để lưu trữ những thứ như access_tokens và refresh_tokens do người dùng tích lũy)
Ưu và nhược điểm của việc sử dụng các câu máy chủ mã thông báo của riêng bạn để tạo ra nguyên tắc tùy chỉnh của riêng bạn là gì?
Máy chủ mã thông báo sẽ là một hệ thống tạo ra một cấu trúc dữ liệu đơn giản chứa thông tin Ủy quyền và / hoặc Xác thực. Việc cấp phép thường lấy mã thông báo có tên access_token . Nói cách khác, đây sẽ là "chìa khóa vào nhà", cho phép bạn đi qua ngưỡng cửa và vào nơi cư trú của một tài nguyên được bảo vệ, thường là một ứng dụng web. Đối với Xác thực, id_token
chứa một số nhận dạng duy nhất cho người dùng / người. Mặc dù người ta thường đặt một mã định danh như vậy trong access_token, nhưng giờ đây có một giao thức chuyên dụng để làm điều đó: OpenID-Connect .
Lý do để có Dịch vụ Mã thông báo Bảo mật (STS) của riêng bạn, sẽ là để bảo vệ tài sản thông tin của bạn, thông qua mật mã và kiểm soát những máy khách (ứng dụng) nào có thể truy cập các tài nguyên đó. Hơn nữa, các tiêu chuẩn về kiểm soát danh tính hiện đã tồn tại trong các thông số kỹ thuật của OpenID-Connect. IdentityServer là một ví dụ về Máy chủ ủy quyền OAuth 2.0 kết hợp với máy chủ Xác thực OpenID-Connect.
Nhưng điều này không cần thiết nếu bạn chỉ muốn có một bảng người dùng trong ứng dụng của mình. Bạn không cần máy chủ mã thông báo - chỉ cần sử dụng ASP.NET Identity. ASP.NET Identity ánh xạ Người dùng của bạn tới một đối tượng ClaimsIdentity trên máy chủ - không cần lớp IPrincipal tùy chỉnh.
Khi sử dụng giải pháp dựa trên đám mây hoặc một máy chủ Mã thông báo riêng biệt, bạn sẽ Tích hợp nó với ứng dụng hiện tại của mình như thế nào, tôi vẫn cần một bảng người dùng trong ứng dụng của mình, bạn sẽ kết hợp cả hai như thế nào?
Xem các hướng dẫn này để tích hợp các giải pháp nhận dạng riêng biệt với một ứng dụng:
https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html
https://auth0.com/docs/quickstart/webapp/aspnet-core
Tối thiểu bạn sẽ cần một bảng hai cột ánh xạ tên người dùng với mã định danh người dùng của nhà cung cấp bên ngoài. Đây là những gì bảng AspNetUserLogins thực hiện trong ASP.NET Identity. Tuy nhiên, các hàng trong bảng đó phụ thuộc vào bản ghi Người dùng trong AspNetUsers.
ASP.NET Identity hỗ trợ các nhà cung cấp bên ngoài như Google, Microsoft, Facebook, bất kỳ nhà cung cấp OpenID-Connect nào, Azure AD đều đã có ở đó. (Google và Microsoft đã triển khai giao thức OpenID-Connect nên bạn cũng không cần các gói tích hợp tùy chỉnh của họ, chẳng hạn như gói này ). Ngoài ra, ADFS vẫn chưa khả dụng trên ASP.NET Core Identity.
Xem tài liệu này để bắt đầu với các nhà cung cấp bên ngoài trong ASP.NET Identity:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/
Do có rất nhiều giải pháp khác nhau, làm cách nào để tôi có thể tạo một ứng dụng doanh nghiệp, để cho phép Đăng nhập qua Gmail / Facebook trong khi vẫn có thể mở rộng sang các SSO khác
Như đã giải thích ở trên, ASP.NET Identity đã thực hiện điều này. Khá dễ dàng để tạo bảng "Nhà cung cấp bên ngoài" và dữ liệu thúc đẩy quá trình đăng nhập bên ngoài của bạn. Vì vậy, khi một "SSO" mới xuất hiện, chỉ cần thêm một hàng mới với các thuộc tính như url của nhà cung cấp, id khách hàng và bí mật mà họ cung cấp cho bạn. ASP.NET Identity đã có giao diện người dùng được tích hợp sẵn trong các mẫu Visual Studio, nhưng hãy xem Đăng nhập xã hội để biết các nút hay hơn.
Tóm lược
Nếu bạn chỉ cần một bảng người dùng với khả năng đăng nhập bằng mật khẩu và một hồ sơ người dùng, thì ASP.NET Identity là hoàn hảo. Không cần liên quan đến các cơ quan chức năng bên ngoài. Tuy nhiên, nếu có nhiều ứng dụng cần truy cập nhiều apis, thì một cơ quan độc lập để bảo mật và xác thực danh tính và mã thông báo truy cập sẽ có ý nghĩa. IdentityServer rất phù hợp, hoặc xem openiddict-core hoặc Auth0 để biết giải pháp đám mây.
Lời xin lỗi của tôi là điều này không đạt hiệu quả hoặc nếu nó quá giới thiệu. Vui lòng tương tác để đạt được mắt bò mà bạn đang tìm kiếm.
Phụ lục: Xác thực cookie
Để thực hiện xác thực bằng cookie, hãy làm theo các bước sau. Tuy nhiên, theo hiểu biết của tôi, hiệu trưởng yêu cầu tùy chỉnh không được hỗ trợ. Để đạt được hiệu quả tương tự, hãy sử dụng danh sách Yêu cầu của ClaimPrincipal
đối tượng.
Tạo Ứng dụng Web ASP.NET Core 1.1 mới trong Visual Studio 2015/2017 bằng cách chọn "Không xác thực" trong hộp thoại. Sau đó thêm gói:
Microsoft.AspNetCore.Authentication.Cookies
Theo Configure
phương pháp tại Startup.cs
chỗ này (trước app.UseMvc
):
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new PathString("/Controller/Login/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
Sau đó, xây dựng một ui đăng nhập và đăng Biểu mẫu html lên một Phương thức hành động như sau:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim("FirstName", "Alice"),
new Claim("LastName", "Smith")
};
var identity = new ClaimsIdentity(claims, "Password");
var principal = new ClaimsPrincipal(identity);
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
return RedirectToLocal(returnUrl);
}
ModelState.AddModelError(String.Empty, "Invalid login attempt.");
return View();
}
Đối tượng HttpContext.User phải có các xác nhận quyền sở hữu tùy chỉnh của bạn và có thể dễ dàng truy xuất bộ sưu tập Danh sách của ClaimPrincipal.
Tôi hy vọng điều này là đủ, vì một Giải pháp / Dự án đầy đủ có vẻ hơi nhiều cho một bài đăng trên StackOverflow.