2010-06-16 24 views
18

Tôi vừa mới gặp sự cố khi chạy ứng dụng web asp.net trong studio trực quan 2008. Tôi nhận được lỗi 'loại không được giải quyết cho thành viên ... customUserPrincipal'. Theo dõi các nhóm thảo luận khác nhau có vẻ như có một vấn đề với máy chủ web của Visual Studio khi bạn gán một hiệu trưởng tùy chỉnh với Thread.CurrentPrincipal.sự khác biệt giữa http.context.user và thread.currentprincipal và khi nào nên sử dụng chúng?

Trong mã của tôi, bây giờ tôi sử dụng ...

HttpContext.Current.User = myCustomPrincipal 
//Thread.CurrentPrincipal = myCustomPrincipal 

Tôi rất vui vì tôi đã nhận lỗi ra khỏi con đường, nhưng nó đặt ra câu hỏi "sự khác biệt giữa hai phương pháp này là gì đặt hiệu trưởng? ". Có stackoverflow khác questions liên quan đến sự khác biệt nhưng họ không nhận được vào các chi tiết của hai phương pháp tiếp cận.

Tôi đã tìm thấy một bài trêu ngươi mà đã có những nhận xét hoành tráng sau nhưng không có lời giải thích để sao lưu khẳng định mình ...

Sử dụng HttpConext.Current.User cho tất cả web (/ ASMX ASPX) ứng dụng.

Sử dụng chủ đề.CurrentPrincipal cho tất cả các ứng dụng khác như winForms, bàn điều khiển và cửa sổ dịch vụ ứng dụng.

Có thể bất kỳ người trong số các chuyên gia bảo mật/dot.net đưa ra một số ánh sáng về chủ đề này không?

Trả lời

7

Theo ứng dụng biểu mẫu web, tôi tin rằng Thread.CurrentPrincipal sẽ là hiệu trưởng cho bất kỳ ai đang chạy quy trình công nhân (Chủ đề).

HttpContext.Current.User sẽ là người dùng web đã đăng nhập hiện tại.

Trong trường hợp của một hình thức/ứng dụng WPF nó có ý nghĩa bởi vì người dùng mà bạn đang chạy ứng dụng dưới là một trong những bạn đang quan tâm.

Bạn đang cố gắng để giả mạo quá trình lao động hoặc đăng nhập trong người dùng?

+1

Dựa trên thử nghiệm cục bộ của tôi với IIS 7.5 .NET 4.5, câu trả lời này là sai và câu trả lời của @ womp là chính xác. Theo mặc định, Thread.CurrentPrincipal và HttpContext.Current.User đều trả về ứng dụng/người dùng web. System.Security.Principal.WindowsIdentity.GetCurrent() và Environment.UserDomainName + Environment.UserName cả hai đều trả về bản thân tiến trình IIS Application Pool/worker. – BateTech

+1

Tôi tự hỏi nếu điều này thay đổi kể từ khi câu trả lời này được viết cách đây 4,5 năm, nếu có lẽ @yamspog có thể gắn nhãn lại câu trả lời khác là câu trả lời được chấp nhận. – Aren

4

Bài viết này có giải thích được không?
http://www.hanselman.com/blog/CommentView.aspx?guid=22c42b73-4004-40ce-8af9-47f1b9b434ed

Dưới đây là một đoạn trích:

Tôi có một số mã trong một phong tục ASP.NET FormsAuthentication Đăng nhập mà trông giống như sau:

// This principal will flow throughout the request. 
VoyagerPrincipal principal = new VoyagerPrincipal(yada, yada, yada); 

// Attach the new principal object to the current HttpContext object 
HttpContext.Current.User = principal; 

Nó nó gọi trên toàn cầu. asate's AuthenticateRequest vì vậy mọi thứ đều là tất cả các thiết lập trước khi sự kiện của trang cháy. Nó cung cấp IPrincipal tùy chỉnh tích hợp Máy chủ eFinance của chúng tôi với ASP.NET. Đó là một hệ thống con đáng yêu, IMHO.

Các hoạt động khác được tính để có thể nhận được 'Call Context' IPrincipal từ chủ đề hiện tại bất kỳ lúc nào.Trong một phần khác của mã của người đã làm điều này trong MIDDLE của HttpRequest (ở đâu đó trong Page_Load) sau khi đã JUST gọi là thói quen trên cho lần đầu tiên:

return Thread.CurrentPrincipal as VoyagerPrincipal; 

Trong trường hợp mà một người nào đó gọi là đoạn đầu tiên của mã sau đó hy vọng sẽ có thể gọi đoạn thứ hai trong cùng một HttpRequest, Thread.CurrentPrincipal chứa một GenericPrincipal được điền sớm hơn nhiều bởi HttpApplication. (Hoặc WindowsPrincipal, tùy thuộc vào cài đặt của bạn).

17

Điều đầu tiên mà đối tượng HttpApplication thực hiện khi nó nhận được một chuỗi là đặt hiệu trưởng của luồng cho hiệu trưởng của HttpContext. Điều này đồng bộ lên các hiệu trưởng.

Nếu, tuy nhiên, bạn đi và đặt chính của chủ đề sau này, HttpApplication nội bộ vẫn có một bộ chính khác nhau cho ngữ cảnh người dùng. Đây là lý do tại sao bạn nên luôn đặt nó thông qua HttpContext.

(Nếu bạn nhìn vào Reflector, bạn có thể thấy mã phức tạp chạy khi bạn thực hiện "set" trên HttpContext.User - nó thực hiện rất nhiều nội dung với IIS để thiết lập chính xác.)

+0

Chỉ cần một lưu ý cho bất cứ ai đọc này: ngay cả khi bạn đặt HttpContext.User sau này, nó không * dường như * sao chép nó vào Thread.CurrentPrincipal. Ít nhất điều này cũng đúng đối với chúng tôi trong một trình xử lý tin nhắn. Chúng tôi phải đặt cả hai. –

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