30秒で作ってみた
FileIOPermission では「すべてのファイル」「すべてのローカルファイル」が指定できるのに、FileIOPermissionAttribute ではこれらを指定することができない・・・というわけで、それを設定するための属性をでっちあげた、未テスト。
宣言ベースのセキュリティ属性は、目的の IPermission を生成する abstract SecurityAttribute.CreatePermission() を実装すれば、あとは使いやすいように肉付けするだけなので非常に手軽である。*1
// code coloring/formated by http://manoli.net/csharpformat/ using System; using System.Security; using System.Security.Permissions; namespace Lx.Security.Permissions { /// <summary> 要求されたファイルアクセスの対象を指定します。 </summary> public enum AllFilesIOPermissionTarget { /// <summary> アクセス許可なし </summary> None = 0, /// <summary> ローカルファイルすべて </summary> LocalFiles, /// <summary> すべてのファイル </summary> AllFiles, } [Serializable] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method, AllowMultiple=true, Inherited=false)] public sealed class AllFilesIOPermissionAttribute : CodeAccessSecurityAttribute { private AllFilesIOPermissionTarget target = AllFilesIOPermissionTarget.None; private FileIOPermissionAccess access = FileIOPermissionAccess.NoAccess; public AllFilesIOPermissionAttribute(SecurityAction action) : base(action) {} /// <summary> /// 要求するアクセス許可の対象を取得または設定します。 /// </summary> public AllFilesIOPermissionTarget Target { get { return this.target; } set { this.target = value; } } /// <summary> /// 要求するアクセス許可の種類を取得または設定します。 /// </summary> public FileIOPermissionAccess Access { get { return this.access; } set { this.access = value; } } /// <summary> /// 新しい FileIOPermission を作成して返します。 /// </summary> public override IPermission CreatePermission() { if (this.Unrestricted) return new FileIOPermission(PermissionState.Unrestricted); FileIOPermission perm = new FileIOPermission(PermissionState.None); switch (this.Target) { case AllFilesIOPermissionTarget.LocalFiles: perm.AllLocalFiles = this.Access; break; case AllFilesIOPermissionTarget.AllFiles: perm.AllFiles = this.Access; break; } return perm; } } }
*1:CAS の場合は SecurityAttribute ではなく CodeAccessSecurityAttribute から派生することになる。