1. Trang chủ
  2. » Tất cả

18.Chuong 18

58 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 58
Dung lượng 1,48 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chapter Summary Problem Tiêm logic thêm vào chế biến theo yêu cầu Áp dụng bộ lọc để điều khiển hoặc các phương pháp hành động của nó 1–8 Hạn chế các phương pháp hành động cho người dùng

Trang 1

Table 18-1 Chapter Summary

Problem

Tiêm logic thêm vào chế biến theo yêu cầu Áp dụng bộ lọc để điều khiển hoặc các

phương pháp hành động của nó 1–8 Hạn chế các phương pháp hành động cho người

dùng và các nhóm cụ thể

Sử dụng bộ lọc cho phép 9–12

Quá trình lỗi khi thực hiện yêu cầu Sử dụng các bộ lọc ngoại lệ 20–30

Tiêm logic có mục đích chung vào quá trình xử

Kiểm soát thứ tự mà bộ lọc sẽ được thực thi Sử dụng các tham số thứ tự 47–49

Ghi đè bộ lọc toàn cầu và bộ điều khiển cho một

phương pháp hành động

Sử dụng một bộ lọc viết chèn ( override)

50–54

Chuẩn bị dự án Ví dụ

Trong chương này tôi tạo ra một dự án MVC mới gọi là bộ lọc bằng cách sử dụng mẫu rỗng, kiểm tra các tùy chọn

để thêm các thư mục core MVC và tham khảo Tôi tạo ra một bộ điều khiển chủ trong đó có các phương pháp hành động thể hiện trong Liệt kê 18-1 Tôi chỉ tập trung vào việc điều khiển trong chương này, vì vậy tôi trở về giá trị chuỗi từ các phương pháp hành động, chứ không phải là đối tượng ActionResult Điều này có tác dụng gây các MVC Framework để gửi các giá trị chuỗi trực tiếp vào trình duyệt, bằng cách thông qua các công cụ xem Razor

Listing 18-1 Nội dung của tập tin HomeController.cs

using System.Web.Mvc;

namespace Filters.Controllers {

public class HomeController : Controller {

Trang 2

public string Index() { return "This is the Index action on the Home controller";

} }

2014 vì vậy, để chứng minh sự xác thực các bộ lọc đặc trưng, đó là một phần của MVC Framework, tôi sẽ sử dụng phương pháp tương tự tôi tiếp nhận trong Chương 12 và xác định thông tin người dùng tĩnh trong file

Web.config, như thể hiện trong Liệt kê 18-2

Listing 18-2 Xác định Credentials người dùng trong tập tin Web.config

<user name="user" password="secret"/>

<user name="admin" password="secret" />

Listing 18-3 Nội dung của File AccountController.cs

using System.Web.Mvc;

using System.Web.Security;

namespace Filters.Controllers {

public class AccountController : Controller {

public ActionResult Login() {

Trang 3

3

"Admin"));

bool result = FormsAuthentication.Authenticate(username,

if (result) { FormsAuthentication.SetAuthCookie(username, false);

return Redirect(returnUrl ?? Url.Action("Index",

Trang 4

}

}

Để tạo ra quan điểm rằng sẽ thu thập thông tin ứng viên từ người sử dụng, tạo ra một Views /Shared Folder

và kích chuột phải vào nó

Chọn Thêm MVC 5 Xem trang (Razor), đặt tên Login.cshtml và nhấp vào nút OK để tạo ra xem Chỉnh sửa các điểm mới để phù hợp với nội dung hiển thị trong Liệt kê 18-4

Lưu ý tôi đang tạo ra một cái nhìn chia sẻ bởi vì tôi sẽ có thêm một bộ điều khiển xác thực thứ hai sau

trong chương này và tôi muốn sử dụng lại xem

Listing 18-4 Nội dung của File Login.cshtml

<input type="submit" value="Log in" />

}

</body>

</html>

Thiết lập các URL bắt đầu và kiểm thử các ứng dụng

Như với tất cả các dự án ví dụ, tôi dùng Visual Studio để bắt đầu với các URL gốc cho các ứng dụng hơn là đoán các URL dựa trên tập tin đang được chỉnh sửa Chọn lọc Properties từ menu Project Studio Visual, chuyển sang tab Web và kiểm tra các tùy chọn trang cụ thể trong phần Bắt đầu hành động Bạn không cần phải cung cấp một giá trị Chỉ cần kiểm tra các tùy chọn là đủ Nếu bạn bắt đầu ứng dụng ví dụ, bạn sẽ nhận được những phản ứng thể hiện trong hình 18-1

Trang 5

5

Figure 18-1 Running the example application

Trang 6

Sử dụng các bộ lọc

Bạn đã thấy một ví dụ về một bộ lọc trong Chương 12, khi tôi áp dụng ủy quyền cho các phương pháp hành động của

bộ điều khiển quản trị SportsStore Tôi muốn các phương pháp hành động chỉ được sử dụng bởi những người dùng

đã được xác thực bản thân, trong đó trình bày cho tôi với một sự lựa chọn của phương pháp tiếp cận Tôi đã có thể kiểm tra tình trạng ủy quyền của các yêu cầu trong mỗi và mọi phương pháp hành động, như thể hiện trong Liệt kê 18-5

Listing 18-5 Kiểm tra một cách rõ ràng trong phương pháp Authorization Action

namespace SportsStore.WebUI.Controllers {

public class AdminController : Controller {

// instance variables and constructor

public ViewResult Index() {

public class AdminController : Controller {

// instance variables and constructor

Trang 7

7 // rest of action method }

Trang 8

public ViewResult Create() {

// rest of action method }

public ViewResult Edit(int productId) {

// rest of action method }

// other action methods

}

}

Bộ lọc là thuộc tính NET mà thêm bước bổ sung cho các đường ống xử lý yêu cầu Tôi đã sử dụng các bộ lọc Authorize trong Liệt kê 18 6, trong đó có tác dụng tương tự như tất cả các kiểm tra trùng lặp trong Liệt kê 18-5

Giới thiệu các loại Lọc

Các MVC Framework hỗ trợ năm loại khác nhau của các bộ lọc Mỗi phép bạn giới thiệu logic tại các điểm khác nhau trong quá trình xử lý yêu cầu Các loại lọc được mô tả trong Bảng 18-2

Table 18-2 MVC Framework Filter Types

Trước khi các MVC Framework gọi một hành động, nó kiểm tra các định nghĩa phương pháp để xem nếu nó có các thuộc tính mà thực hiện các giao diện được liệt kê trong Bảng 18-2 Nếu vậy, thì tại thời điểm thích hợp trong quá trình

xử lý yêu cầu, phương pháp xác định bởi các giao diện này được gọi Khung bao gồm các lớp thuộc tính mặc định mà thực hiện các giao diện bộ lọc Tôi sẽ cho bạn thấy làm thế nào để sử dụng các lớp mặc định sau trong chương này Mẹo MVC 5 giới thiệu một giao diện mới, IoverrideFilter, mà tôi mô tả trong Overriding lọc phần sau trong chương này

Lớp ActionFilterAttribute thực hiện cả hai giao diện IActionFilter và IResultFilter Lớp này là trừu tượng, mà buộc bạn phải cung cấp một thực hiện Các lớp AuthorizeAttribute và HandleErrorAttribute có các tính năng hữu ích và có thể được sử dụng mà không cần tạo một lớp dẫn xuất

Áp dụng bộ lọc để điều khiển và phương pháp hành động

Bộ lọc có thể được áp dụng cho các phương pháp hành động cá nhân hoặc toàn bộ một bộ điều khiển Trong Liệt kê

18-6, tôi áp dụng các bộ lọc để Authorize lớp AdminController, trong đó có tác dụng tương tự như áp dụng nó vào từng phương pháp hành động trong bộ điều khiển, như trong Ví dụ 18-7

Trang 9

9

Listing 18-7 Applying a Filter to Action Methods Individually

namespace SportsStore.WebUI.Controllers {

public class AdminController : Controller {

// instance variables and constructor

[Authorize]

public ViewResult Index() {

// rest of action method }

[Authorize]

public ViewResult Create() {

// rest of action method }

// other action methods

}

}

Bạn có thể áp dụng nhiều bộ lọc và pha trộn và kết hợp các mức độ mà tại đó chúng được áp dụng, đó là, cho dù chúng được áp dụng để điều khiển hoặc một phương pháp hành động cá nhân Liệt kê 18-8 cho thấy ba bộ lọc khác nhau được sử dụng

Listing 18-8 Applying Multiple Filters in a Controller Class

[Authorize(Roles="trader")] // applies to all actions

public class ExampleController : Controller {

[OutputCache(Duration=60)] // applies to just this action

public ActionResult Index() {

// action method body

}

}

Một số các bộ lọc trong bảng liệt kê này lấy thông số Tôi sẽ cho bạn thấy làm thế nào những công việc như tôi mô

tả các loại khác nhau của các bộ lọc

Lưu ý Nếu bạn đã xác định một lớp cơ sở tùy chỉnh cho các bộ điều khiển của bạn, bất kỳ bộ lọc áp dụng cho các lớp cơ sở sẽ ảnh hưởng đến các lớp học có nguồn gốc

Sử dụng Bộ lọc Authorization/ cho phép

Bộ lọc cho phép được chạy sau khi các bộ lọc xác thực, trước khi lọc hành động và trước khi phương pháp hành động được gọi Như tên cho thấy, các bộ lọc này thực thi các chính sách cấp phép của bạn, đảm bảo rằng các phương pháp hành động chỉ có thể được gọi bởi người sử dụng đã được phê duyệt

Có một mối quan hệ có phần liên quan giữa việc xác thực và ủy quyền bộ lọc được dễ dàng hơn để giải thích một khi bạn hiểu cách ủy quyền các bộ lọc làm việc Tôi giải thích mối quan hệ này trong Sử dụng Bộ lọc xác thực phần sau trong chương này Bộ lọc ủy quyền thực hiện giao diện IAuthorizationFilter, được thể hiện trong Liệt kê 18-9

Listing 18-9 The IAuthorizationFilter Interface

namespace System.Web.Mvc {

Trang 10

public interface IAuthorizationFilter {

Trang 11

CẢNH BÁO: WRITING SECURITY CODE IS DANGEROUS

Lịch sử lập trình là bãi rác với các đống đổ nát của các ứng dụng mà các lập trình viên nghĩ rằng họ biết làm thế nào để viết

mã an ninh tốt Đó thực sự là một kỹ năng mà ít người sở hữu Thường có một số chỗ quên hoặc góc trường hợp chưa được kiểm tra mà để lại một lỗ hổng trong bảo mật của ứng dụng Nếu bạn không tin tôi, chỉ cần Google các lỗi bảo mật hạn và bắt đầu đọc thông qua các kết quả đầu

Bất cứ nơi nào có thể, tôi muốn sử dụng mã bảo mật được thử nghiệm rộng rãi và đã được chứng minh Trong trường hợp này, các MVC Framework đã cung cấp một bộ lọc ủy quyền đầy đủ tính năng, có thể bắt nguồn để thực hiện chính sách cấp phép tùy chỉnh Tôi cố gắng sử dụng bất cứ khi nào tôi có thể, và tôi khuyên bạn nên làm như vậy Ít nhất, bạn có thể vượt qua một số đổ lỗi cho Microsoft khi ứng dụng dữ liệu bí mật của bạn được lây lan xa và rộng trên Internet

Một cách tiếp cận an toàn hơn nhiều là để tạo ra một lớp con của lớp AuthorizeAttribute mà sẽ chăm sóc của tất cả các công

cụ phức tạp và làm cho nó dễ dàng để viết mã uỷ quyền tùy chỉnh Cách tốt nhất để chứng minh điều này là tạo ra một bộ lọc tùy chỉnh, và để kết thúc, tôi đã thêm một thư mục cơ sở hạ tầng cho các dự án ví dụ và tạo ra một tập tin lớp mới bên trong

nó được gọi là CustomAuthAttribute.cs Bạn có thể xem nội dung của tập tin này trong Liệt kê 18-10

Listing 18-10 The Contents of the CustomAuthAttribute.cs File

using System.Web;

using System.Web.Mvc;

namespace Filters.Infrastructure {

public class CustomAuthAttribute : AuthorizeAttribute {

private bool localAllowed;

public CustomAuthAttribute(bool allowedParam) {

} else { return true;

} }

}

}

Đây là một bộ lọc cho phép đơn giản Nó cho phép bạn ngăn chặn truy cập để yêu cầu địa phương (một yêu cầu địa phương là một trong những nơi mà các trình duyệt và máy chủ ứng dụng đang chạy trên cùng một thiết bị, chẳng hạn như máy tính phát triển của bạn)

Tôi đã sử dụng các phương pháp tiếp cận đơn giản nhất để tạo ra một bộ lọc cho phép, mà là để phân lớp lớp

AuthorizeAttribute và sau đó ghi đè lên các phương pháp AuthorizeCore Điều này đảm bảo rằng tôi được hưởng lợi

Trang 12

từ các tính năng được xây dựng trong để AuthorizeAttribute Các nhà xây dựng cho bộ lọc có một giá trị bool, cho dù yêu cầu địa phương được phép

Phần thú vị của lớp lọc là việc thực hiện các phương pháp AuthorizeCore, đó là cách MVC Framework kiểm tra để xem nếu bộ lọc sẽ cho phép truy cập cho một yêu cầu Các đối số cho phương pháp này là một đối tượng

HttpContextBase, qua đó tôi có thể nhận được thông tin về các yêu cầu đang được xử lý Bằng cách lợi dụng

Phương pháp AuthorizeCore được thông qua một đối tượng HttpContextBase, cung cấp quyền truy cập vào thông tin

về yêu cầu, nhưng không phải về bộ điều khiển hoặc hành động phương pháp mà các thuộc tính phép đã được áp dụng Lý do chính mà các nhà phát triển thực hiện các giao diện IAuthorizationFilter trực tiếp là để có được quyền truy cập vào các AuthorizationContext truyền cho phương thức OnAuthorization, thông qua đó một phạm vi rộng lớn hơn nhiều

thông tin có thể được thu được, bao gồm cả các chi tiết định tuyến và các phương pháp điều khiển và hành động hiện tại

Tôi không khuyên bạn nên cách tiếp cận này, và không chỉ bởi vì tôi nghĩ rằng viết mã an ninh của riêng bạn là nguy hiểm Mặc dù ủy quyền là một mối quan tâm xuyên suốt, xây dựng logic vào ủy quyền của các thuộc tính đó được kết hợp chặt chẽ với các cơ cấu điều khiển của bạn, làm suy yếu tách quan tâm và gây ra kiểm tra và bảo trì các vấn

đề Giữ cho phép của bạn thuộc tính đơn giản và tập trung vào quyền dựa trên các yêu cầu Hãy để cho bối cảnh của những gì đang được ủy quyền đến từ nơi các thuộc tính được áp dụng

Áp dụng các bộ lọc tùy chỉnh Authorization

Để sử dụng các bộ lọc cho phép tùy chỉnh, tôi chỉ cần áp dụng một thuộc tính đến các phương pháp hành động hoặc điều khiển mà tôi muốn bảo vệ, được minh họa bằng Listing 18-11, trong đó chứng tỏ việc áp dụng các bộ lọc để các phương pháp hành động Index trong bộ điều khiển Home

Listing 18-11 Applying a Custom Authorization Filter in the HomeController.cs File

public string Index(){

return "This is the Index action on the Homecontroller";

Trang 13

13

các ứng dụng, được cấu hình để từ chối các kết nối mà không phải địa phương.)

Figure 18-2 Lại khiến cho các thông tin cho một yêu cầu địa phương bằng các bộ lọc tùy chỉnh ủy quyền

Using the Built-in Authorization Filter

Mặc dù tôi đã sử dụng các lớp AuthorizeAttribute như là cơ sở cho các bộ lọc tùy chỉnh, nó có thực hiện riêng của mình trong những phương pháp AuthorizeCore đó là hữu ích cho phép thực hiện nhiệm vụ mục đích chung Khi sử dụng các AuthorizeAttribute trực tiếp, tôi có thể chỉ định một chính sách cấp phép sử dụng hai tính chất công cộng của lớp này, như thể hiện trong Bảng 18-3

Listing 18-12 Using the Built-in Authorization Filter

public string Index(){

return "This is the Index action on the Homecontroller";

Trang 14

trò, sau đó bất kỳ người dùng xác thực có thể sử dụng các phương pháp hành động Đối với hầu hết các ứng

dụng, các chính sách cấp phép mà AuthorizeAttribute cung cấp là đủ Nếu bạn muốn

thực hiện một cái gì đó đặc biệt, bạn có thể lấy được từ lớp học này chỉ như tôi đã làm trước, trong chương trình,

bổ sung cấu hình của bạn

với các bộ lọc xác thực, mà tôi mô tả những phần tiếp theo

Understanding the IAuthenticationFilterInterface

Authentication filters implement the IAuthenticationFilter interface, which is shown in Listing18-13

Listing 18-13 The IAuthenticationFilterInterface

namespace System.Web.Mvc.Filters{

public interface IAuthenticationFilter{

void OnAuthentication(AuthenticationContextcontext);

void OnAuthenticationChallenge(AuthenticationChallengeContext context);

}

}

Phương pháp OnAuthenticationChallenge được gọi bởi các khung MVC bất cứ khi nào một yêu cầu đã thất bại chính sách xác thực hoặc ủy quyền cho một phương pháp hành động Phương pháp OnAuthenticationChallenge được thông qua một đối tượng AuthenticationChallengeContext, trong đó có nguồn gốc từ lớp ControllerContext tôi mô tả trong Chương 17 và trong đó xác định các thuộc tính bổ sung được thể hiện trong Bảng 18-4

Table 18-4 Các thuộc tính xác định bởi lớp AuthenticationChallengeContext

ActionDescriptorReturnsan ActionDescriptorthat

describestheactionmethodtowhichthefilterhasbeenapplied

Result Sets an ActionResultthatexpressestheresultoftheauthenticationchallenge

Các tài sản quan trọng nhất là kết quả, bởi vì nó cho phép các bộ lọc xác thực để vượt qua một ActionResult đến MVC Framework, một quá trình được gọi là ngắn mạch mà tôi sẽ mô tả ngay Cách tốt nhất để giải thích

làm thế nào một bộ lọc xác thực làm là thông qua một ví dụ Để tâm trí của tôi, những khía cạnh thú vị nhất của các bộ lọc xác thực là họ cho phép một bộ điều khiển duy nhất để xác định phương pháp hành động đó được

chứng thực theo những cách khác nhau, do đó, bước đầu tiên của tôi là thêm một bộ điều khiển mới mà mô

phỏng đăng nhập Google Trong Liệt kê 18-14, bạn có thể xem định nghĩa của các GoogleAccountController

Listing 18-14 Nội dung của File GoogleAccountController.cs

using System.Web.Mvc;

usingSystem.Web.Security;

Trang 16

@ google.com miễn là nó được cung cấp những bí mật mật khẩu

Tại thời điểm này, bộ điều khiển xác thực của Google của tôi không được nối với các ứng dụng, và đó là nơi các bộ lọc xác thực đến Tôi tạo ra một tập tin mới gọi là lớp GoogleAuthAttribute.cs, được hiển thị trong Liệt kê 18-15, trong thư mục cơ sở hạ tầng Lớp FilterAttribute, từ đó lọc GoogleAuth tôi có nguồn gốc, là cơ sở cho tất cả các lớp lọc

Listing 18-15 Nội dung của File GoogleAuthAttribute.cs

{"returnUrl",context.HttpContext.Request.RawUrl}

});

} }

}

}

Trang 17

17

Thực hiện của tôi trong những phương pháp kiểm tra OnAuthenticationChallenge để xem nếu tài sản Kết quả của

AuthenticationChallengeContext đối số đã được thiết lập Điều này cho phép tôi để tránh thách thức người sử dụng khi

bộ lọc được chạy sau khi các phương pháp hành động đã được thực hiện Đừng lo lắng về điều đó Tôi giải thích lý do tại sao điều này quan trọng trong

Xử lý phần Challenge Yêu cầu cuối cùng trong chương này

Điều quan trọng cho phần này là tôi sử dụng phương pháp OnAuthenticationChallenge để thách thức người sử dụng cho các thông tin bằng cách chuyển hướng trình duyệt của mình để điều khiển GoogleAccount của tôi với một

RedirectToRouteResult

Bộ lọc xác thực có thể sử dụng tất cả các loại ActionResult mà tôi mô tả trong Chương 17, nhưng các phương pháp điều khiển thuận tiện cho việc tạo ra chúng không có sẵn, đó là lý do tại sao tôi đã phải sử dụng một đối tượng

RouteValueDictionary để xác định các giá trị phân đoạn để một tuyến đường đến các thách thức phương pháp hành động

có thể được tạo ra

Thực hiện sự thẩm tra

Bộ lọc xác thực của tôi đã sẵn sàng để thách thức người dùng cho các thông tin Google giả mạo của họ, và bây giờ tôi có thể dây lên các hành vi còn lại Bộ điều khiển sẽ gọi phương thức OnAuthentication trước khi chạy bất kỳ loại khác của bộ lọc, cung cấp một cơ hội để thực hiện một kiểm tra xác thực rộng Bạn không cần phải thực hiện phương pháp

OnAuthentication, nhưng tôi sẽ làm như vậy để kiểm tra xem tôi đang đối phó với một tài khoản Google

Phương pháp OnAuthentication được thông qua một đối tượng AuthenticationContext rằng, giống như các lớp

AuthenticationChallengeContext, có nguồn gốc từ ControllerContext và cung cấp quyền truy cập vào tất cả các thông tin

mà tôi mô tả trong Chương 17 AuthenticationContext lớp cũng định nghĩa các thuộc tính thể hiện trong Bảng 18-5

Table 18-5 Các thuộc tính xác định bởi lớp AuthenticationContext

describestheactionmethodtowhichthefilterhasbeenappliedPrincipal Returnsan

IPrincipalimplementationthat identifiesthecurrentuser,iftheyhavealreadybeenauthenticated.Result Sets an

ActionResultthatexpressestheresultoftheauthenticationcheck Nếu OnAuthentication đặt một giá trị cho thuộc tính Kết quả của đối tượng bối cảnh, sau đó các MVC Framework

sẽ gọi phương thức OnAuthenticationChallenge Nếu phương pháp OnAuthenticationChallenge không thiết lập một giá trị cho thuộc tính Kết quả trên đối tượng bối cảnh của nó, sau đó là một từ phương pháp OnAuthentication

sẽ được thực thi

Tôi sử dụng phương pháp OnAuthentication để tạo ra một kết quả mà báo cáo một lỗi xác thực cho người sử dụng, sau đó có thể được ghi đè bằng các phương pháp OnAuthenticationChallenge để thách thức người sử dụng cho các thông tin thay thế Điều này cho phép tôi để chắc chắn rằng họ nhìn thấy một phản ứng có ý nghĩa, thậm chí nếu không có thách thức có thể được ban hành (mặc dù tôi phải thừa nhận rằng tôi chưa từng trải qua một tình huống

mà điều này đã xảy ra) Trong Liệt kê 18-16, bạn có thể thấy tôi đã thực hiện các phương pháp OnAuthentication

để nó kiểm tra rằng các yêu cầu đã được xác thực bằng cách sử dụng bất kỳ thông tin Google

Listing 18-16 Triển khai thực hiện các phương pháp OnAuthentication trong GoogleAuthAttribute.cs file

Trang 18

namespace Filters.Infrastructure{

IAuthenticationFilter{

public void OnAuthentication(AuthenticationContext context){

IIdentity ident =context.Principal.Identity;

!ident.Name.EndsWith("@google.com")){

context.Result = newHttpUnauthorizedResult();

Trang 19

}

}

{"controller","GoogleAccount"}, {"action", "Login"},

{"returnUrl",context.HttpContext.Request.RawUrl}

Thực hiện của tôi trong những phương pháp OnAuthentication kiểm tra xem các yêu cầu đã được xác thực bằng cách sử dụng một tên người dùng mà kết thúc bằng @ google.com Nếu yêu cầu không được xác thực hoặc các yêu cầu đã được xác thực bằng cách sử dụng một loại khác nhau của các chứng chỉ, sau đó tôi thiết lập thuộc tính kết quả của đối tượng AuthenticationContext để một HttpUnauthorizedResult mới

Các HttpUnauthorizedResult được thiết lập như là giá trị kết quả cho các đối tượng AuthenticationChallengeContext đó là thông qua các phương pháp OnAuthenticationChallenge và bạn có thể thấy chúng tôi đã cập nhật phương pháp này để thách thức người dùng khi điều này xảy ra, việc phối hợp hành động của hai phương pháp trong các bộ lọc Bước tiếp theo là áp dụng các bộ lọc để điều khiển, bạn có thể thấy trong Liệt kê 18-17

Listing 18-17 Áp dụng xác thực Filter trong HomeController.cs file

public string Index(){

return "This is the Index action on the Homecontroller";

}

[GoogleAuth]

public string List(){

return "This is the List action on the Homecontroller";

}

}

}

Tôi đã xác định một phương pháp hành động mới có tên gọi Danh sách, mà tôi được trang trí với các bộ lọc

GoogleAuth Kết quả là truy cập vào các phương pháp Index được bảo đảm thông qua việc xây dựng trong hỗ trợ cho các hình thức xác thực, nhưng việc tiếp cận với các phương pháp Danh sách hành động được bảo đảm thông qua

hệ thống xác thực của Google tùy chỉnh giả của tôi

Bạn có thể thấy hiệu ứng bằng cách khởi động ứng dụng Theo mặc định, trình duyệt sẽ nhắm đến các phương pháp hành động Index, mà sẽ kích hoạt sự thẩm định tiêu chuẩn và yêu cầu bạn phải đăng nhập bằng một trong những tên người dùng mà tôi định nghĩa trong file Web.config Nếu sau đó bạn yêu cầu / Trang chủ / Danh sách URL, sau đó các thông tin hiện tại của bạn sẽ bị từ chối và bạn sẽ phải xác nhận bằng cách sử dụng một tên người dùng Google

Trang 20

Kết hợp Authentication và Authorization lọc

Bạn có thể kết hợp xác thực và ủy quyền các bộ lọc trên các phương pháp hành động tương tự để thu hẹp phạm vi của chính sách bảo mật của bạn Các MVC Framework sẽ gọi phương thức OnAuthentication của bộ lọc xác thực, cũng giống như trong ví dụ trước, và chuyển sang chạy bộ lọc ủy quyền nếu yêu cầu vượt qua kiểm tra xác thực Nếu yêu cầu không vượt qua được

bộ lọc cho phép, sau đó phương pháp OnAuthenticationChallenge của bộ lọc xác thực sẽ được gọi là như vậy mà bạn

có thể thách thức người sử dụng cho các thông tin cần thiết Trong Liệt kê 18-18, bạn có thể nhìn thấy như thế nào tôi đã kết hợp các GoogleAuth và Ủy quyền cho các bộ lọc để hạn chế truy cập vào các hành động Danh sách trong

bộ điều khiển Home

Listing 18-18 Combining Authentication and Authorization Filters in the HomeController.cs File

public string Index(){

return "This is the Index action on the Homecontroller";

}

[GoogleAuth]

[Authorize(Users ="bob@google.com")]

public string List(){

return "This is the List action on the Homecontroller";

HttpUnauthorizedResult (đó là lý do tại sao tôi sử dụng cùng một lớp học trong phương pháp OnAuthentication) Các bộ lọc trong bộ điều khiển Trang chủ hạn chế truy cập vào các phương pháp Chỉ số quản trị người dùng, những người đã được xác thực bằng cách sử dụng AccountController, và hạn chế truy cập vào các phương pháp Danh sách cho người dùng bob@google.com, người được xác thực thông qua bộ điều khiển GoogleAccount

Xử lý các yêu cầu cuối cùng Challenge

Các MVC Framework gọi phương thức OnAuthenticationChallenge một lần cuối cùng sau khi phương thức hành động đã được thực hiện, nhưng trước khi ActionResult được trả lại và thực thi Điều này cung cấp chứng thực các bộ lọc một cơ hội để đáp ứng với thực tế rằng các hành động đã hoàn thành hoặc thậm chí làm thay đổi kết quả (một cái

gì đó mà cũng có thể với các bộ lọc kết quả, mà tôi mô tả sau trong chương này)

Chính vì lý do này mà tôi kiểm tra tài sản Kết quả của đối tượng AuthenticationChallengeContext trong phương pháp OnAuthenticationChallenge Nếu tôi không, tôi sẽ thách thức những người sử dụng cho các thông tin một lần nữa, mà làm cho cảm giác ít cho rằng phương pháp hành động đã được thực hiện bởi thời điểm này

Lý do duy nhất tôi đã tìm thấy đối phó với các cuộc gọi phương pháp cuối cùng này là để xóa chứng thực cho các yêu cầu, có thể hữu ích khi các phương pháp hành động quan trọng đòi hỏi các thông tin tạm thời cao mà bạn muốn vào mỗi và mọi thời gian hành động là để được thực thi Trong Liệt kê 18-19, bạn có thể thấy tôi đã thực hiện tính năng này

Listing 18-19 Xử lý Final Challenge Gọi trong GoogleAuthAttribute.cs file

usingSystem;

Trang 21

public void OnAuthentication(AuthenticationContext context) {

IIdentity ident =context.Principal.Identity;

!ident.Name.EndsWith("@google.com")){

context.Result = newHttpUnauthorizedResult();

} }

Sử dụng Bộ lọc Exception

Bộ lọc ngoại lệ được chỉ chạy nếu một ngoại lệ unhandled đã được ném ra khi gọi một phương thức hành động Các trường hợp ngoại lệ có thể đến từ các địa điểm sau:

+Another kind of filter (authorization, action, or result filter)

+The action method itself

+When the action result is executed (see Chapter 17 for details on action results)

Tạo một Bộ lọc Exception

Bộ lọc ngoại lệ thực hiện giao diện IExceptionFilter, được thể hiện trong Liệt kê 18-20

Trang 22

Listing 18-20 The IExceptionFilterInterface

Table 18-6 Useful ControllerContextProperties

Controller ControllerBase Returns the controller object for thisrequest

HttpContext HttpContextBaseProvidesaccesstodetailsoftherequest andaccesstotheresponse

IsChildAction bool Returns true if this is a child action (see Chapter20)

Provides access totheHttpContextandtheroutingdata,bothofwhichareavailablethroughother

RequestContext

RequestCon

RouteData RouteData Returns the routing data for thisrequest

Ngoài các tài sản thừa kế từ lớp ControllerContext, lớp ExceptionContext xác định một số tính chất bổ sung mà có ích với đối phó với trường hợp ngoại lệ, như thể hiện trong Bảng 18-7

Table 18-7 Additional ExceptionContextProperties

ActionDescriptor ActionDescriptor Provides details of the actionmethod

The result for the action method; a filter can cancel the request by setting this property toa

Result

ActionRes

Exception Exception The unhandled exception

ExceptionHandled bool Returns true if another filter has marked the exception ashandled

Các trường hợp ngoại lệ đã được ném là có sẵn thông qua thuộc tính ngoại lệ Một bộ lọc ngoại lệ có thể báo cáo rằng nó đã xử lý ngoại lệ bằng cách thiết lập thuộc tính ExceptionHandled true Tất cả các bộ lọc ngoại lệ áp dụng cho một hành động được gọi ngay cả khi tài sản này được thiết lập là true, do đó, nó là thực hành tốt để kiểm tra xem

bộ lọc khác đã xử lý vấn đề, để tránh cố gắng phục hồi từ một vấn đề mà bộ lọc khác đã giải quyết

Chú ý: Nếu không ai trong số các bộ lọc ngoại lệ cho một phương pháp hành động thiết lập thuộc tính

ExceptionHandled true, MVC Framework sử dụng mặc định ASP.NET ngoại lệ xử lý thủ tục đó sẽ hiển thị các "sợ hãi màn hình màu vàng của cái chết."

Các tài sản Kết quả được sử dụng bởi các bộ lọc ngoại lệ để cho các MVC Framework phải làm gì Hai sử dụng

Trang 23

23

minh làm thế nào tất cả điều này phù hợp với nhau, tôi đã tạo ra một tập tin lớp mới gọi là

RangeExceptionAttribute.cs trong thư mục cơ sở hạ tầng Nội dung

của tập tin này được hiển thị trong Liệt kê 18-21

Listing 18-21 Nội dung của tập tin RangeExceptionAttribute.cs

Trang 24

IExceptionFilter{

public void OnException(ExceptionContext filterContext){

if (!filterContext.ExceptionHandled&&

filterContext.Exception is ArgumentOutOfRangeException) { filterContext.Result

Áp dụng các ngoại lệ Lọc

Tôi cần phải làm một số nền tảng trước khi tôi có thể kiểm tra bộ lọc ngoại lệ Đầu tiên, tôi cần phải tạo một thư mục nội dung trong dự án ví dụ và tạo ra các tập tin RangeErrorPage.html bên trong nó Đây là những tập tin mà tôi sẽ hướng người dùng đến khi các ngoại lệ được xử lý và bạn có thể xem nội dung của các tập tin trong Liệt kê 18-22

Listing 18-22 The Contents of the RangeErrorPage.html File

Trang 25

public string List(){

return "This is the List action on the Homecontroller";

}

}

Bạn có thể thấy việc xử lý ngoại lệ mặc định nếu bạn khởi động ứng dụng và điều hướng đến / Home / RangeTest / 50 URL Các định tuyến mặc định rằng Visual Studio tạo ra cho một dự án MVC có một biến phân khúc gọi là id mà sẽ được thiết lập đến 50 cho URL này, gây ra các phản ứng thể hiện trong hình 18-3 (Xem chương 15 và 16 để biết chi tiết của định tuyến và phân đoạn URL.)

Trang 26

Figure 18-3 The default exception handlingresponse

Lưu ý: Visual Studio sẽ phát hiện các trường hợp ngoại lệ và phá vỡ các debugger đểcung cấp cho bạn kiểm soát việc thực thi của ứng dụng Nhấn F5 hoặc click vào nútContinue để tiếp tục thực hiện các ứng dụng và xem các hành vi xử lý ngoại lệ mặc định

Tôi có thể áp dụng các bộ lọc ngoại lệ cho một trong hai bộ điều khiển hoặc các hành động cá nhân, như trong Liệt kê 18-24

Đề xuất một chỉnh sửa

Trang 28

Figure 18-4 The effect of applying the exceptionfilter

Sử dụng một View để ứng phó với một ngoại lệ

Tùy thuộc vào các ngoại lệ mà bạn đang đối phó với, hiển thị một trang nội dung tĩnh có thể là điều đơn giản nhất và an toàn nhất để làm Có rất ít cơ hội của quá trình này xảy ra sai và gây ra nhiều vấn đề khác Tuy nhiên, trong khi bạn có thể

tự tin mà người dùng sẽ nhìn thấy thông báo, phương pháp này không phải là đặc biệt hữu ích cho người sử dụng, người được một cảnh báo chung chung và bị rơi ra khỏi ứng dụng

Một phương pháp khác là sử dụng một cái nhìn để hiển thị chi tiết của vấn đề và trình bày cho người dùng với một số thông tin theo ngữ cảnh và tùy chọn mà họ có thể làm theo để sắp xếp những điều trên Để chứng minh điều này, tôi đã thực hiện một số thay đổi cho lớp RangeExceptionAttribute, như thể hiện trong Liệt kê 18-25

Listing 18-25 Returning a View from an Exception Filter in the RangeExceptionAttribute.csFile

Trang 29

29

filterContext.ExceptionHandled =true;

} }

}

}

I create a ViewResult object and set the values of the ViewName and ViewData properties to specify the name of the view and the model object that will be passed to it This is messy code because I am working with the ViewResult object directly, rather than relying on the View method defined by the Controller class that is used in action methods I am not going to go into this code because I cover views in depth in Chapter 20 and the built-in exception filter, which I describe inthe next section, can be used to achieve the same effect more

elegantly I just want you to see how things work behind the scenes

The ViewResult object specifies a view called RangeError and passes the intvalue of the argument that caused the exception as the view modelobject

To display details of the error, I created the Views/Shared folder to the Visual Studio project and created the

RangeError.cshtml file within it, the contents of which you can see in Listing 18-26

Listing 18-26 The Contents of the RangeError.cshtml view File

Ngày đăng: 23/10/2019, 21:15

w