Декларативная безопасность в области классов и членов
Обновлен: Ноябрь 2007
Декларативная безопасность может выполняться над классами, членами и вложенными классами. В этом разделе приводится общее описание правил, используемых для оценки декларативной безопасности в применении к различным уровням одного и того же класса.
Классы, члены и декларативная безопасность
Если для одного и того же действия по обеспечению безопасности декларативная безопасность применяется как на уровне класса, так и на уровне метода, ее применение соответствует следующей таблице.
Действие по обеспечению безопасности |
.Поведение .NET Framework версий 1.0 и 1.1 |
Поведение .NET Framework версии 2.0 |
---|---|---|
Требование |
Атрибуты на уровне метода переопределяют атрибуты на уровне класса. (Если декларативное требование помещено и на уровне метода, то декларативное требование на уровне класса игнорируется.) |
Атрибуты на уровне метода и на уровне класса объединяются и образуют единый набор разрешений для обоих уровней. |
Требование связывания |
Атрибуты на уровне метода и атрибуты на уровне класса объединяются. |
Поведение не меняется. |
Требование наследования |
Атрибуты на уровне класса требуют указанного разрешения для обеспечения возможности наследовать данный класс. Атрибуты на уровне метода требуют указанного разрешения для обеспечения возможности переопределять метод в производном классе. Так как требования к наследованию имеют разное значение для классов и методов, объявления могут применяться независимо друг от друга как на уровне методов, так и на уровне класса. |
Поведение не меняется. |
Assert |
Атрибуты на уровне метода переопределяют атрибуты на уровне класса. |
Атрибуты на уровне метода и на уровне класса объединяются и образуют единый набор разрешений для обоих уровней. |
Deny |
Атрибуты на уровне метода переопределяют атрибуты на уровне класса. |
Атрибуты на уровне метода и на уровне класса объединяются и образуют единый набор разрешений для обоих уровней. |
Permit only |
Атрибуты на уровне метода переопределяют атрибуты на уровне класса. |
Пересечение атрибутов на уровне метода и на уровне класса используется в качестве единого набора разрешений для обоих уровней. |
Если действия безопасности различны (например, требование на уровне класса с утверждением на уровне метода), между ними не существует какого бы то ни было взаимодействия и оцениваются оба.
Вложенные классы и декларативная безопасность
При применении декларативной безопасности к классам она не распространяется ни на какие вложенные классы или методы вложенных классов. И наоборот, при применении декларативной безопасности к вложенным классам или методам вложенного класса она не распространяется на родительские классы. Нужно применять декларативную безопасность к вложенным классам так, как если бы они были отдельными классами.
Следующий пример показывает гипотетическое разрешение, затребованное на уровне класса с именем Main. Внутри этого класса определяется вложенный класс с именем Nested. В этом примере требование не применяется к вложенному классу.
<SomePermissionAttribute(SecurityAction.Demand, Unrestricted:=True)> _
Public Class Main
' This nested class is not influenced by the demand.
Public Class Nested
' This method is not influenced by the demand.
Public Sub MyMethod()
End Sub
End Class
End Class
[SomePermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
class Main
{
// This nested class is not influenced by the demand.
class Nested
{
// This method is not influenced by the demand.
public void MyMethod()
{
}
}
}