2010-06-18 31 views
9

Tôi đang cố gắng để có được một tham chiếu đến đối tượng người dùng trong tập tin Global.asax của tôi Application_BeginRequest. Tôi đang sử dụng thuộc tính Context.User nhưng tôi nhận được NullReferenceException. Có thể lấy tham chiếu đối tượng người dùng trong Application_BeginRequest không?.NET Application_BeginRequest - Làm thế nào để có được tài liệu tham khảo của người dùng?

Trả lời

18

Bạn không có quyền truy cập vào đối tượng Người dùng vì yêu cầu chưa được xác thực.

Hãy thử sử dụng Application_AuthenticateRequest thay thế.

Dưới đây là một lời giải thích của tất cả các sự kiện Global.asax: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5771721.html

Và hương MSDN của vòng đời ứng dụng: http://msdn.microsoft.com/en-us/library/ms178473.aspx

Edit: tôi thấy những gì bạn đang làm. Thay đổi câu lệnh if của bạn thành câu lệnh if và not (xin lỗi nếu cú ​​pháp sai, tôi không sử dụng VB.NET):

Sub Application_AuthenticateRequest() 
    If Context.User <> Nothing Then 
     Throw New Exception("User now exists") 
End Sub 

Bạn sẽ nhận thấy rằng phương pháp này bị tấn công nhiều lần. Ngoại lệ sẽ không được ném cho đến lần thứ hai hoặc thứ ba. Đó là bởi vì mọi yêu cầu đều tuân theo vòng đời của ứng dụng. Vì vậy, thay vì thực hiện bất kỳ hành động nào khi người dùng là null, bạn nên thực hiện nó khi người dùng không rỗng.

Nếu mục tiêu của bạn là để hạn chế truy cập tự động, bạn nên tạo một HttpModule riêng biệt và gán nó vào các tập tin bạn đang hạn chế

Tuy nhiên, bạn sẽ cần phải cẩn thận không để tiến hành viết lại toàn bộ Cơ sở hạ tầng bảo mật ứng dụng ASP.NET. Thay vào đó, bạn có thể hạn chế quyền truy cập vào các thư mục nhất định dựa trên vai trò.

+0

Hãy kiểm tra bình luận của tôi trong câu trả lời khác bởi Julien ... http://stackoverflow.com/questions/3072768/net-application-beginrequest-how-to-get-user-reference/3072801 # 3072801 – Ropstah

+0

ropstah: Tôi thấy bây giờ điều gì đang xảy ra. Ứng dụng đang thực hiện nhiều yêu cầu (có thể cho hình ảnh, tập lệnh, bảng định kiểu, v.v.) trước khi yêu cầu xác thực được xử lý. Những yêu cầu tệp khác có thể không cần xác thực và đó là lý do tại sao ngoại lệ của bạn bị ném. Hãy thử cập nhật trong câu trả lời của tôi và xem có làm rõ. Ngoài ra, những gì bạn đang cố gắng để đạt được với mã của bạn mà đòi hỏi đối tượng người dùng? –

+0

Đây không phải là trường hợp, tuy nhiên nó ** đã được ** liên quan đến vòng đời 'Global.asax'. Tôi cần chức năng 'User.IsInRole()' chỉ có sẵn ** sau ** _Application_AuthenticateRequest_ cụ thể là trong thủ tục 'Application_AuthorizeRequest()' – Ropstah

8

Không, bạn phải sử dụng Application_AuthenticateRequest để thay thế. Đó là điểm sớm nhất mà bạn có một người dùng.

+0

Điều này ném ngoại lệ, vẫn không có người dùng hoặc gì? Sub Application_AuthenticateRequest() Nếu Context.User Is Nothing Then Ném ngoại lệ mới ("Không có người dùng") End Sub – Ropstah

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