2013-10-30 16 views
11

Bên trong trình xử lý sự kiện AuthenticateRequest của tôi, tôi đã đặt hiệu trưởng của Thread. Here'a một phần của IHttpModule tôi:Thread.CurrentPrincipal.Identity trong ASP .NET - có an toàn không khi sử dụng

public void Init(HttpApplication context) 
    { 
     context.AuthenticateRequest += AuthenticateRequest; 
    } 

    private void AuthenticateRequest(object sender, EventArgs e) 
    { 
     var principal = CreatePrincipal(); 
     HttpContext.Current.User = principal; 
    } 

Nhưng tôi có một hội đồng, mà không cần phải truy cập vào System.Web, vì vậy tôi không thể sử dụng HttpContext.Current.User, nhưng tôi cần phải truy cập chính hiện hành. suy nghĩ đầu tiên của tôi là thay đổi phương pháp của tôi để:

System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User = principal; 

và sử dụng Thread.CurrentPrincipal khi cần thiết.

Nhưng theo như tôi nhớ thì không an toàn để lưu trữ các yêu cầu cụ thể trong Thread Local Storage vì nhiều luồng có thể xử lý cùng một yêu cầu, vì vậy tôi đoán nó giống với Thread.CurrentPrincipal. Hay không?

+1

Có vẻ như bạn có thể thay đổi lắp ráp - có thể không vượt qua được hiệu trưởng mà nó cần để chống lại không? –

+0

Trong tình huống tương tự gần đây, tôi đơn giản buộc người gọi phải cung cấp đối tượng chính. – asawyer

+0

Đó là những gì tôi sẽ làm - tiêm chính. Dù sao tôi đã hy vọng rằng có một cách tiếp cận tốt hơn – dragonfly

Trả lời

11

Tôi không đồng ý với câu trả lời của Jeff Moser.

Công cụ ủy quyền .NET chuẩn đều hoạt động bằng cách sử dụng Thread.CurrentPrincipal. ví dụ .:

PrincipalPermissionAttribute 
PrincipalPermission.Demand 

Ngoài ra, nếu bạn cấu hình một NET RoleProvider, nó sẽ thiết lập Thread.CurrentPrincipal cho hiệu trưởng giống như HttpContext.User.

Vì vậy đây là cách tiêu chuẩn để làm điều đó và tôi sẽ làm điều tương tự trong mã xác thực tùy chỉnh của bạn (hoặc thậm chí tốt hơn - triển khai nó dưới dạng RoleProvider tùy chỉnh).

Đối với I/O không đồng bộ, this blog post cho biết rằng Thread.CurrentPrincipal và cài đặt văn hóa được tự động chuyển sang chuỗi mới.

Sử dụng Thread.CurrentPrincipal được cho là an toàn hơn, nếu thư viện của bạn đang sử dụng chủ yếu cho mục đích ủy quyền, bởi vì mã không tin cậy có thể vượt qua trong một hiệu trưởng như một cuộc tranh cãi, trong khi CAS có thể ngăn chặn nó từ thiết Thread.CurrentPrincipal.

+1

Cảm ơn bạn đã liên kết! Tôi đã không nhận ra ASP.NET đã làm điều đó cho bạn. Tôi sẽ xóa câu trả lời của tôi. –

+0

Thực ra nó có ý nghĩa. Tôi sử dụng các thuộc tính ủy quyền như PrincipalPermission trên tất cả các ứng dụng, và dường như các thuộc tính này sử dụng Thread.CurrentPrincipal đằng sau hậu trường. Cảm ơn rất nhiều! – dragonfly

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