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 から派生することになる。