Giới thiệu chi tiết kiến trúc ASP.NET MVC và Core MVC
- 30-12-2024
- Toanngo92
- 0 Comments
Nội dung bài viết mô tả mô hình ASP.NET MVC (Model-View-Controller), giải thích vòng đời (life cycle), mẫu thiết kế (design pattern) và các lợi ích của nó. Đồng thời, nội dung cũng nêu rõ ba thành phần cơ bản của ASP.NET MVC, bao gồm Model, View và Controller.
Mục lục
Phiên 5: ASP.NET MVC và Core MVC – Chi tiết hơn
Tổng quan phiên học
Phiên này mô tả mô hình ASP.NET MVC (Model-View-Controller), giải thích chu kỳ sống, mẫu thiết kế và các lợi ích của nó. Đồng thời, nội dung cũng nêu rõ ba thành phần cơ bản của ASP.NET MVC, bao gồm Model, View và Controller.
Xác thực dựa trên vai trò và giao diện
Xác thực là quá trình xác minh xem một người dùng đã được chứng thực có quyền truy cập vào một nguồn cụ thể hay không. Sau khi tạo người dùng trong ứng dụng, lập trình viên phải chỉ định các quy tắc xác thực.
Ví dụ:
- Người dùng A có thể tạo thư viện tài liệu, chỉnh sửa và xóa tài liệu.
- Người dùng B chỉ có thể thêm tài liệu vào thư viện.
Khi người dùng truy cập một tài nguyên, việc kiểm tra truy cập được thực hiện để xác nhận rằng họ có quyền hoặc không. ASP.NET Core cung cấp các thuộc tính AuthorizeAttribute
và AllowAnonymousAttribute
để thiết lập các quy tắc này.
- AuthorizeAttribute: Hạn chế quyền truy cập vào một hành động hoặc toàn bộ controller.
- AllowAnonymousAttribute: Cho phép truy cập đối với người dùng không xác thực.
Code Snippet 1: Hạn chế quyền truy cập vào toàn bộ LoginController
chỉ với người dùng được xác thực.
[Authorize]
public class LoginController : Controller {
public ActionResult Signup() {
}
}
Code Snippet 2: Sử dụng Authorize
cho một hành động cụ thể.
public class LoginController : Controller {
[AllowAnonymous]
public ActionResult Signup() {
}
[Authorize]
public ActionResult GetData() {
}
}
Code Snippet 3: Kết hợp cả hai thuộc tính để điều chỉnh quyền truy cập.
[Authorize]
public class RegController : Controller {
[AllowAnonymous]
public ActionResult Login() {
}
public ActionResult Logout() {
}
}
Trong ví dụ trên:
- Chỉ những người dùng đã xác thực mới được phép truy cập
RegController
, ngoại trừ hành độngLogin
(cho phép tất cả người dùng, kể cả không xác thực).
Xác thực dựa trên vai trò
Mỗi người dùng có thể thuộc về một hoặc nhiều vai trò. Ví dụ:
- Maria có thể thuộc vai trò “Quản trị viên”.
- Peter có thể thuộc vai trò “Người dùng thông thường”.
Việc quản lý vai trò đảm bảo rằng mỗi người dùng chỉ được thực hiện các hành động tương ứng với vai trò của họ. ASP.NET Core cung cấp IsInRole
để xác thực vai trò và ClaimsPrincipal
để quản lý yêu cầu theo vai trò cần thiết.
Kiểm tra phân quyền theo vai trò
Kiểm tra phân quyền theo vai trò (Role-based authorization checks) có thể được các lập trình viên chèn vào mã của họ. Việc này được thực hiện trên controller hoặc một action cụ thể trong controller. Điều này thông báo những vai trò hiện có mà người dùng phải thuộc về để được truy cập vào tài nguyên được nhắm tới.
Ví dụ trong Code Snippet 4 giới hạn truy cập vào các controller cụ thể dựa trên vai trò:
[Authorize(Roles = "Developer")]
public class DeveloperController : Controller {
}
[Authorize(Roles = "TeamLead,DevOps")]
public class OperationsController : Controller {
}
Chỉ những người dùng thuộc vai trò DevOps hoặc TeamLead mới có quyền truy cập vào controller này. Khi các thuộc tính được áp dụng, một người dùng không thuộc về bất kỳ vai trò nào trong danh sách sẽ bị từ chối truy cập. Đối với action cụ thể, các vai trò có thể được định nghĩa như sau trong Code Snippet 5:
[Authorize(Roles = "Operator")]
[Authorize(Roles = "Maintainer")]
public class SoftwareAccessController : Controller {
}
Quyền truy cập có thể bị giới hạn thêm bằng cách sử dụng các thuộc tính phân quyền vai trò ở cấp action, như trong Code Snippet 6:
[Authorize(Roles = "Developer, Operator")]
public class SoftwareAccessController : Controller {
public IActionResult SetTime() {
return View();
}
[Authorize(Roles = "Developer")]
public IActionResult ShutDown() {
return View();
}
}
Kiểm tra vai trò dựa trên chính sách (Policy-based Role Checks)
Chính sách (Policy) cho phép định nghĩa các yêu cầu vai trò linh hoạt hơn. Lập trình viên thực hiện một chính sách trong giai đoạn khởi tạo, thường được cấu hình trong tệp ConfigureServices()
trong Program.cs. Tham khảo Code Snippet 7:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.ConfigureServices(services => {
services.AddAuthorization(options => {
options.AddPolicy("RequireDeveloperRole", policy =>
policy.RequireRole("Developer"));
});
});
});
Sử dụng thuộc tính Policy để áp dụng chính sách trên thuộc tính AuthorizeAttribute
, như trong Code Snippet 8:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown() {
return View();
}
Đối với yêu cầu nhiều vai trò được phép, các vai trò được chỉ định như tham số trong RequireRole, như được hiển thị trong Code Snippet 9:
options.AddPolicy("ElevatedRights", Policy =>
Policy.RequireRole("Developer", "Operator", "DatabaseArchitect"));
Phân quyền dựa trên giao diện
Thông thường, một nhà phát triển muốn hiển thị, sửa đổi hoặc ẩn một đối tượng người dùng hiện tại dựa trên danh tính. Các nhà phát triển có thể truy cập dịch vụ phân quyền trong giao diện MVC bằng cách sử dụng nguyên tắc phụ thuộc (dependency injection). Để tiêm một dịch vụ vào giao diện, các nhà phát triển có thể sử dụng chỉ thị @inject
. Tương tự, để triển khai dịch vụ phân quyền trong tất cả các view, các nhà phát triển nên thêm chỉ thị @inject
vào file _ViewImports.cshtml
trong thư mục Views.
Khi việc tiêm được hoàn thành, các nhà phát triển có thể sử dụng dịch vụ phân quyền bằng cách gọi phương thức AuthorizeAsync
. Một ví dụ về điều này được hiển thị trong Code Snippet 10.
@{
if (await AuthorizationService.AuthorizeAsync(User, "StandardPolicy"))
{
<p>Successfully authorized user for standard policy.</p>
}
}
ASP.NET Selectors (Bộ chọn trong ASP.NET)
Bộ chọn hành động được sử dụng để xác định phương thức hành động được gọi khi xử lý yêu cầu HTTP. Thuộc tính liên quan đến các phương thức hành động được định nghĩa bởi Routing engine. Các thuộc tính này đóng vai trò quan trọng trong việc viết một phương thức hành động. Có ba loại bộ chọn hành động trong ASP.NET:
- ActionName: Thuộc tính ActionName được sử dụng để định nghĩa tên hành động khác với tên của phương thức, như trong Code Snippet 11.
public class EmployeeController : Controller {
[ActionName("Locate")]
public ActionResult GetEmployeeInfo(int id) {
// Lấy thông tin nhân viên
return View();
}
}
- NonAction: Thuộc tính NonAction đánh dấu phương thức public trong lớp controller là một phương thức không phải hành động, như được hiển thị trong Code Snippet 12.
public class EmployeeController : Controller {
[NonAction]
public Employee GetEmployee(int id) {
return EmployeeList.Where(s => s.EmployeeId == id).FirstOrDefault();
}
}
- ActionVerbs: Khi cần điều chỉnh việc lựa chọn phương thức hành động theo phương thức yêu cầu HTTP, các thuộc tính ActionVerbs được áp dụng. Ví dụ như
HttpGet
,HttpPost
,HttpPut
. Một ví dụ được thể hiện trong Code Snippet 13:
public ActionResult Update(int id){
var course = courses.Where(s => s.coursename == name).FirstOrDefault();
return View(course);
}
[HttpPost]
public ActionResult Update(Course course){
return RedirectToAction("Home");
}
Bảng 5.1: HTTP Methods (Phương thức HTTP)
Phương thức | Mô tả |
---|---|
GET | Được sử dụng để lấy dữ liệu từ server. Các tham số được thêm vào truy vấn. |
POST | Dùng để gửi dữ liệu mới đến server. |
PUT | Dùng để thay thế tài nguyên đã tồn tại. |
HEAD | Giống như GET nhưng không trả về nội dung body. |
OPTIONS | Được dùng để lấy thông tin giao tiếp của server hỗ trợ. |
DELETE | Để xóa tài nguyên hiện có. |
PATCH | Dùng để cập nhật tài nguyên một phần hoặc toàn bộ. |
ASP.NET Helpers (Các hàm trợ giúp trong ASP.NET)
ASP.NET hỗ trợ nhiều loại hàm trợ giúp có thể tái sử dụng, bao gồm code và markup để thực hiện các nhiệm vụ đơn giản hoặc phức tạp. Một helper HTML là một thủ tục trả về chuỗi HTML. Các helper này có thể được chia làm ba loại:
- Inline HTML Helpers: Sử dụng tag
@helper
để phát triển các helper nội tuyến trong cùng một giao diện. Ví dụ: Code Snippet 15.
@helper ListingItems(string[] items){
<ol>
@foreach (string i in items){
<li>@i</li>
}
</ol>
}
Built-in HTML Helpers: Các phương thức HTML helper được xây dựng sẵn, ví dụ như Table 5.2:
Dưới đây là bản dịch đầy đủ nội dung của Bảng 5.2: HTML Helpers chuẩn:
Thành phần | Ví dụ |
---|---|
TextBox | @Html.TextBox("Name", "John", new { @class = "text-box" }) |
TextArea | @Html.TextArea("Description", "Enter details here...", new { rows = "5", cols = "20" }) |
Hidden Field | @Html.Hidden("UserId", "123") |
CheckBox | @Html.CheckBox("IsActive", true) |
Radio Button | @Html.RadioButton("Gender", "Male") |
Bảng 5.3: Trợ giúp HTML kiểu mạnh (strongly type)
Thành phần | Ví dụ |
---|---|
TextBox | @Html.TextBoxFor(m => m.Name, new { id = "textbox", type = "text" }) |
TextArea | @Html.TextAreaFor(m => m.Address, new { id = "textarea", rows = 4, cols = 20 }) |
Password | @Html.PasswordFor(m => m.Password, new { id = "password", type = "password" }) |
Hidden Field | @Html.HiddenFor(m => m.SecretKey) |
CheckBox | @Html.CheckBoxFor(m => m.IsAdmin, new { id = "checkbox", value = "checked" }) |
Drop-down list | @Html.DropDownListFor(m => m.Occupation, new SelectList(new[] { "Engineer", "Teacher" })) |
Bảng 5.4: HTML Helper kiểu mẫu (template)
Trợ giúp mẫu | Ví dụ |
---|---|
DisplayFor | @Html.DisplayFor(m => m.Name) |
EditorFor | @Html.EditorFor(m => m.Age) |
HiddenFor | @Html.HiddenFor(m => m.Id) |
5.3.3 Trợ giúp HTML tùy chỉnh
- Có thể tạo các phương thức trợ giúp tùy chỉnh trong lớp tiện ích bằng cách kế thừa hoặc mở rộng lớp
HtmlHelper
. - Ví dụ: Code Snippet 16 cho thấy cách tạo một nút submit tùy chỉnh với nội dung được truyền động.
public static class CustomHelpers
{
public static MvcHtmlString SubButton(this HtmlHelper helper, string buttonText)
{
string buttonHtml = $"<input type=\"submit\" value=\"{buttonText}\" />";
return new MvcHtmlString(buttonHtml);
}
}
5.4 Giới thiệu về bộ lọc
- Các tình huống áp dụng bộ lọc:
- Xác thực/Phân quyền: Quản lý quyền truy cập của người dùng thông qua bộ lọc xác thực.
- Đăng nhập thông tin người dùng: Lưu lại thông tin đăng nhập và dữ liệu quan trọng.
- Xử lý lỗi: Tạo cơ chế ghi nhật ký lỗi và gửi thông báo tùy chỉnh.
- Lưu trữ dữ liệu: Áp dụng với các thao tác dữ liệu phức tạp trước hoặc sau hành động.
Bảng 5.5: Các loại bộ lọc
Loại bộ lọc | Giao diện | Mô tả |
---|---|---|
Authorization | IAuthorizationFilter | Kiểm tra quyền truy cập và giới hạn người dùng dựa trên điều kiện quyền hạn. |
Resource | IResourceFilter | Xử lý trước hoặc sau khi thực hiện bộ điều khiển. |
Action | IActionFilter | Xử lý trước hoặc sau khi thực hiện phương thức hành động. |
Exception | IExceptionFilter | Xử lý ngoại lệ phát sinh trong bộ điều khiển hoặc hành động. |
Result | IResultFilter | Xử lý kết quả trả về sau hành động. |
Bộ lọc ủy quyền (Authorization Filters)
Quá trình ủy quyền xác định quyền của người dùng và tất cả các hành động mà người dùng đó có thể thực hiện. Một ví dụ về người dùng quản trị viên là người có thể thực hiện các chức năng như xây dựng tài liệu thư viện và quản lý tài liệu. Ngược lại, một người dùng không phải quản trị viên chỉ có quyền đọc tài liệu từ thư viện.
Quá trình ủy quyền trong ASP.NET Core là một quy trình đơn giản để xác định vai trò của người dùng dựa trên một số quy tắc. Sau đó, các yêu cầu được xử lý dựa trên những vai trò này. Việc kiểm tra cơ bản có thể được thực hiện dựa trên các quy tắc đặt ra khi quyền của người dùng được so sánh với yêu cầu quyền để truy cập.
Các thành phần của bộ lọc ủy quyền, bao gồm:
AuthorizeAttribute
AllowAnonymousAttribute
Cả hai đều là một phần của không gian tên Microsoft.AspNetCore.Authorization
.
Code Snippet 17: Một ví dụ về cách sử dụng Authorize
và AllowAnonymous
trong StudentController:
namespace FilterSample.Controllers {
[Authorize]
public class StudentController : Controller {
[AllowAnonymous]
public IActionResult Index() {
using var dbContext = new StudentDbContext();
var students = dbContext.Students.ToList();
return View(students);
}
[HttpGet]
[Authorize(Roles = "Administrator")]
public IActionResult Delete(int id) {
using var dbContext = new StudentDbContext();
var student = dbContext.Students.FirstOrDefault(s => s.ID == id);
if (student == null) throw new InvalidOperationException();
return View(student);
}
[HttpPost]
[Authorize(Roles = "Administrator")]
public IActionResult Delete(int id) {
using var dbContext = new StudentDbContext();
var student = dbContext.Students.FirstOrDefault(s => s.ID == id);
if (student == null) throw new InvalidOperationException();
dbContext.Students.Remove(student);
dbContext.SaveChanges();
return RedirectToAction("Index");
}
}
}
Bộ lọc tài nguyên (Resource Filters)
Bộ lọc tài nguyên chịu trách nhiệm xử lý yêu cầu sau khi ủy quyền. Chúng có thể được mã hóa để chạy trước và sau khi phần còn lại của bộ lọc được thực thi, trước khi ràng buộc mô hình xảy ra. Bộ lọc tài nguyên thường được sử dụng để triển khai bộ nhớ đệm (caching).
Chúng triển khai các giao diện sau:
IResourceFilter
IAsyncResourceFilter
Trước khi các bộ lọc tài nguyên chạy, chỉ các bộ lọc ủy quyền mới có thể được thực thi.
Các bộ lọc tài nguyên quyết định phần lớn công việc trong pipeline của yêu cầu ASP.NET Core. Pipeline bao gồm các ủy nhiệm request, mỗi ủy nhiệm gọi ủy nhiệm tiếp theo. Nếu một bộ lọc quyết định ngừng tiến trình bằng cách trả về phản hồi, pipeline sẽ ngắn lại. Ví dụ, một bộ lọc bộ nhớ đệm có thể quyết định trả về phản hồi trực tiếp nếu có phản hồi trong bộ nhớ đệm.
Code Snippet 18: Giao diện bộ lọc tài nguyên được xây dựng sẵn:
public interface IResourceFilter {
void OnResourceExecuting(ResourceExecutingContext context);
void OnResourceExecuted(ResourceExecutedContext context);
}
Dưới đây là bản dịch đầy đủ của các phần yêu cầu từ các trang bạn cung cấp:
Bộ lọc Hành động (Action Filters)
Bộ lọc hành động được thực thi trước khi một hành động được gọi hoặc sau khi một hành động đã được thực thi. IActionFilter cung cấp một phương thức gọi là OnActionExecuting
, được thực thi trước một hành động, và OnActionExecuted
, được thực thi sau khi hành động đã hoàn tất. Mã tích hợp sẵn có thể được tham khảo trong Code Snippet 19:
public interface IActionFilter {
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
}
Bộ lọc Kết quả (Result Filters)
Bộ lọc kết quả được thực thi trước hoặc sau khi các kết quả từ hành động được trả về.
Các loại bộ lọc kết quả bao gồm:
- ViewResult
- PartialViewResult
- RedirectToRouteResult
- RedirectResult
- ContentResult
- JsonResult
- FileResult
- EmptyResult
Tất cả đều được dẫn xuất từ lớp ActionResult. Bộ lọc kết quả được tạo bằng giao diện IResultFilter. Giao diện này cung cấp hai phương thức: OnResultExecuting()
và OnResultExecuted()
.
Code Snippet 20 trình bày mã tích hợp sẵn:
public interface IResultFilter {
void OnResultExecuting(ResultExecutingContext filterContext);
void OnResultExecuted(ResultExecutedContext filterContext);
}
Bộ lọc Ngoại lệ (Exception Filters)
Bộ lọc ngoại lệ được tạo ra khi có ngoại lệ xảy ra trong quá trình thực thi các hành động hoặc bộ lọc. IExceptionFilter cho phép xử lý ngoại lệ với phương thức OnException
.
Mã tích hợp sẵn có thể tham khảo trong Code Snippet 21:
public interface IExceptionFilter {
void OnException(ExceptionContext filterContext);
}
Thứ tự Thực thi Bộ lọc
Thứ tự thích hợp để thực thi các bộ lọc trong ASP.NET Core MVC như sau:
- Authorization Filter (Bộ lọc xác thực)
- Resource Filter (Bộ lọc tài nguyên)
- Action Filter (Bộ lọc hành động)
- Exception Filter (Bộ lọc ngoại lệ)
- Result Filter (Bộ lọc kết quả)
Cấu hình Bộ lọc (Configuring Filters)
Các bộ lọc tùy chỉnh có thể được cấu hình trong ứng dụng thông qua ba mức độ khác nhau:
Toàn cục (Global):
Các nhà phát triển có thể hạn chế quyền truy cập vào toàn bộ API Web Controller bằng cách thêm bộ lọc AuthorizeAttribute. Mã thực thi toàn cục được minh họa trong Code Snippet 22:
services.AddMvc(config => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
Cấp độ Bộ điều khiển (Controller level):
Có thể đạt được bằng cách thêm bộ lọc vào đầu tên bộ điều khiển.
Code Snippet 23:
[Authorize]
public class StudentController : Controller {
// Tất cả các phương thức hành động
// của bộ điều khiển sinh viên
// được bảo vệ.
}
Cấp độ Hành động (Action level):
Bộ lọc được đặt trên tên của một hành động cụ thể.
Code Snippet 24:
[HttpGet]
[Authorize(Roles = "Administrator")]
public IActionResult Delete(int id) {
// Chỉ dành cho quản trị viên
}
Thêm về Bộ lọc Hành động (Action Filters)
Các bộ lọc hành động có thể được sử dụng để sửa đổi cách mà các hành động được thực thi. Một ví dụ về Action Filter được sử dụng cho mục đích xác thực được trình bày trong Code Snippet 25:
public class ModelValidationAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext context) {
if (!context.ModelState.IsValid) {
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
}
Bộ lọc Hành động để Xử lý Lỗi:
Bằng cách ghi đè phương thức OnActionExecuted
, các nhà phát triển có thể xử lý ngoại lệ trong một cách quản lý.
Code Snippet 26:
public class OnExceptionActionAttribute : ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext context) {
if (context.Exception != null) {
context.Result = new ContentResult() {
Content = "Có lỗi xảy ra! Vui lòng thử lại sau."
};
context.ExceptionHandled = true;
}
}
}
Áp dụng Bộ lọc Hành động (Apply Action Filter)
Một bộ lọc hành động đề cập đến một thuộc tính sử dụng lớp ActionFilterAttribute. Lớp này là một lớp trừu tượng. Một số bộ lọc hành động được thực thi trước khi phương thức hành động chạy.
Các ModelValidationAttribute và OnExceptionActionAttribute là các ví dụ về bộ lọc hành động, chúng triển khai trực tiếp lớp ActionFilterAttribute.
Một số bộ lọc hành động triển khai lớp trừu tượng ActionFilterAttribute và cho phép thực thi bộ lọc hành động trước khi thực thi hành động bằng cách ghi đè phương thức OnActionExecuting hoặc sau khi thực thi hành động bằng cách ghi đè phương thức OnActionExecuted.
Thuộc tính bộ lọc hành động có thể được sử dụng để xác định bất kỳ bộ điều khiển hoặc phương thức hành động nào. Nếu một thuộc tính được liên kết với một bộ điều khiển, bộ lọc hành động sẽ được liên kết với tất cả các phương thức hành động của bộ điều khiển đó.
Code Snippet 27: Triển khai ModelValidationAttribute
[HttpPost]
[ModelValidation]
public IActionResult Create(STUDENT student) {
using (var dbContext = new StudentDbContext()) {
dbContext.Add(student);
dbContext.SaveChanges();
}
return View();
}
Code Snippet 28: Xử lý ngoại lệ bằng cách sử dụng thuộc tính hành động OnExceptionAction
[OnExceptionAction]
public IActionResult Registration() {
throw new ApplicationException("ActionResult not implemented.");
}
Bộ lọc Tài nguyên (Resource Filters)
Code Snippet 29 minh họa việc ghi đè phương thức OnResourceExecuting trong giao diện IResourceFilter. Trong trường hợp các nhà phát triển muốn bỏ qua quy trình thực thi tài nguyên, thuộc tính này có thể được sử dụng.
Code Snippet 29: Triển khai IResourceFilter
public class PageNotAvailableAttribute : Attribute, IResourceFilter {
public void OnResourceExecuted(ResourceExecutedContext context) {}
public void OnResourceExecuting(ResourceExecutingContext context) {
context.Result = new ContentResult() {
Content = "Page unavailable! Try later."
};
}
}
Bộ lọc tài nguyên chăm sóc hầu hết công việc liên quan đến các yêu cầu trước khi xác thực. Trong quy trình này, các nhà phát triển có thể định nghĩa các hoạt động như lưu vào bộ nhớ đệm hoặc thay đổi các phản hồi trước khi gửi kết quả cuối cùng.
5.8.1 Triển khai Bộ lọc Tài nguyên (Implementing Resource Filters)
Code Snippet 30 minh họa việc triển khai PageNotAvailableAttribute để bỏ qua URL home/about
.
[PageNotAvailable]
public IActionResult About() {
ViewData["Message"] = "Your application description page.";
return View();
}
Bảo mật trong ASP.NET MVC (ASP.NET MVC Security)
Bảo mật là một khía cạnh rất quan trọng của bất kỳ ứng dụng Web nào, đặc biệt là trong môi trường doanh nghiệp. ASP.NET và ASP.NET MVC hỗ trợ nhiều tính năng bảo mật mạnh mẽ.
Thông tin định danh người dùng được quản lý qua Cloud, cơ sở dữ liệu SQL, và thư mục hoạt động Windows local active directory trong phiên bản mới nhất của ASP.NET. Việc xác minh danh tính của một người dùng được gọi là xác thực (authentication). Truy cập ứng dụng chỉ được cấp cho người dùng đã được xác thực vì các lý do hiển nhiên.
Khi khởi tạo một ứng dụng ASP.NET mới, việc cấu hình các dịch vụ xác thực dựa trên yêu cầu của ứng dụng là một trong những bước quan trọng. Sau khi chọn mẫu MVC, nút Change Authentication sẽ được kích hoạt, như được hiển thị trong Hình 5.1.
Giao diện này cho phép bạn cấu hình xác thực trong ứng dụng ASP.NET MVC dựa trên các tùy chọn sẵn có, bao gồm:
Dưới đây là đặc tính của bốn loại authentication:
- No Authentication (Không có xác thực)
- Dùng để xây dựng trang web không yêu cầu xác thực danh tính của người dùng.
- Phù hợp với các trang web thông tin, không chứa dữ liệu nhạy cảm.
- Individual User Accounts (Tài khoản người dùng cá nhân)
- Thiết lập danh tính của người dùng trên web hoặc internet.
- Hỗ trợ xác thực qua tài khoản email, Google, Facebook, hoặc các nhà cung cấp bên ngoài như Microsoft.
- Windows Authentication (Xác thực Windows)
- Dùng cho các ứng dụng nội bộ, xác thực người dùng qua Active Directory của Windows.
- Hỗ trợ tốt trong môi trường mạng nội bộ (intranet).
- Work and School Accounts (Tài khoản công việc và trường học)
- Sử dụng Azure Active Directory Services để xác thực người dùng.
- Phù hợp với các ứng dụng doanh nghiệp và trường học, yêu cầu quản lý danh tính tập trung.
Partial Views in MVC (Partial View trong MVC)
Partial View là một chế độ xem độc quyền có khả năng hiển thị một phần nội dung của chế độ xem. Nó tương tự như một web form điều khiển trong các ứng dụng truyền thống. Partial View có thể được sử dụng lại trong nhiều chế độ xem để giảm thiểu sự lặp lại mã.
Dịch chi tiết nội dung từ trang được cung cấp:
Partial Views trong MVC
Một đối tượng ViewDataDictionary, là một bản sao của Partial View, có sẵn trong Main View (view chính). Main View cũng được gọi là Parent View (view cha). Điều này cho phép dữ liệu từ Parent View được truy cập bởi Partial View.
Đối tượng ViewDataDictionary được sử dụng để khởi tạo Partial View. Dữ liệu từ đối tượng cha không bị ảnh hưởng ngay cả khi có thay đổi trong dữ liệu của đối tượng ViewDataDictionary. Để hiển thị bất kỳ dữ liệu nào liên quan đến Partial View, vốn là một phần của mô hình (model), đảm bảo sử dụng phương thức RenderPartial.
Các bước thực hiện để tạo Partial View:
- Nhấp chuột phải vào thư mục và chọn Shared folder.
- Chọn Add View. Đánh dấu chọn hộp Create as partial view. Đặt tên view là TestView. Thêm một số markup vào view.
Ghi chú:
Tạo và lưu Partial View trong thư mục Shared là một thực hành tốt. Điều này giúp tái sử dụng Partial View như một thành phần có thể tái sử dụng.
Thêm mã trong Code Snippet 31 vào _Layout.cshtml. Đoạn mã này sử dụng hai phương thức để hiển thị Partial View trong HTML helper. Hai phương thức này là: Partial() và RenderPartial().
Code Snippet 31:
@Html.Partial("TestView")
Hoặc, bạn có thể sử dụng phương thức sau để hiển thị Partial View:
@Html.RenderPartial("TestView")
Trong phương thức Html.RenderPartial(), đối tượng TextWriter được sử dụng bởi Current View. Điều này có nghĩa rằng bất kỳ kết quả nào từ phương thức này được viết trực tiếp vào phản hồi HTTP. Trong phương thức Html.Partial(), kết quả được trả về dưới dạng một chuỗi HTML được mã hóa. Kết quả sẽ được lưu trữ dưới dạng một chuỗi.
Khác biệt:
- Đầu ra của Html.RenderPartial() được viết trực tiếp vào HTTP response.
- Vì lý do này, Html.RenderPartial() hoạt động nhanh hơn so với Html.Partial().
Code Snippet 32 trình bày cách hiển thị Partial View từ phương thức Action của bộ điều khiển (controller):
public ActionResult PartialViewExample() {
return View();
}
Tổng kết:
- Partial Views là cách hiệu quả để chia nhỏ giao diện lớn thành các thành phần nhỏ có thể tái sử dụng.
- Html.Partial() trả về chuỗi HTML, trong khi Html.RenderPartial() ghi trực tiếp vào phản hồi HTTP, giúp cải thiện hiệu suất.
- Partial Views thường được lưu trong thư mục Shared để tái sử dụng dễ dàng.
So sánh giữa View và Partial View
So với View, Partial View nhẹ hơn. Phương thức RenderPartial() cho phép truyền một view thông thường. Một View được coi là Partial View khi không có trang layout nào được chỉ định trong view.
Tuy nhiên, Razor không hiển thị sự khác biệt nào giữa các Views và Partial Views như được thực hiện trong công cụ view ASPX.
Bảng 5.6: Khác biệt giữa View và Partial View
View | Partial View |
---|---|
Bao gồm một trang layout. | Không bao gồm một trang layout. |
Kết xuất (render) trang _ViewStart.cshtml trước khi render bất kỳ View nào. | Không tìm kiếm trang _ViewStart.cshtml. |
Bao gồm các thẻ markup, như HTML, body, head, title, meta, v.v. | Không chứa bất kỳ thẻ markup nào vì nó được kết xuất trong View. |
Tóm tắt:
- View phù hợp để tạo trang đầy đủ với layout cụ thể.
- Partial View được sử dụng để tạo các thành phần nhỏ hơn, dễ tái sử dụng và không phụ thuộc vào layout.
- Razor xử lý cả View và Partial View tương tự nhau, nhưng Partial View không chứa thông tin cấu trúc layout.