2009-09-17 45 views
5

Tôi bị nhầm lẫn về bộ nhớ đệm và ủy quyền ASP.NET MVC và nhu cầu rõ ràng về một số làm rõ.Ủy quyền và ASP.NET MVC Caching

Thuộc tính ủy quyền tự tạo của tôi kế thừa từ AuthorizeAttribute. Phương thức AuthorizeCore được ghi đè của nó chạy mọi lúc, ngay cả khi tôi đặt thuộc tính [OutputCache] trên hành động của bộ điều khiển. Tôi hiểu phần đó.

Bây giờ, tâm trí sẽ biến đổi đối với tôi: AuthorizeCore sẽ không mỗi lần bây giờ khi tôi thực sự tạo bộ nhớ đệm đầu ra và trang được phân phát từ bộ nhớ cache. Lý do là khi yêu cầu được lưu trong bộ nhớ cache, số httpContext.Session được cung cấp với AuthorizeCorenull!? Dưới đây là một số mã đơn giản:

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    return (Session["userId"] != null) 
} 

Vì vậy, nếu httpContext.Sessionnull, đây rõ ràng là thất bại mỗi lần. Tôi cần phải truy cập vào phiên mặc dù, làm thế nào khác tôi có thể kiểm tra nếu yêu cầu được ủy quyền? Điều này không có ý nghĩa gì - nếu đây là cách nó nên được sau đó tôi sẽ không bao giờ có thể sử dụng các trang được lưu trữ cùng với xác thực trong ASP.NET MVC. Cứu giúp?

Trả lời

11

Có hai câu hỏi riêng biệt:

  1. Liệu việc xác thực với bộ nhớ đệm trong MVC?
  2. Phiên làm việc trước khi xác thực khi đối mặt với bộ nhớ cache (ngay cả đối với người dùng chưa được xác thực, người vẫn có phiên độc đáo hy vọng)?

Câu trả lời tương ứng là có và không. Xác thực hoạt động tốt với bộ nhớ đệm. Hãy thử nó với các nhà cung cấp thành viên SQL hoặc Domain; bạn sẽ thấy. Tuy nhiên,

Việc lưu vào bộ nhớ đệm có thể chạy trước mô-đun xác thực. (Đối với điểm thưởng: Tại sao?) Xác thực được gọi chỉ khi nó đặc biệt móc bộ nhớ cache (như AuthorizeAttribute không). Vì phiên là người dùng cụ thể, có không đảm bảo bạn sẽ có phiên trong AuthorizeCore.

Điểm thưởng khác: Điều này có thể thay đổi như thế nào nếu bạn chỉ định khác nhauByUser trong cấu hình bộ nhớ cache của bạn?

Thật không may, thực hiện quyền xác thực là khó khăn, bởi vì thực hiện bất kỳ loại quyền bảo mật nào là khó. Microsoft cố gắng làm điều này dễ dàng hơn với API nhà cung cấp thành viên. I strongly recommend using that khi triển khai xác thực tùy chỉnh. Tôi cũng khuyên bạn nên sử dụng các nhà cung cấp tích hợp sẵn và mở rộng chúng thay vì viết lại chúng bất cứ khi nào có thể.

Một điểm khác: Nhà cung cấp Phiên ASP.NET và nhà cung cấp Tư cách thành viên ASP.NET là hoàn toàn riêng biệt. Những người dùng thành viên khác nhau có thể chia sẻ (!) Một phiên và, yes, bạn có thể attack một trang web theo cách này. Đó là không bao giờ an toàn để đặt thông tin liên quan đến bảo mật trong một phiên. An ninh là khó khăn.

+0

Vì vậy, bạn đang nói nếu tôi sử dụng nhà cung cấp tư cách thành viên tùy chỉnh dựa trên nhà cung cấp tư cách thành viên asp.net thông thường, tôi có thể kiểm tra xác thực người dùng bằng bộ nhớ đệm? Tại sao công việc đó - nhà cung cấp thành viên cần phiên cũng như nội bộ không? – Alex

+1

Không bao giờ an toàn khi đặt thông tin nhạy cảm về bảo mật trong Phiên, dừng hoàn toàn. –

+1

Và không, nhà cung cấp thành viên thường xuyên gần như không liên quan gì đến Phiên làm việc. Đọc hai liên kết cuối cùng trong câu trả lời của tôi. –

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