宣言セキュリティのサポートの追加
厳密に要求されるわけではありませんが、要求、確認要求、アサーションなどのセキュリティ アクションを実行するための宣言構文でカスタム アクセス許可を指定できるように、それらのカスタム アクセス許可で宣言セキュリティをサポートする必要があります。実際、アクセス許可の要求、リンク確認要求、継承確認要求は宣言的にしか行うことができません。このため、カスタムのコード アクセス許可は、宣言セキュリティをサポートしない限り、リンク確認要求や継承確認要求によって要求または使用することはできません。ここでは、カスタム アクセス許可で宣言セキュリティをサポートできるようにする Attribute クラスの実装方法について説明します。
宣言用のセキュリティ属性は、直接または間接的に SecurityAttribute クラスから派生していることが必要です。アクセス許可がコード アクセス許可である場合、属性クラスは SecurityAttribute から派生した CodeAccessSecurityAttribute から派生します。セキュリティ属性クラスは、関連付けられたカスタム アクセス許可からアクセス許可オブジェクトのインスタンスを作成する CreatePermission メソッドを実装する必要があります。この関連付けられたカスタム アクセス許可クラスは、コンパイラでシリアル化してメタデータに格納できるように、SerializableAttribute でマークする必要があります。詳細については、「カスタム アクセス許可の実装」を参照してください。
CustomPermission
という Boolean 型のアクセス許可用の属性クラスを実装するコードを次に示します。この例では、アクセス許可クラスには、その状態を格納する Boolean 型の Unrestricted
プロパティが 1 つだけあります。
<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class
CustomPermissionAttribute
Inherits CodeAccessSecurityAttribute
Private myUnrestricted As Boolean = False
Public Shadows Property Unrestricted() As Boolean
Get
Return myUnrestricted
End Get
Set
myUnrestricted = value
End Set
End Property
Public Sub New(action As SecurityAction)
MyBase.New(action)
End Sub
Public Overrides Function CreatePermission() As IPermission
If Unrestricted Then
Return New CustomPermission(PermissionState.Unrestricted)
Else
Return New CustomPermission(PermissionState.None)
End If
End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
bool unrestricted = false;
public new bool Unrestricted
{
get{ return unrestricted; }
set{ unrestricted = value; }
}
public CustomPermissionAttribute(SecurityAction action): base (action)
{
}
public override IPermission CreatePermission()
{
if(Unrestricted)
{
return new CustomPermission(PermissionState.Unrestricted);
}
else
{
return new CustomPermission(PermissionState.None);
}
}
}
この例の CreatePermission は、内部の Unrestricted
プロパティをチェックし、CustomPermission
オブジェクトの適切なインスタンスを作成します。この例で使用されるプロパティは Unrestricted
だけですが、カスタム アクセス許可用の他の属性クラスでは、関連するアクセス許可オブジェクトがサポートする状態をすべてサポートする必要があります。
CustomPermissionAttribute
の使用例を次の確認要求宣言で示します。
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
参照
関連項目
SecurityAttribute Class
CodeAccessSecurityAttribute Class
SerializableAttribute Class
概念
独自のコード アクセス許可の作成
カスタム アクセス許可の実装