2010-06-16 33 views
42

Tôi có một lớp kế thừa từ Ngoại lệ. Trong .NET 4, tôi bắt đầu nhận được lỗi thời gian chạy:Quy tắc bảo mật thừa kế vi phạm trong khi ghi đè thành viên - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

Tôi nghĩ vấn đề là do tôi ghi đè GetObjectData.

Tôi biết một câu trả lời cho việc giải quyết vấn đề này là để thiết lập SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Đây không phải là một câu trả lời chấp nhận được, tôi muốn biết làm thế nào để khắc phục vấn đề mà không cần phải thư giãn các bảo mật mặc định quy tắc trong .NET 4.

Trả lời

32

Đánh dấu GetObjectData bằng SecurityCriticalAttribute, vì nó được áp dụng cho Exception.GetObjectData. Một thành viên bị ghi đè nên có cùng khả năng truy cập bảo mật (Critical, Safe Critical hoặc Transparent).

Đọc Security Changes in the .NET Framework 4Security Transparent Code, Level 2 từ MSDN để biết thêm thông tin.

Để tránh tất cả các ngoại lệ thời gian chạy bảo mật tiềm ẩn, hãy bật Phân tích mã với bộ quy tắc bảo mật. Bạn sẽ nhận được cảnh báo phân tích tĩnh có thể tương ứng với lỗi thời gian chạy.

+3

Tuyệt vời, đã hoạt động! Tôi thực sự đã thử điều này, nhưng tôi đã áp dụng thuộc tính ở cấp lớp thay vì ở cấp thành viên. –

+1

Tôi đang cố gắng làm điều này trên InitializeLifeTimeService và nó không muốn làm việc, bị lỗi tương tự. – adriaanp

+0

Tôi làm như thế nào? bạn có thể hiển thị một số mã không? – brainmurphy1

11

Về lỗi này trong môi trường lưu trữ được chia sẻ cho phép ứng dụng tin cậy đầy đủ. Khi bạn triển khai một ứng dụng, bạn thường ghi đè lên web.config. Dưới IIS, khi bạn thay đổi các thiết lập tin tưởng một cái gì đó khác với mặc định, phần cấu hình web của bạn được biến đổi với:

<system.web> 
    <trust level="Full" /> 
<system.web> 

Sao chép một web.config mới trong triển khai thường ghi đè thiết lập này, tuy nhiên IIS quản trị vẫn sẽ hiển thị trang web là "Full Trust", khi trên thực tế trang web đang chạy ở bất kỳ mức độ tin cậy mặc định nào dành cho nhà cung cấp máy chủ chia sẻ của bạn (thường là trung bình).

Bạn sẽ thấy lỗi này và làm những gì tôi đã làm - cố gắng tìm ra lý do tại sao bạn sẽ thấy nó mặc dù bạn biết trang web đang chạy dưới sự tin cậy đầy đủ, khi trong thực tế, nó không phải là. Giải pháp là sửa đổi cấu hình web của bạn như đã lưu ý ở trên trước khi triển khai hoặc sử dụng IIS Admin để đặt trang web thành mức tin cậy khác (ví dụ: cao), áp dụng nó, sau đó đặt lại thành đầy đủ. Làm như vậy sẽ thêm thông tin tệp cấu hình cần thiết và khởi động lại ứng dụng đầy đủ.

17

có vấn đề này khi tôi đã kêu gọi một hội đồng có thuộc tính AllowPartiallyTrustedCallers:

[assembly: System.Security.AllowPartiallyTrustedCallers] 

Loại bỏ nó giải quyết vấn đề của tôi mà không cần chuyển sang SecurityRuleSet.Level1.

+0

Đây là một sửa chữa nhanh chóng và bẩn để biên dịch nguồn DevExpress. –

+4

Điều này sẽ được chứa trong AssemblyInfo.cs, ít nhất là cho tôi. Loại bỏ nó cũng giải quyết nó cho tôi. –

1

Đối với tôi, sự cố xảy ra với thư viện log4net. Tôi đã tải xuống nguồn và thêm tệp dự án vào giải pháp của mình để tôi có thể bước vào các thư viện bên ngoài. Tuy nhiên, log4net cần biểu tượng NET_4_0 được xác định cho việc biên dịch có điều kiện. Theo mặc định, nó đã được xác định NET_1_0. Tôi đã đi vào các thuộc tính dự án log4net và thay đổi NET_1_0 thành NET_4_0 và điều này đã khắc phục được sự cố.

Ngoài: Có lẽ tôi không tuân theo các phương pháp hay nhất bằng cách đưa các thư viện vào dự án của tôi. Nếu đúng như vậy, tôi sẽ hoan nghênh ý kiến ​​phản hồi về những cách khác nhau để làm điều đó, và những ưu và nhược điểm của mỗi sự lựa chọn.Suy nghĩ hiện tại của tôi là, nếu có lỗi, việc có thể xem nguồn của thư viện sẽ giúp tôi hiểu thư viện đang mong đợi điều gì, điều này sẽ giúp tôi xóa lỗi. Ngoài ra, xem cách người khác viết mã nguồn là gì nếu không phải là một kinh nghiệm học tập có giá trị. Về cơ bản, tôi đang cố gắng làm theo lời khuyên của Jeff Atwood, tìm thấy here. Nhưng nếu có một cách tốt hơn để thực hiện điều này, tôi là tất cả các tai.

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