Tôi rất ngạc nhiên khi tôi không thể tìm thấy một ví dụ rõ ràng về cách xác thực người dùng ngay từ màn hình đăng nhập cho đến việc sử dụng thuộc tính Authorize trên các phương thức ApiControll của tôi sau vài giờ Google.
Đó là bởi vì bạn đang bị lẫn lộn về hai khái niệm này:
Xác thực là cơ chế theo đó các hệ thống có thể xác định an toàn người dùng của họ. Hệ thống xác thực cung cấp câu trả lời cho các câu hỏi:
- Ai là người dùng?
- Người dùng có thực sự là người mà anh ấy / cô ấy thể hiện?
Ủy quyền là cơ chế theo đó một hệ thống xác định mức độ truy cập mà người dùng được xác thực cụ thể cần có để bảo đảm các tài nguyên do hệ thống kiểm soát. Ví dụ, một hệ thống quản lý cơ sở dữ liệu có thể được thiết kế để cung cấp cho một số cá nhân được chỉ định khả năng truy xuất thông tin từ cơ sở dữ liệu nhưng không có khả năng thay đổi dữ liệu được lưu trữ trong cơ sở dữ liệu, đồng thời cho các cá nhân khác khả năng thay đổi dữ liệu. Hệ thống ủy quyền cung cấp câu trả lời cho các câu hỏi:
- Người dùng X có được phép truy cập tài nguyên R không?
- Người dùng X có được phép thực hiện thao tác P không?
- Người dùng X có được phép thực hiện thao tác P trên tài nguyên R không?
Các Authorize
thuộc tính trong MVC được sử dụng để áp dụng quy tắc truy cập, ví dụ:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
Quy tắc trên sẽ chỉ cho phép người dùng trong vai trò Quản trị viên và Siêu người dùng truy cập phương thức
Các quy tắc này cũng có thể được đặt trong tệp web.config, sử dụng location
phần tử. Thí dụ:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Tuy nhiên, trước khi các quy tắc ủy quyền đó được thực thi, bạn phải được xác thực với trang web hiện tại .
Mặc dù những điều này giải thích làm thế nào để xử lý các yêu cầu trái phép, nhưng chúng không thể hiện rõ ràng một cái gì đó như Đăng nhập hoặc một cái gì đó tương tự để yêu cầu thông tin đăng nhập của người dùng và xác thực chúng.
Từ đây, chúng ta có thể chia vấn đề thành hai:
Xác thực người dùng khi sử dụng các dịch vụ API Web trong cùng một ứng dụng Web
Đây sẽ là cách tiếp cận đơn giản nhất, vì bạn sẽ dựa vào Xác thực trong ASP.Net
Đây là một ví dụ đơn giản:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
Người dùng sẽ được chuyển hướng đến tuyến tài khoản / đăng nhập , ở đó bạn sẽ hiển thị các điều khiển tùy chỉnh để yêu cầu thông tin đăng nhập của người dùng và sau đó bạn sẽ đặt cookie xác thực bằng cách sử dụng:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
Xác thực đa nền tảng
Trường hợp này là khi bạn chỉ hiển thị các dịch vụ API Web trong ứng dụng Web , do đó, bạn sẽ có một khách hàng khác sử dụng các dịch vụ đó, khách hàng có thể là một ứng dụng Web khác hoặc bất kỳ ứng dụng .Net nào (Win Forms, WPF, console, Windows service, Vân vân)
Ví dụ: giả sử rằng bạn sẽ sử dụng dịch vụ API Web từ một ứng dụng web khác trên cùng một tên miền mạng (trong mạng nội bộ), trong trường hợp này bạn có thể dựa vào xác thực Windows do ASP.Net cung cấp.
<authentication mode="Windows" />
Nếu các dịch vụ của bạn được hiển thị trên Internet, thì bạn sẽ cần chuyển các mã thông báo được xác thực cho từng dịch vụ API Web.
Để biết thêm thông tin, hãy loot các bài viết sau: