Bài 12 BÀO MÀT CHO ĀNG DĀNG ASP.NET CORE MVC YÊU CÀU MÔN HÞC Ngưßi học vÁn dāng đưÿc kiÁn thāc nÃn tÁng và lÁp trình web đß có thß thiÁt kÁ cài đ¿t các āng dāng web, như quÁn lý websit
TàNG QUAN VÀ ASP.NET
TàNG QUAN ASP.NET
Trưác hÁt, tên đầy đÿ cÿa ASP.NET là Active Server Pages NET (.NET á đây là NET framework) Núi đơn giÁn thỡ ASP.NET là mòt cụng nghó cú tớnh cỏch m¿ng dựng đò phỏt triòn cỏc āng dāng và m¿ng hión nay cũng như trong tương lai ASP.NET là mòt phương phỏp tó chāc hay khung tó chāc (framework) đò thiÁt lÁp cỏc āng dāng m¿nh cho m¿ng dựa trên CLR (Common Language Runtime)
.NET Framework đưÿc chia thành bò cỏc tỏc vā cho tÿng chāc năng gỏm cỏc lỏp (class), các cÃu trúc (structures), các giao diãn (interfaces) và các lõi (core) thành phần chương trỡnh Trưỏc khi sā dāng thành phần nào ta phÁi hiòu cơ bÁn và chāc năng, cỏc tó chāc cÿa nú Mỗi mòt trong hàng nghàn cỏc tầng lỏp đưÿc nhúm theo trỡnh tự logic, thā bÁc đưÿc gọi là mòt namespace Mỗi namespace cung cÃp mòt tớnh năng
Tính đa ngôn ngă Đò xõy dựng mòt āng dāng web chỳng ta khụng chò chọn mòt ngụn ngă mà cú thò chọn nhiÃu ngôn ngă khác ĐiÃu quan trọng là các ngôn ngă chúng ta chọn mã cÿa nó dỏch đưÿc ra mó IL ĐiÃu đú cú nghĩa là IL là ngụn ngă cÿa NET và chò cú CLR nhÁn biÁt đưÿc IL
ASP.NET là ngôn ngữ lập trình hướng đối tượng sử dụng các ngôn ngữ NET Nó cung cấp bộ các đối tượng nhỏ và thực sự là một tầng làm việc trên nguyên lý của HTTP và HTML Mặc dù chúng ta không được truy cập toàn bộ các đối tượng trong NET Framework nhưng có thể khai thác tất cả các quy luật của một môi trường OOP (Object Oriented Programming) Chúng ta có thể tạo các lớp, giao diện, kế thừa các lớp Chúng ta có thể kiểm soát được các đối tượng trong chương trình như hiển thị dữ liệu và các sự kiện của đối tượng.
Mòt āng dāng ASP.NET luụn luụn đưÿc biờn dỏch, nú khụng ch¿y bằng mó cÿa C# ho¿c Visual Basic mà khụng đưÿc biờn dỏch trưỏc Mòt āng dāng ASP.NET thực sự đưÿc biên dách thông qua 2 giai đo¿n:
- Giai đo¿n đầu tiên nhăng các mã (code) ta viÁt (C#, Visual
Basic ho¿c ngôn ngă NET khác) đưÿc dách bái
Language (MSIL) Giai đo¿n dỏch này đưÿc dỏch tự đòng khi trang wed đầu tiên yêu cầu Chỳng ta cú thò thực hiãn dách trưác Các tÁp tin đưÿc dách thành mã IL
- Giai đo¿n tiÁp theo đưÿc dách trưác khi trang Web đưÿc thực thi T¿i giai đo¿n này mã IL đưÿc dách thành bÁn mã máy (Native Machine Code) Giai đo¿n này đưÿc gọi là Just-In-Time (JIT)
Hình 1.1: Ki¿n trúc Net Framework
Thư viện lớp cơ sở ASP.NET chạy trong môi trường thời gian thực của CLR (Common Language Runtime) CLR là máy ảo trong Microsoft NET, sử dụng ngôn ngữ trung gian IL để phát triển ứng dụng trên NET không phụ thuộc thiết bị, cho phép ứng dụng chạy trên bất kỳ thiết bị nào có NET Framework Tất cả không gian tên, ứng dụng, lớp trong NET Framework được gọi tắt là thư viện quản lý mã CLR cũng cung cấp các dịch vụ quan trọng khác như:
D ò dàng tri à n khai và c ¿ u hỡnh
Mọi sự cài đ¿t NET Framework đÃu cung cÃp cỏc lỏp như nhau Đò triòn khai āng dāng ASP.NET chỳng ta chò cần sao chộp cỏc tÁp tin vào thư māc Áo trờn mỏy chÿ (server) và mỏy chò chò cần cú NET Framework
Vióc cÃu hỡnh dỏ dàng đơn giÁn khụng phā thuòc vào IIS (Internet Information
Services) CÃu hình trong ASP.NET đưÿc đ¿t trong tÁp tin web.config TÁp tin web.config đưÿc đò cựng vỏi thư mực chāa trang web cÿa chỳng ta TÁp tin web.config khụng bao giò bỏ khúa, chỳng ta cú thò truy cÁp bÃt kỳ lỳc nào, vióc sāa tÁp tin này hoàn toàn dá d¿ng vì chúng đưÿc lưu dưái d¿ng XML.
TÍNH NNG MâI TRONG ASP.NET 4.5
Microsoft phát hành ASP.NET vào ngày 19 tháng 11 năm 2007 cùng vái Visual Stutio
Phiên bản ASP.NET 4.5 là bước phát triển kế tiếp của ASP.NET 2.0, nếu bạn đang sử dụng ASP.NET 2.0, để sử dụng ASP.NET 4.5, bạn chỉ cần cài đặt thêm các tính năng mới của ASP.NET 4.5 Trong bài viết này, chúng ta sẽ giới thiệu một số tính năng mới trong ASP.NET 4.5 như khả năng đọc và ghi bất đồng bộ các đối tượng HTTP Request và Response.
ASP.NET 4 giỏi thiÁu khÁ năng đọc mòt thực thò HTTP request như là mòt stream bằng cách sā dāng phương thāc HttpRequest.GetBufferlessInputStream Phương thāc này cung cÃp khÁ năng truy xuÃt stream cho thực thò request, nhưng nú đưÿc thực thi đỏng bò, và như vÁy nú s¿ làm ngh¿n thread vỡ phÁi thực thi vióc đọc stream
ASP.NET 4.5 hỗ trÿ khÁ năng đọc stream bÃt đỏng bò trờn thực thò HTTP request, và khÁ năng flush bÃt đỏng bò ASP.NET 4.5 cũng giỳp cho b¿n cú khÁ năng tăng gÃp đụi buffer cho mòt thực thò HTTP request, điÃu đú giỳp cho vióc tớch hÿp dỏ dàng vỏi các các downstream HTTP handlers như là các trang aspx và các ASP.NET MVC controllers
1.2.1.1 Các cÁi ti¿n cho viác quÁn lý HttpRequest
Stream đưÿc tham chiÁu bái HttpRequest.GetBufferlessInputStream trong ASP.NET 4.5 hỗ trÿ cỏc phương thāc đọc đỏng bò và bÃt đỏng bò Đòi tưÿng Stream đưÿc trÁ và tÿ phương thāc GetBufferlessInputStream nay đã cài đ¿t cho cÁ hai phương thāc BeginRead và EndRead Cỏc phương thāc bÃt đỏng bò cÿa Stream giỳp b¿n đọc bÃt đỏng bò thực thò Request theo tÿng chunks (tÿng phần nhỏ), trong khi đú ASP.NET s¿ giÁi phúng thread hión t¿i đòi vỏi mỗi vũng l¿p cÿa vióc đọc bÃt đỏng bò
ASP.NET cũng thờm vào mòt phương thực mỏi cho vióc đọc thực thò request theo cỏch đọc sā dāng bò đóm là HttpRequest.GetBufferedInputStream Phương thāc n¿p chỏng mỏi này cũng giòng vỏi phương thāc GetBufferlessInputStream, hỗ trÿ cỏc phương thāc đọc đỏng bò l¿n bÃt đỏng bò Tuy nhiờn, khi GetBufferedInputStream đọc, nú sao chộp tuyờn cỏc bytes cÿa thực thò request vào trong bò đóm nòi vi cÿa ASP.NET do đú cỏc downstream modules và cỏc handlers v¿n cú thò truy xuÃt vào đòi tưÿng request Vớ dā, nÁu mòt sò mó upstream đang nằm trong đưòng òng (pipeline) đó đọc thực thò request sā dāng phương thāc GetBufferedInputStream, b¿n v¿n cú thò sā dāng HttpRequest.Form ho¿c HttpRequest.Files ĐiÃu này giỳp cho b¿n cú thò xā lý bÃt đòng bò đÁn request (vớ dā như vÿa streaming mòt tÁp tin kớch thưỏc lỏn đÁn CSDL), nhưng mà v¿n tiÁp tāc ch¿y đưÿc các trang aspx và controllers
1.2.1.2 Ghi dă liỏu b¿t đòng bỏ lờn đối t°ÿng response
Gỏi cỏc response đÁn trỡnh HTTP khỏch cú thò làm tòn kộm thòi gian khi client ỏ quỏ xa ho¿c cú kÁt nòi băng thụng hÁp Bỡnh thưòng thỡ ASP.NET s¿ truyÃn cỏc bytes trÁ và sau đú gọi lónh gỏi bò đóm núi trờn vào thòi điòm kÁt thỳc xā lý request
NÁu nòi dung trÁ và (đưÿc buffer) là lỏn (vớ dā như gỏi và mòt tÁp tin lỏn cho client), b¿n phÁi l¿p l¿i vióc gọi HttpResponse.Fush đò gỏi và client và giă māc sā dāng bò nhỏ nằm trong tầm kiòm soỏt Tuy nhiờn, Flush là mòt lòi gọi đỏng bò, nờn vióc gọi đi gọi l¿i Flush s¿ tiờu tòn nhiÃu thòi gian
ASP.NET 4.5 đó cú thờm sự hỗ trÿ cho vióc ghi dă lióu bÃt đỏng bò bằng cỏc phương thāc BeginFlush và EndFlush cÿa đòi tưÿng HttpResponse Sā dāng cỏc phương thāc này s¿ giỳp b¿n t¿o đưÿc cỏc module bÃt đỏng bò và cỏc hanlder bÃt đòng bò mà chỳng s¿ gái dă liãu liên tāc và client mà không làm chÁm các thread cÿa hã điÃu hành Giăa cỏc lòi gọi BeginFlush và EndFlush, ASP.NET giÁi phúng thread hión t¿i Khi sđú nú s¿ giÁm bỏt lưÿng cỏc thread cần phÁi chò hỗ trÿ cỏc lưÿt tÁi và tòn nhiÃu thòi gian
H ò tr ÿ cho cỏc cỏc module và handler b ¿t đò ng b ỏ d ¿ ng await và task-based (Support for await and Task- Based Asynchronous Modules and Handlers)
NÃn tÁng NET 4 đó giỏi thióu đÁn khỏi nióm lÁp trỡnh bÃt đỏng bò gọi là task Cỏc task đưÿc đ¿i diỏn bỏi kiòu dă lióu Task và cỏc kiòu liờn quan cú trong namespace System.Threading.Tasks NÃn tÁng NET 4.5 tiÁp tāc cÁi tiÁn và giúp cho viãc làm viãc vỏi cỏc đòi tưÿng Task trỏ nờn đơn giÁn hơn Vỏi NET 4.5, trỡnh biờn dỏch hỗ trÿ hai tÿ khúa mỏi đú là await và async Tÿ khúa await giỳp xỏc đỏnh mòt đo¿n mó lónh phÁi chò đÿi bÃt đỏng bò đÁn khi mòt đo¿n code khỏc thực thi xong Cũn tÿ khúa async thỡ l¿i là chò d¿n rằng b¿n cú thò sā dāng cỏc phương thāc cú tÿ khúa đú như là cỏc phương thāc bÃt đỏng bò d¿ng task-based
Sự kÁt hÿp giăa hai tÿ khúa await, async và đòi tưÿng Task giỳp cho b¿n cú thò dỏ dàng viÁt mó bÃt đỏng bò trong NET 4.5 ASP.NET 4.5 hỗ trÿ bằng cỏc APIs giỳp cho b¿n cú thò viÁt cỏc HTTP modules và cỏc HTTP handlers bÃt đỏng bò sā dāng cỏc cÁi tiÁn cÿa trình biên dách
1.2.2.1 Cỏc module HTTP b¿t đòng bỏ
Để bắt đầu thực hiện tác vụ bất đồng bộ trong NET, bạn cần xác định phương thức bất đồng bộ sẽ thực hiện một cuộc gọi bất đồng bộ đến trang web của Microsoft Phương thức này sẽ bao gồm tất cả các tham số cần thiết bạn cần phải viết và NET runtime sẽ tự động quản lý ngăn xếp cuộc gọi trong khi chờ quá trình tải xuống hoàn tất, cũng như giải phóng ngăn xếp cuộc gọi khi quá trình tải xuống hoàn tất.
Bõy giò giÁ như b¿n muòn sā dāng phương thāc bÃt đỏng bò trong mòt ASP.NET
HTTP module ASP.NET 4.5 cú mòt phương thāc trÿ giỳp
(EventHandlerTaskAsyncHelper) và mòt kiòu dă lióu delegate mỏi (TaskEventHandler) mà nhỏ đú b¿n cú thò dỏ dàng tớch hÿp cỏc phương thāc bÃt đỏng bò d¿ng task-based vỏi mụ thāc lÁp trỡnh bÃt đòng bò đưÿc thực thi bỏi ASP.NET pipeline Vớ dā dưỏi đõy cho thÃy cách thực hiãn:
1.2.2.2 Cỏc Http handler b ¿t đò ng b ỏ
Cỏch tiÁp cÁn truyÃn thòng đò viÁt cỏc handler bÃt đỏng bò trong ASP.NET chớnh là cài đ¿t interface IHttpAsyncHandler ASP.NET 4.5 giỏi thióu kiòu bÃt đỏng bò
HttpTaskAsyncHandler mà b¿n cú thò kÁ thÿa, và s¿ giỳp vióc xõy dựng cỏc handler bÃt đỏng bò dỏ dàng hơn
Kiòu HttpTaskAsyncHandler là trÿu tưÿng và yờu cầu b¿n phÁi quỏ tÁi phương thāc ProcessRequestAsync ASP.NET s¿ cháu trách nhiãm và viãc tích hÿp dÃu hiãu d¿ng Task-based đưÿc ProcessRequestAsync vỏi mụ hỡnh lÁp trỡnh bÃt đỏng bò cũ đưÿc sā dāng bái ASP.NET pipeline
Vớ dā dưỏi đõy chò d¿n cho b¿n cỏch sā dāng Task và tÿ khúa await như là mòt phần cÿa vióc cài đ¿t mòt HTTP handler bÃt đỏng bò
Các tính nng mã i ki à m tra tính h ÿ p l á đố i v ã i Request
ASP.NET m¿c đỏnh thực hión vióc kiòm tra tớnh hÿp ló đòi vỏi request, nú s¿ kiòm tra cỏc request đò tỡm cỏc thẻ ho¿c script trong cỏc trưòng, header, cookies… NÁu như nó phát hiãn đưÿc điÃu gì bÃt hÿp lã, ASP.NET s¿ ném ngo¿i lã Hành vi này là tuyÁn phũng ngÿa đầu tiờn ddooois vỏi lòi tÃn cụng cross-site scripting attack
ASP.NET 4.5 giỳp cho vióc đọc cỏc dă lióu chưa đưÿc kiòm tra dỏ dàng hơn
ASP.NET 4.5 cũng m¿c đánh tích hÿp thư viãn AntiXSS
Cỏc lÁp trỡnh viờn thưòng yờu cầu cho phộp đưÿc tuyef chọn tắt vióc kiòm tra hÿp ló đòi vỏi request trong cỏc āng dāng cÿa họ Vớ dā như, nÁu āng dāng cÿa b¿n là mòt diỏn đàn, b¿n s¿ muòn cho phộp ngưòi dựng gỏi lờn cỏc bài viÁt theo đỏnh d¿ng
HTML nhưng v¿n đÁm bÁo rằng vióc kiòm tra tớnh hÿp ló s¿ đưÿc thực hión ỏ nhăng nơi còn l¿i
TắO TRANG WEB VõI VISIUAL STUDIO
- Chúng ta kích ho¿t āng dāng Visual Studio (h1.2)
- NÁu chọn New Project xuÃt hión hòp hòi tho¿i New Project (h1.3)
Visual Basic → Web nÁu chọn Visual Basic là ngôn ngă viÁt āng dāng
Visual C# → Web nÁu chọn C# là ngôn ngă viÁt āng dāng
- Trong Templates chọn ASP.NET Web Application,
- Trong Name đ¿t tên cho Project, tên do ta đ¿t
- Trong Location là thư māc chāa Project
NÁu chọn New Web Site xuÃt hión hòp hòi tho¿i New Project sau
Visual Basic → Web nÁu chọn Visual Basic là ngôn ngă viÁt āng dāng
Visual C# → Web nÁu chọn C# là ngôn ngă viÁt āng dāng
- Trong Templates chọn ASP.NET Web Application
- Trong Location chọn tên và thư mực chāa Project
Hỡnh 1.3: Chòn āng dāng ASP.NET Web Application
Hình 1.4: T¿o dą án d¿ng ASP.NET Web Application
Vớ dā ta t¿o mòt dự ỏn cú tờn là BigSchool, đ¿t t¿i ó đĩa C, chọn ngụn ngă chọn là C# (h1.5) sau đó bÃm OK TiÁp theo, chọn āng dāng Web MVC
TiÁp theo nhÃn vào Change Authentication:
Individual User Accounts: Dự án đưÿc t¿o ra là lo¿i dự án Web bao gám cÁ phần security
No Authentication: Dự án đưÿc t¿o ra là dự án Web không bao gám phần security
Windows Authentication: Dự án đưÿc t¿o ra là lo¿i dự án Web bao gám cÁ phần security nhưng tài khoÁn đưÿc quÁn lý trờn m¿ng nòi bò
Work or School Accounts: Dự án đưÿc t¿o ra là lo¿i dự án Web sā dāng tài khoÁn tÿ cloud computing
Ngoài ra: b¿n cú thò chọn Web API đò bó sung khÁ năng hỗ trÿ xõy dựng thư vión web Đò thực thi āng dāng web này dưỏi d¿ng Debug, chỳng ta chọn Deburg → Start
Ki¿n trúc MVC là việc chia tất cả mục của một ứng dụng ra làm ba thành phần (component) khác nhau Model, View và Controller:
Model đóng vai trò cầu nối giữa giao diện người dùng (View) và cơ sở dữ liệu Nó chịu trách nhiệm xác thực, xử lý logic và lưu dữ liệu trong các kho lưu trữ dữ liệu Dữ liệu được nhập từ View sẽ được Model kiểm tra tính hợp lệ trước khi lưu vào cơ sở dữ liệu, đảm bảo chính xác và toàn vẹn của dữ liệu.
- View: View hiÃn thị các thông tin cho ng°ời dùng của ứng dụng và đ°ợc giao nhiệm vụ cho việc nhận các dữ liệu vào từ ng°ời dùng, gửi đi các yêu cầu đ¿n bộ điÁu khiÃn, sau đó là nhận lại các phản hồi từ bộ điÁu khiÃn và hiÃn k¿t quả cho ng°ời dùng Các trang HTML, JSP, các th° viện thà và các tập tin nguồn là một phần của thành phần View
- Controller: Controller là tầng trung gian giữa Model và View Controller đ°ợc giao nhiệm vụ nhận các yêu cầu từ phía máy khách Một yêu cầu đ°ợc nhận từ máy khách đ°ợc thực hiện bởi một chức năng logic thích hợp từ thành phần Model và sau đó sinh ra các k¿t quả cho ng°ời dùng và đ°ợc thành phần View hiÃn thị ActionServlet, Action, ActionForm và struts-config.xml là các phần của Controller
- Làm quen vỏi mụi trưòng Microsoft Visual Studio
- Xây dựng āng dāng web đơn giÁn WebCalculator
ViÁt mã lãnh xā lý đơn giÁn
Ch¿y, Debug và sāa lỗi chương trình
Cõu 2: Mụi trưòng Microsoft Visual Studio 2010 ho¿c mỏi hơn
- Mòt sò khỏi nióm cơ sỏ
Thÿ tāc – Hàm (Private, Protected, Public)
Lưu mã nguán trong tÁp tin riêng biãt (Yes? No?)
Toolbox o Thêm control/tab vào toolbox (BÃm phÁi \ Add …) o Kéo thÁ control vào Form
Xem màn hình design form: Shift-F7
Chuyòn đói tÿ Design sang Code và ngưÿc l¿i: F7
Ch¿y chương trỡnh: Ctrl-F5 (ho¿c F5 vỏi chÁ đò Debug)
CÁC LâP SĀ DĀN G TRONG ASP.NET
HTTP REQUEST
Request là mòt thò hión cÿa lỏp HttpRequest Trỡnh duyót dựng đòi tưÿng
Request đò gāi thụng tin cần thiÁt tỏi Server
Hình 2.1: Ng°ời dùng gởi yêu cÁu đ¿n server Đòi tưÿng Request nhÁn tÃt cÁ giỏ trỏ mà trỡnh duyót cÿa client gỏi đÁn server thụng qua HTTP Request
Request đ¿i diãn cho Client khi yêu cầu trang Web, Server s¿ dùng vÿa Response vÿa Request đò đỏp āng yờu cầu hay đũi hỏi thụng tin tÿ Client
RequestType: trÁ và phương thāc truyÃn dă liãu tÿ client đÁn server gám 2 phương thāc POST và GET
Cú pháp: var valMethode=Request.RequestType;
Form collection đưÿc sā dāng đò tÁp hÿp dă lióu đưÿc chāa trong cỏc phần tā cÿa form chuyòn tÿ client đÁn server bằng phương thāc POST.
HTTP RESPONSE
Http Response đưÿc dựng đò truyÃn dă lióu mỏy chÿ web đÁn trỡnh duyót web
Các thu ác tính/ph°¢ng thā c
- Thuác tính Buffer: có 2 giá trá true và false quy đánh cách truyÃn tÁi dă liãu:
Cú pháp: Response.Buffer=true/false;
true: Hoàn tÃt cụng vióc và gāi mòt lần
false: Thực hiãn xong đÁn đâu thì gāi đÁn đó
- isClientConnected: Kiòm tra mỏy client cú yờu cầu kÁt nòi đÁn server, kÁt quÁ trÁ và giá trá true/false
- Cookies: đưÿc sā dāng đò ghi Cookies Cookies đưÿc thò hión trong ASP.NET là lỏp
- End(): KÁt thúc tiÁn trình xā lý trên Server và đẩy dă liãu tái Client
- Flush(): KÁt thúc tiÁn trình, quay l¿i thực hiãn tiÁp
- Redirect(url) : dựng đò chuyòn client sang mòt URL khỏc
- Redirect(url, Boolean): dựng đò chuyòn client sang mòt URL khỏc, trong đú:
NÁu Boolean=true thì khi thực hiãn xong, lãnh Response s¿ thực hiãn tiÁp
NÁu Boolean =false thì khi thực hiãn xong, lãnh Response s¿ dÿng
- Write( EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken7a5c561934e089= requirePermission=
G IõI THIàU Đ ịNH T UYắN TRONG ASP.NET C ORE MVC
Đò nh tuy ¿ n trong ASP.NET Core MVC là gỡ? Đỏnh tuyÁn trong Āng dāng web ASP.NET Core MVC là mòt cơ chÁ trong đú nú s¿ kiòm tra cỏc Yờu cầu HTTP đÁn (tāc là URL) và sau đú ỏnh x¿ yờu cầu HTTP đú tỏi phương thāc hành đòng cÿa bò điÃu khiòn Vióc ỏnh x¿ này đưÿc thực hión theo cỏc quy tắc đánh tuyÁn đưÿc xác đánh cho āng dāng
ASP.NET Core MVC Framework ánh x¿ các Yêu cầu HTTP đÁn, tāc là các URL tái các phương thāc hành đòng cÿa Bò điÃu khiòn dựa trờn cỏc tuyÁn đưÿc đỏnh cÃu hỡnh trong āng dāng cÿa b¿n B¿n cú thò cÃu hỡnh nhiÃu tuyÁn cho āng dāng cÿa mỡnh và đòi vỏi mỗi tuyÁn b¿n cũng cú thò đ¿t mòt sò cÃu hỡnh cā thò như giỏ trỏ m¿c đỏnh, ràng buòc, v.v Đò nh tuy ¿ n ho ¿t đỏng nh° th¿ nào trong ASP.NET Core? Đỏnh tuyÁn là mòt hó thòng khỏp m¿u đò theo dừi yờu cầu đÁn và tỡm ra nhăng vióc cần làm vỏi yờu cầu đú Thụng thưòng, đú là mòt cỏch phāc vā yờu cầu cÿa ngưòi dựng
Hỡnh 9-1 SÂ đò đònh tuy¿n
Khi ngưòi dựng thực hión mòt yờu cầu, tāc là thực hión mòt HTTP Request, thỡ yờu cầu đú đầu tiờn đưÿc nhÁn bỏi đòng cơ đỏnh tuyÁn (Routing Engine) Mòt khi đòng cơ Đỏnh tuyÁn nhÁn đưÿc mòt yờu cầu HTTP, hó thòng Đỏnh tuyÁn s¿ cò gắng tỡm ra m¿u đưòng d¿n phự hÿp cÿa URL đưÿc yờu cầu vỏi cỏc đưòng d¿n đó đăng ký Cỏc đưòng d¿n chāa thụng tin và tờn Controller, tờn phương thāc hành đòng, lo¿i phương thāc
(Get, Post, Put, Patch, Delete), tham sò phương thāc, dă lióu đưòng d¿n, v.v
NÁu tỡm thÃy mòt m¿u URL phự hÿp cho yờu cầu đÁn thỡ nú s¿ chuyòn tiÁp yờu cầu đÁn controller và phương thāc hành đòng thớch hÿp NÁu khụng tỡm m¿u URL phự hÿp Yờu cầu HTTP đÁn, thỡ nú đơn giÁn trÁ l¿i mó tr¿ng thỏi HTTP 404 cho ngưòi dựng
Hỡnh 9-2 SÂ đò ho¿t đỏng cÿa đònh tuy¿n
Vớ dā: Ta đưa ra yờu cầu tỏi URL /Home/Index thỡ phương thāc hành đòng
Index cÿa láp Home Controller s¿ xā lý yêu cầu đó, như trong hình bên dưái
Hình 9-3 Xā lý yêu cÁu ở lãp index
Khi người dùng đưa ra yêu cầu truy cập đến một URL cụ thể, chẳng hạn như /Home/Details/2, thì phương thức hành động Details của lớp HomeController sẽ được thực thi để xử lý yêu cầu đó Trong trường hợp này, giá trị tham số 2 sẽ được tự động ánh xạ tới tham số id của phương thức hành động Details.
Hình 9-4 Xā lý yêu cÁu ánh x¿ tãi tham số id
Tỡm hi Ãu đò nh tuy ¿ n URL trong ASP.NET Core MVC
Trỡnh duyót yờu cầu mòt đỏa chò tÿ controller action trong ASP.NET Core MVC
URL routing defines which controller action a URL request should be directed to It utilizes a routing table to map requests to specific controllers and actions.
Khi t¿o Āng dāng ASP.NET Core bằng cách sā dāng M¿u ASP.NET Core Model-View- Controller Cỏc thành phần cÿa MVC Services và MVC Middleware bắt buòc theo m¿c đỏnh s¿ đưÿc thờm vào đưòng òng xā lý yờu cầu Vỡ vÁy, nÁu b¿n mỏ lỏp Chương trỡnh, b¿n s¿ tìm thÃy đo¿n mã sau
Các thành phần trung gian MVC đưÿc thêm bằng cách sā dāng các phương thāc UseRouting và MapControllerRoute Hơn năa, nÁu b¿n chú ý đÁn MapControllerRoute, b¿n s¿ thÃy như sau namespace RoutingInASPDotNetCoreMVC
{ public static void Main(string[] args)
{ var builder = WebApplication.CreateBuilder(args);
// Add services to the container builder.Services.AddControllersWithViews(); var app = builder.Build();
// Configure the HTTP request pipeline if (!app.Environment.IsDevelopment())
// The default HSTS value is 30 days You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts app.UseHsts();
} app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
Hình 9-5 MapControllerRoute Đỏnh tuyÁn m¿c đỏnh đưÿc t¿o bằng m¿u URL Vỡ vÁy, nÁu ta khụng chò đỏnh bÃt cā điÃu gỡ trong URL thỡ theo m¿c đỏnh, phương thāc hành đòng Index cÿa lỏp Home Controller s¿ xā lý yêu cầu {controller=Home}/{action=Index}/{id?}
Phương thāc MapControllerRoute đưÿc sā dāng đò xỏc đỏnh đỏnh tuyÁn m¿c đỏnh Tham sò chò đỏnh đỏnh tuyÁn, trong đú {controller}, {action} và {id} là thành phần cho tham sò đỏnh tuyÁn
- {controller}: Đ¿i dión cho tờn cÿa lỏp trỡnh điÃu khiòn
- {action}: Đ¿i dión cho tờn cÿa phương thāc hành đòng trong bò điÃu khiòn
- {id?}: Đ¿i dión cho mòt tham sò tuyÁn đưòng tựy chọn cú tờn là
{ options.IdleTimeout = TimeSpan.FromMinutes(30); // Session timeout sau 30 phỳt khụng ho¿t đòng options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true;
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
// app.UseSession(); // Thêm middleware session vào pipeline
L°u tră thông tin vào Session: public IActionResult Login(string username)
// L±u username vào session sau khi đăng nhập thành công.
HttpContext.Session.SetString("Username", username); return RedirectToAction("Index");
Truy xu¿t thông tin tÿ Session public IActionResult Index()
{ // L¿y username tÿ session var username = HttpContext.Session.GetString("Username");
// Sÿ dÿng thông tin l¿y đ±ÿc tÿ session.
ViewBag.Username = username; return View();
Trong bài giÁng này, chúng ta đã học cách sā dāng cookies và sessions trong ASP.NET Core MVC đò quÁn lý state Cookies thớch hÿp cho vióc lưu tră thụng tin khụng quỏ nh¿y cÁm và cú thò duy trỡ qua nhiÃu phiờn làm vióc cÿa ngưòi dựng, trong khi sessions phự hÿp cho vióc lưu tră dă lióu nh¿y cÁm và cần đưÿc bÁo vó tòt hơn
Bài học đà cÁp tỏi hai phương phỏp chớnh đò quÁn lý tr¿ng thỏi: sā dāng cookies và sessions Đầu tiờn, cookies, đưÿc lưu tră trờn trỡnh duyót ngưòi dựng và gāi đÁn server mỗi khi thực hiãn yêu cầu HTTP, cho phép lưu giă thông tin như tùy chọn cá nhân ho¿c tr¿ng thái đăng nhÁp
TiÁp theo, chỳng ta s¿ khỏm phỏ sessions, mòt kÿ thuÁt lưu tră thụng tin ngưòi dựng trờn server mà khụng phā thuòc vào client ĐiÃu này giỳp giÁm bỏt gỏnh n¿ng cho ngưòi dựng và tăng cưòng bÁo mÁt, vỡ thụng tin quan trọng khụng đưÿc lưu tră trực tiÁp trên máy cÿa họ
Cuòi cựng, thụng qua cỏc vớ dā minh họa trong bài học, sinh viờn s¿ đưÿc thực hành cỏch triòn khai và tớch hÿp cookies và sessions vào āng dāng web cÿa mỡnh Māc tiờu là đò cú thò quÁn lý hióu quÁ thụng tin ngưòi dựng qua nhiÃu yờu cầu và phiờn làm vióc, đỏng thòi duy trỡ tớnh bÁo mÁt cao và t¿o ra nhăng trÁi nghióm ngưòi dựng mưÿt mà và cá nhân hóa
Cõu 1: Thực hành cỏch t¿o mòt cookie đò lưu tră sỏ thớch cÿa ngưòi dựng B¿n s¿ viÁt mòt action trong controller cÿa b¿n đò t¿o mòt cookie cú tờn "UserPreferences"
Cookie này s¿ chāa thông tin dưái d¿ng chuỗi JSON, bao gám màu sắc yêu thích và kớch cỡ font chă, và đưÿc cÃu hỡnh đò tỏn t¿i trong 7 ngày Sau đú, b¿n cần viÁt mòt action khỏc đò đọc giỏ trỏ cÿa cookie này và hiòn thỏ thụng tin đó lưu tră lờn mòt view
Để lưu trữ thông tin người dùng trên nhiều yêu cầu HTTP, hãy cấu hình phiên trong Startup.cs hoặc Program.cs Tạo một hành động trong bộ điều khiển để lưu trữ đối tượng chứa thông tin người dùng vào phiên Tạo thêm hành động để truy xuất đối tượng này và hiển thị thông tin trong chế độ xem Bài tập này hướng dẫn cách lưu trữ thông tin phiên và bảo mật thông tin người dùng.
Cõu 3: Trong bài tÁp cuòi cựng, b¿n s¿ kÁt hÿp kiÁn thāc và cookies và sessions đò xõy dựng mòt tớnh năng đăng nhÁp đơn giÁn B¿n s¿ thiÁt kÁ mòt form đăng nhÁp, lưu thụng tin ngưòi dựng vào session sau khi đăng nhÁp thành cụng, và sā dāng cookies đò ghi nhỏ ngưòi dựng trong cỏc lần truy cÁp sau Māc tiờu là đò b¿n cú thò triòn khai mòt hó thòng quÁn lý tr¿ng thỏi đơn giÁn nhưng hióu quÁ, giỳp t¿o ra trÁi nghióm ngưòi dựng liÃn m¿ch và an toàn trờn āng dāng web cÿa mỡnh.
ENTITY FRAMEWORK CORE
G IâI THIàU VÀ E NTITY F RAMEWORK C ORE
Entity Framework Core (EF Core) là mòt khung làm vióc ORM (Object-Relational Mapper) hiãn đ¿i, m¿nh m¿ và linh ho¿t dành cho các āng dāng NET
Entity Framework Core là gì?
EF Core là phiờn bÁn mỏi nhÃt cÿa Entity Framework, đưÿc thiÁt kÁ đò tòi ưu húa vióc phỏt triòn āng dāng bằng cỏch cung cÃp khÁ năng truy cÁp và quÁn lý dă lióu mòt cỏch trực quan và hióu quÁ Nú là mòt phần cÿa gia đỡnh NET Core và hỗ trÿ cÁ NET Core l¿n NET Framework
ORM là cụng cā giỳp ỏnh x¿ cỏc đòi tưÿng trong ngụn ngă lÁp trỡnh sang cỏc bÁng trong cơ sá dă liãu quan hã, và ngưÿc l¿i Nó cho phép lÁp trình viên tương tác vái cơ sỏ dă lióu thụng qua cỏc đòi tưÿng và thuòc tớnh trong ngụn ngă lÁp trỡnh thay vỡ viÁt trực tiÁp câu lãnh SQL
Sā dāng ORM giỳp giÁm thiòu lỗi do nhầm l¿n trong cõu lónh SQL, tÁn dāng đưÿc khÁ năng tỏi sā dāng và bÁo trỡ mó nguỏn dỏ dàng hơn, đỏng thòi cung cÃp māc đò trÿu tưÿng hóa cao hơn so vái viãc tương tác trực tiÁp vái cơ sá dă liãu
Vỡ sao ch ò n Entity Framework Core trong cỏc ā ng d ā ng NET?
EF Core đưÿc tích hÿp sâu vào hã sinh thái NET, cung cÃp khÁ năng tương thích cao và hióu suÃt tòt Nú hỗ trÿ cỏc kiÁn trỳc āng dāng hión đ¿i, tÿ microservices đÁn āng dāng web và di đòng.
CÁC PH¯ĂNG PHÁP TIắP CÂN TRONG ENTITY FRAMEWORK CORE
EF Core cung cÃp hai phương pháp tiÁp cÁn chính: Code First và Database First
Phương pháp Code First cho phép b¿n t¿o ra mô hình dă liãu bằng code C#, tÿ đó
EF Core s¿ tự đòng t¿o ra cơ sỏ dă lióu Đõy là phương phỏp linh ho¿t, cho phộp b¿n quÁn lý phiên bÁn cÿa cơ sá dă liãu thông qua migrations
Vớ dā minh hòa: public class BloggingContext : DbContext
{ public DbSet Blogs { get; set; } public DbSet Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Integrated
{ public int BlogId { get; set; } public string Url { get; set; } public List Posts { get; } = new List();
{ public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; }
Trong ví dā trên, chúng ta có hai láp `Blog` và `Post` ánh x¿ đÁn hai bÁng trong cơ sỏ dă lióu EF Core s¿ tự đòng t¿o ra cỏc bÁng này khi ch¿y migration
Phương phỏp Database First bắt đầu tÿ mòt cơ sỏ dă lióu đó tỏn t¿i EF Core s¿ t¿o ra code C# dựa trên cÃu trúc cÿa cơ sá dă liãu đó
Utilizing existing database schemas, you can generate code utilizing EF Core's scaffolding tools The syntax for this operation using dotnet is:dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -o Models
Lãnh trên s¿ t¿o ra các láp C# trong thư māc `Models` dựa trên cơ sá dă liãu
EF C ORE D ATABASE P ROVIDERS
EF Core hỗ trÿ nhiÃu lo¿i cơ sá dă liãu (database providers) khác nhau, tÿ SQL Server, MySQL, PostgreSQL đÁn SQLite, vvv ĐiÃu này giỳp EF Core cú thò đưÿc sā dāng trong nhiÃu mụi trưòng và vỏi nhiÃu lo¿i cơ sỏ dă lióu khỏc nhau.
ASP.NET C ORE MVC S Ā DĀNG EF C ORE
Chỳng ta s¿ tỡm hiòu cỏch thực hión cỏc thao tỏc CRUD (Create, Read, Update, Delete) trong ASP.NET Core MVC sā dāng Entity Framework Core (EF Core), và áp dāng m¿u thiÁt kÁ Repository đò cÁi thión cÃu trỳc mó nguỏn và tỏch biót tầng truy cÁp dă liãu
Thao tác CRUD trong ASP.NET Core MVC v ã i EF Core
T¿o dą án mãi Đầu tiờn, b¿n cần t¿o mòt dự ỏn ASP.NET Core MVC mỏi Trong Visual Studio, b¿n cú thò chọn "File" -> "New" -> "Project", sau đú chọn "ASP.NET Core Web Application" và đ¿t tên cho dự án cÿa b¿n
Thêm EF Core vào dự án cÿa b¿n thông qua NuGet package manager bằng cách ch¿y lãnh sau trong Package Manager Console:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
T¿o mòt class cho model cÿa b¿n Vớ dā, nÁu b¿n đang làm vióc vỏi mòt āng dāng quÁn lý sỏch, b¿n cú thò cú mòt model `Book` như sau: public class Book
{ public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public DateTime PublishedOn { get; set; }
T¿o mòt lỏp `ApplicationDbContext` kÁ thÿa tÿ `DbContext`: public class ApplicationDbContext : DbContext
{ public ApplicationDbContext(DbContextOptions options)
} public DbSet Books { get; set; }
Trong file `Startup.cs`, đăng ký `ApplicationDbContext` vái dependency injection container: public void ConfigureServices(IServiceCollection services)
{ services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddControllersWithViews();
T¿o Migration và C¢ sở dă liáu
Sā dāng EF Core Migration đò t¿o cơ sỏ dă lióu tÿ model cÿa b¿n:
T¿o mòt `BooksController` vỏi cỏc action methods đò thực hión cỏc thao tỏc CRUD public class BooksController : Controller
{ private readonly ApplicationDbContext _context; public BooksController(ApplicationDbContext context)
// GET: Books public async Task Index()
{ return View(await _context.Books.ToListAsync());
// GET: Books/Details/5 public async Task Details(int? id)
} var book = await _context.Books
FirstOrDefaultAsync(m => m.Id == id); if (book == null)
// GET: Books/Create public IActionResult Create()
[ValidateAntiForgeryToken] public async Task Create([Bind("Id,Title,Author,PublishedOn")] Book book)
_context.Add(book); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index));
// GET: Books/Edit/5 public async Task Edit(int? id)
} var book = await _context.Books.FindAsync(id); if (book == null)
[ValidateAntiForgeryToken] public async Task Edit(int id, [Bind("Id,Title,Author,PublishedOn")] Book book) { if (id != book.Id)
_context.Update(book); await _context.SaveChangesAsync();
// GET: Books/Delete/5 public async Task Delete(int? id)
} var book = await _context.Books
FirstOrDefaultAsync(m => m.Id == id); if (book == null)
[ValidateAntiForgeryToken] public async Task DeleteConfirmed(int id)
{ var book = await _context.Books.FindAsync(id);
_context.Books.Remove(book); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index));
} private bool BookExists(int id)
{ return _context.Books.Any(e => e.Id == id);
T¿o cỏc views tương āng cho mỗi action method trong controller đò hiòn thỏ và gāi dă liãu đÁn server
M Á u Thi ¿ t k ¿ Repository trong ASP.NET Core MVC s ā d ā ng EF Core
Repository Pattern là mòt m¿u thiÁt kÁ giỳp tỏch biót logic truy cÁp dă lióu khỏi business logic cÿa āng dāng ĐiÃu này khụng chò làm cho mó nguỏn dỏ bÁo trỡ hơn mà cũn tăng khÁ năng tỏi sā dāng và kiòm thā
T¿o Interface Repository public interface IRepository
T Get(int id); void Create(T entity); void Update(T entity); void Delete(T entity);
T¿o Concrete Repository public class Repository : IRepository where T : class
{ private readonly ApplicationDbContext _context; private DbSet entities; public Repository(ApplicationDbContext context)
_context = context; entities = context.Set();
Sā dāng Repository trong Controller
Khi đó cú repository, b¿n cú thò sā dāng nú trong controller cÿa mỡnh thay vỡ trực tiÁp sā dāng DbContext: public class BooksController : Controller
{ private readonly IRepository _bookRepository; public BooksController(IRepository bookRepository)
} Đng ký Repository vãi Dependency Injection
Trong `Startup.cs` ho¿c 8Program.cs9, đăng ký repository cÿa b¿n đò cú thò sā dāng trong controller: public void ConfigureServices(IServiceCollection services)
{ services.AddScoped(typeof(IRepository), typeof(Repository)); services.AddControllersWithViews();
KÁt hÿp giăa ASP.NET Core MVC, EF Core, và m¿u thiÁt kÁ Repository t¿o nờn mòt kiÁn trúc āng dāng m¿nh m¿, linh ho¿t và dá bÁo trì Thông qua viãc áp dāng các phương phỏp này, b¿n cú thò xõy dựng cỏc āng dāng web hióu quÁ và chuyờn nghióp
Trong bài học này, chúng ta đã học cách tạo ứng dụng web sử dụng ASP.NET Core MVC và Entity Framework Core để thực hiện các thao tác CRUD Qua việc xây dựng một ứng dụng quản lý sách, bạn đã học cách thiết lập mô hình `Book`, cấu hình database, tạo controller và views để quản lý dữ liệu sách.
`DbContext` và t¿o cỏc phương thāc hành đòng trong `BooksController` đò xā lý vióc thêm, đọc, cÁp nhÁt và xóa dă liãu B¿n cũng đã đưÿc hưáng d¿n cách sā dāng EF Core đò tương tỏc mòt cỏch hióu quÁ vỏi cơ sỏ dă lióu SQL Server
Ngoài ra, bài học đó đi sõu vào vióc ỏp dāng Repository Pattern đò tăng cưòng tính tái sā dāng và bÁo trì mã nguán, giúp tách biãt logic nghiãp vā khỏi logic truy cÁp dă lióu B¿n đó học cỏch triòn khai `IRepository` và `BookRepository`, cũng như cỏch sā dāng Migrations đò quÁn lý cỏc thay đói cơ sỏ dă lióu mòt cỏch linh ho¿t và an toàn Cuòi cựng, b¿n đó đưÿc giỏi thióu và cỏch thāc seeding data, mòt phần quan trọng đò khỏi t¿o dă lióu m¿u cho āng dāng khi nú mỏi đưÿc triòn khai
Cõu 1: Trong bài tÁp này, b¿n s¿ t¿o mòt āng dāng web ASP.NET Core MVC đơn giÁn đò quÁn lý thụng tin sỏch Āng dāng này s¿ cho phộp ngưòi dựng thực hión cỏc thao tỏc cơ bÁn: thờm mỏi sỏch (Create), hiòn thỏ danh sỏch sỏch (Read), chònh sāa thụng tin sỏch (Update) và xúa sỏch khỏi danh sỏch (Delete) Đò bắt đầu, b¿n cần thiÁt lÁp mòt dự ỏn mỏi, cÃu hỡnh `DbContext`, t¿o model `Book`, và sau đú triòn khai cỏc phương thāc hành đòng trong controller đò xā lý cỏc yờu cầu tÿ ngưòi dựng
Câu 2: Dựa trên āng dāng CRUD b¿n đã t¿o trong Bài TÁp 1, nhiãm vā cÿa b¿n là tái cÃu trỳc mó nguỏn hión t¿i đò ỏp dāng Repository Pattern B¿n s¿ t¿o ra mòt interface `IRepository` và mòt lỏp `BookRepository` thực thi interface này Lỏp
`BookRepository` s¿ cháu trách nhiãm cho tÃt cÁ các thao tác truy cÁp dă liãu liên quan đÁn `Book` Sau đú, b¿n s¿ sāa đói `BooksController` đò sā dāng
`BookRepository` thay vì truy cÁp `DbContext` trực tiÁp
Cõu 3: Trong bài tÁp cuòi cựng này, māc tiờu cÿa b¿n là học cỏch quÁn lý cỏc thay đói trong cơ sỏ dă lióu thụng qua Migrations trong EF Core B¿n s¿ thờm mòt sò trưòng mỏi vào model `Book`, chẳng h¿n như `Genre` và `Price` Sā dāng cụng cā Migrations đò ỏp dāng cỏc thay đói này vào cơ sỏ dă lióu Thờm vào đú, b¿n cũng cần viÁt mó đò "seed" (t¿o sẵn) dă lióu cho cơ sỏ dă lióu khi nú đưÿc t¿o ho¿c cÁp nhÁt, đÁm bÁo rằng cú mòt sò dă lióu m¿u đò làm vióc khi āng dāng đưÿc triòn khai lần đầu tiên.
BÀO MÂT CHO ĀNG DĀNG ASP.NET CORE MVC
G IâI T HIàU
Trong thời đại kỹ thuật số hiện nay, bảo mật thông tin trở thành một trong những ưu tiên hàng đầu đối với các nhà phát triển ứng dụng web ASP.NET Core MVC, một framework phổ biến của Microsoft, cung cấp nhiều tính năng và công cụ hỗ trợ tăng cường bảo mật cho ứng dụng Từ việc quản lý xác thực người dùng cho đến bảo vệ dữ liệu và ứng dụng khỏi các tấn công, bài viết này sẽ đi sâu vào các khía cạnh của bảo mật trong ASP.NET Core MVC và cung cấp ví dụ minh họa chi tiết.
Xác Th ą c và Phân Quy Á n
Xác thực (Authentication) và phân quyÃn (Authorization) là hai khái niãm cơ bÁn nhưng vô cùng quan trọng trong viãc bÁo mÁt āng dāng
Xác thực là quá trình xác minh danh tính người dùng ASP.NET Core MVC sử dụng Identity Framework, một hệ thống xác thực đầy đủ tính năng giúp quản lý người dùng, mật khẩu và các chính sách bảo mật.
Phổ biến quyền (Authorization) là quá trình xác định quyền hạn của người dùng được truy cập thực tế, quyết định rằng họ có thể làm gì và không thể làm gì trong một ứng dụng Trong ASP.NET Core MVC, quyền thường được quản lý thông qua các thuộc tính [Authorize] và [AllowAnonymous].
`[Authorize]` và `[AllowAnonymous]`, cũng như các Role và Policy-based authorization
Vớ Dā Minh Hòa: Xỏc Thąc Ng°ời Dựng
GiÁ sā b¿n đang phỏt triòn mòt āng dāng web cho phộp ngưòi dựng đăng nhÁp và xem thụng tin cỏ nhõn Đò quÁn lý quỏ trỡnh này, b¿n s¿ cần mòt `AccountController` cháu trách nhiãm xā lý đăng nhÁp và đăng ký public class AccountController : Controller
{ private readonly UserManager _userManager; private readonly SignInManager _signInManager; public AccountController(UserManager userManager, SignInManager signInManager)
[HttpPost] public async Task Login(LoginViewModel model)
} var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false); if (result.Succeeded)
// Đăng nhập thành công return RedirectToAction("Index", "Home");
ModelState.AddModelError("", "Thông tin đăng nhập không chính xác"); return View(model);
Trong vớ dā trờn, `AccountController` sā dāng `UserManager` đò quÁn lý ngưòi dựng và `SignInManager` đò xā lý vióc đăng nhÁp Mòt `LoginViewModel` đưÿc sā dāng đò chāa thụng tin tÿ form đăng nhÁp, và sau khi kiòm tra tớnh hÿp ló cÿa dă lióu nhÁp vào (`ModelState.IsValid`), b¿n thực hiãn đăng nhÁp thông qua
Nếu người dùng đăng nhập thành công, họ sẽ được chuyển hướng tới trang chủ (`Home/Index`) Ngược lại, họ sẽ được thông báo rằng thông tin đăng nhập không chính xác.
Phân Quy Á n và Ki à m Soát Truy C à p
Sau khi xỏc thực ngưòi dựng, b¿n cần đÁm bÁo rằng họ chò cú thò truy cÁp vào nhăng phần cÿa āng dāng mà họ đưÿc phép ĐiÃu này đưÿc thực hiãn thông qua phân quyÃn
Trong ASP.NET Core MVC, b¿n cú thò sā dāng thuòc tớnh `[Authorize]` đò h¿n chÁ truy cÁp chò cho ngưòi dựng đó đưÿc xỏc thực NÁu b¿n muòn thờm điÃu kión cā thò, như quyÃn h¿n dựa trên vai trò (role-based) ho¿c chính sách (policy-based), b¿n có thò cÃu hỡnh thờm trong `Startup.cs` public void ConfigureServices(IServiceCollection services)
{ services.AddControllersWithViews(); services.AddAuthorization(options =>
{ options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator"));
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ // C¿u hình middleware và các thi¿t lập khác app.UseAuthentication(); app.UseAuthorization();
// C¿u hình routing và các thi¿t lập khác
Sau khi cÃu hỡnh, b¿n cú thò sā dāng nú trong controller ho¿c action cÿa mỡnh
[Authorize(Policy = "RequireAdministratorRole")] public IActionResult AdminOnly()
} à đõy, chỳng ta đó t¿o mòt ràng buòc cÿa "RequireAdministratorRole" yờu cầu ngưòi dựng phÁi cú vai trũ "Administrator" đò truy cÁp vào action `AdminOnly` BÃt kỳ ngưòi dựng nào khụng đỏp āng yờu cầu này s¿ khụng thò truy cÁp vào phần này cÿa āng dāng.
ASP.NET C ORE I DENTITY
ASP.NET Core Identity là một framework hỗ trợ các tính năng xác thực người dùng, đăng ký, đăng nhập và quản lý thông tin người dùng Ngoài ra, nó còn hỗ trợ phân quyền và xác thực đa yếu tố, giúp tăng cường bảo mật.
Thi ¿ t L Ã p ASP.NET Core Identity Đò sā dāng ASP.NET Core Identity, b¿n cần thực hión cỏc bưỏc sau:
CÃu Hình Dách Vā Identity: Trong `Startup.cs`ho¿c 8Program.cs9, đăng ký các dách vā Identity trong phương thāc `ConfigureServices`
T¿o Cơ Sỏ Dă Lióu: Sā dāng Entity Framework Core đò t¿o cỏc bÁng dă lióu cần thiÁt cho vióc quÁn lý ngưòi dựng và quyÃn
Tích Hÿp Identity vào MVC: CÁp nhÁt các file cÃu hình và middleware trong
`Startup.cs`ho¿c 8Program.cs9 đò tớch hÿp Identity vỏi āng dāng MVC cÿa b¿n
ThiÁt LÁp Xỏc Thực Ngưòi Dựng: T¿o cỏc controller và view đò xā lý đăng ký, đăng nhÁp, và quÁn lý thụng tin ngưòi dựng
CÃu Hỡnh BÁo MÁt: ThiÁt lÁp cỏc chớnh sỏch bÁo mÁt như xỏc thực đa yÁu tò, khoỏ tài khoÁn sau mòt sò lần đăng nhÁp thÃt b¿i, và mó hoỏ mÁt khẩu
Vớ D ā Minh H òa: Đng Ký và Đng NhÃp Ng°ờ i Dựng
Dưỏi đõy là vớ dā và cỏch t¿o chāc năng đăng ký và đăng nhÁp cho ngưòi dựng sā dāng ASP.NET Core Identity:
// Controller xÿ lý đăng ký ng±òi dựng public class AccountController : Controller
{ private readonly UserManager _userManager; private readonly SignInManager _signInManager; public AccountController(UserManager userManager, SignInManager signInManager)
// GET: Đăng ký public IActionResult Register()
[HttpPost] public async Task Register(RegisterViewModel model)
{ var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded)
{ await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("index", "home");
} foreach (var error in result.Errors)
ModelState.AddModelError(string.Empty, error.Description);
// GET: Đăng nhập public IActionResult Login()
[HttpPost] public async Task Login(LoginViewModel model, string returnUrl = null)
{ var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded)
{ if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
ModelState.AddModelError(string.Empty, "Đăng nhập không thành công."); return View(model);
Trong đoạn code trên, `UserManager` và `SignInManager` là hai dịch vụ cốt lõi của ASP.NET Core Identity được sử dụng để quản lý người dùng và phiên đăng nhập Chúng cung cấp các action để xử lý việc đăng ký và đăng nhập, sử dụng các model để truyền dữ liệu giữa view và controller.
K ắT L UÂN
Vióc triòn khai bÁo mÁt thụng qua ASP.NET Core Identity là mòt bưỏc quan trọng trong viãc bÁo vã āng dāng ASP.NET Core MVC cÿa b¿n Bằng cách sā dāng các chāc năng đó đưÿc xõy dựng sẵn và tuõn theo cỏc thực tiỏn bÁo mÁt tòt nhÃt, b¿n cú thò t¿o ra mòt āng dāng khụng chò m¿nh m¿ và tớnh năng mà cũn văng chắc và bÁo mÁt
Bài học cung cÃp cái nhìn tãng quan và viãc bÁo mÁt thông tin trong āng dāng ASP.NET Core MVC thông qua viãc sā dāng ASP.NET Core Identity Công cā này giúp quÁn lý ngưòi dựng, mÁt khẩu, quyÃn truy cÁp và hỗ trÿ xỏc thực đa yÁu tò, đem l¿i khÁ năng bÁo mÁt cao cho āng dāng
Để tạo ứng dụng ASP.NET Core với tài khoản người dùng và quản lý dữ liệu, cần tích hợp các gói NuGet cần thiết, cấu hình Entity Framework Core và Identity vào ứng dụng MVC Những bước này đảm bảo ứng dụng có khả năng quản lý thông tin người dùng một cách an toàn và hiệu quả.
Cõu 1: T¿o mòt chāc năng đăng ký ngưòi dựng mỏi trong āng dāng ASP.NET Core
MVC cÿa b¿n Ngưòi dựng cần cung cÃp tờn đăng nhÁp, email và mÁt khẩu đò đăng ký MÁt khẩu phÁi tuân thÿ các quy tắc bÁo mÁt như có ít nhÃt 8 ký tự, bao gám chă hoa, chă thưòng và sò
Cõu 2: Xõy dựng chāc năng đăng nhÁp cho ngưòi dựng đó đăng ký Sau khi đăng nhÁp thành cụng, ngưòi dựng s¿ đưÿc chuyòn hưỏng đÁn trang chÿ và thụng tin phiờn làm viãc s¿ đưÿc lưu tră.