2011-07-28 23 views
52

Sử dụng ASP.NET MVC Tôi đang tạo thuộc tính Authorize tùy chỉnh để xử lý một số logic ủy quyền tùy chỉnh. Tôi đã xem xét rất nhiều ví dụ và nó là khá thẳng về phía trước nhưng câu hỏi của tôi là phương pháp nào là tốt nhất để ghi đè lên, AuthorizeCore hoặc OnAuthorization? Tôi đã thấy nhiều ví dụ ghi đè một hoặc khác. Có sự khác biệt nào không?Mở rộng AuthorizeAttribute Override AuthorizeCore hoặc OnAuthorization

+1

Thanh toán mã nguồn trong MVC4, http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/e0115a823029#src%2fSystem.Web.Mvc%2fAuthorizeAttribute.cs – user1736525

Trả lời

71

Các đầu mối là trong các loại trở lại:

AuthorizeCore trả về một boolean - đó là làm quyết định mã. Điều này nên được giới hạn nhìn vào bản sắc của người sử dụng và thử nghiệm mà vai trò họ đang ở vv vv Về cơ bản nó nên trả lời câu hỏi:

Do I want this user to proceed?

Nó không nên thực hiện bất kỳ hoạt động bổ sung "trên mặt".

OnAuthorize trả về khoảng trống - đây là nơi bạn đặt bất kỳ chức năng nào cần phải xảy ra tại thời điểm này. ví dụ. Viết vào nhật ký, lưu trữ một số dữ liệu trong phiên vv ..

+1

Cảm ơn bạn đã thông tin –

+14

Thật không may AuthorizeCore không chứa AuthorizationContext mà tôi cần (để truy cập RouteData và đưa ra các quyết định dựa trên nó), do đó cách tiếp cận duy nhất tôi thấy là sử dụng OnAuthorize. – gw0

+4

Tại sao Earth không phải là 'AuthorizationContext' được chuyển vào' AuthorizeCore'? Điều này có vẻ là một lỗ hổng lớn. – Jez

15

Bạn nên đặt bất kỳ mã nào phải chạy bất kể người dùng có được ủy quyền lần đầu hay không hoặc nếu họ đang sử dụng ủy quyền được lưu trong bộ nhớ cache trong AuthorizeCore.

Nếu bạn nhìn vào mã nguồn, bạn có thể thấy rằng AuthorizeCore được gọi bằng cả hai OnAuthorizeOnCacheAuthorization. Điều này cho phép ủy quyền được lưu trong bộ nhớ cache nhưng vẫn cho phép một số hành động nhất định và đưa ra quyết định thực tế về ủy quyền.

Nếu bạn cần một thứ gì đó từ AuthorizationContext thì bạn có thể tạo thuộc tính để giữ thông tin và sau đó truy cập thông tin đó trong phương thức AuthorizeCore.

+0

Tôi ước tôi có thể đánh dấu câu cuối cùng của câu trả lời của bạn . Bạn thực sự nên in đậm nó. Đề cập đến nhận xét của @ gw0 trong câu trả lời được chấp nhận, điều thực sự không may là đề xuất sử dụng ghi đè sai vì lý do sai đã được bỏ phiếu. –

+3

Tài liệu dành cho AuthorizeAttribute (MSDN) nêu rõ (theo Safety Safety) _ "Bất kỳ thành viên nào không được đảm bảo an toàn." _ Vì vậy, tôi đoán rằng giữ thông tin trong một thuộc tính không phải là một lựa chọn. – bvgheluwe

+0

@BartVG - Tôi không chắc chắn tôi làm theo. An toàn thread phải làm gì với cuộc thảo luận này? Tất cả văn bản đó có nghĩa là bạn phải đồng bộ hóa quyền truy cập vào các đối tượng nếu nó sẽ được sử dụng theo cách đa luồng. –

Các vấn đề liên quan