Как наследовать от DataAnnotations.ValidationAttribute (он появляется SecureCritical в узле отладки Visual Studio в .NET 4!) - PullRequest
7 голосов
/ 22 апреля 2010

У меня есть библиотека классов [AllowPartiallyTrustedCallers], содержащая подтипы System.DataAnnotations.ValidationAttribute. Библиотека используется в контрактных типах сервисов WCF.

В .NET 2 / 3.5 это работало нормально. Однако, начиная с .NET 4.0, запуск клиента службы в отладчике Visual Studio приводит к исключению « Правила безопасности наследования, нарушенные по типу:« (мой подтип ValidationAttribute) ». Производные типы должны соответствовать доступности безопасности: базовый тип или быть менее доступным."(System.TypeLoadException)

Ошибка появляется только при соблюдении всех следующих условий:

  1. подкласс ValidationAttribute находится в сборке AllowPartiallyTrustedCallers
  2. Отражение используется для проверки атрибута
  3. включен процесс размещения Visual Studio (флажок в свойствах проекта, вкладка «Отладка»)

Итак, в основном в Visual Studio.NET 2010:

  • создать новый консольный проект,
  • добавить ссылку на «System.ComponentModel.DataAnnotations» 4.0.0.0,
  • написать следующий код:

.

using System;

[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace TestingVaidationAttributeSecurity
{
    public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
    { }

    [MyValidation]
    public class FooBar
    { }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ValidationAttribute IsCritical: {0}",
                typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical);

            FooBar fb = new FooBar();
            fb.GetType().GetCustomAttributes(true);

            Console.WriteLine("Press enter to end.");
            Console.ReadLine();
        }
    }
}
  • Нажмите F5, и вы получите исключение!

Нажмите Ctrl-F5 (запустить без отладки), и все работает без исключения ...

Странно, что атрибут ValidationAttribute будет или не будет критически важным для безопасности в зависимости от способа запуска программы (F5 или Ctrl + F5). Как показано на Console.WriteLine в приведенном выше коде. Но опять же, похоже, что это происходит и с другими атрибутами (и типами?).

Теперь вопросы ...

Почему у меня такое поведение при наследовании от ValidationAttribute, а не при наследовании от System.Attribute? (С помощью Reflector я не нахожу специальных настроек для класса ValidationAttribute или его сборки)

А что я могу сделать, чтобы решить эту проблему? Как сохранить MyValidationAttribute, наследуемый от ValidationAttribute в сборке AllowPartiallyTrustedCallers, не помечая ее SecurityCritical, все еще используя новую модель безопасности .NET 4 level 2 и , по-прежнему работающую на отладочном хосте VS.NET (или других хостах ) ??

Большое спасибо! Rudi

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Почему у меня такое поведение при наследовании от ValidationAttribute, а не при наследовании от System.Attribute?(При использовании Reflector я не нахожу специальных настроек для класса ValidationAttribute или его сборки)

Это потому, что сборка System.ComponentModel.DataAnnotations является условно APTCA, т.е. она помечена следующим атрибутом.

[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]

Что-то в том, как Visual Studio запускает хост-процесс, приводит к тому, что CLR не учитывает APTCA в этой сборке, даже если домен AppDomain по умолчанию полностью доверенный.Это означает, что все типы и методы в сборке DataAnnotations являются SecurityCritical.Поскольку прозрачный для безопасности тип (MyValidationAttribute) не может наследоваться от критического типа безопасности (ValidationAttribute), выдается это исключение.

И что я могу сделать, чтобы решить эту проблему?Как сохранить MyValidationAttribute, унаследованный от ValidationAttribute в сборке AllowPartiallyTrustedCallers, не помечая его SecurityCritical, по-прежнему используя новую модель безопасности .NET 4 level 2 и продолжая работать с использованием отладочного хоста VS.NET (или других узлов) ??

Похоже, что это ошибка хоста VS, что неблагоприятно для вашей ситуации.С другой стороны, вы должны быть уверены, что хотите, чтобы ваша сборка была APTCA.Если это необходимо, у вас есть несколько вариантов.

  • Вы можете оставить свою сборку как есть.Это выгодно, потому что в наиболее типичной среде частичного доверия, ASP.NET, сборка DataAnnotations всегда будет считаться APTCA.Конечно, вы теряете возможность использовать отладчик в процессе размещения VS.
  • Вы также можете пометить свою сборку C-APTCA.Вы сможете использовать отладчик в процессе размещения VS, но пользователи вашей сборки в ASP.NET должны будут добавить вашу сборку в элемент в web.config, чтобы он был APTCA.
  • Вы можете сделать свой атрибут SecurityCritical, чтобы вы могли использовать отладчик и не требовали какой-либо специальной настройки в ASP.NET, но все классы, которые используют этот атрибут, также должны быть критическими.
1 голос
/ 14 июля 2010

По какой-то причине сайт разместил текст совершенно другого вопроса, чем тот, который был на странице, когда я писал - странно.

...