0

asp.net mvc 4.0アプリケーション内で、AuthorizeAttribute「<em>AllowAttribute」というカスタムを作成しています。一言で言えば、この属性を特定のメソッド(コントローラー全体ではなく)に適用し、その属性がビット単位のファッションパラメーターを受け取ることができるようにしたいと思います。

私はそのように属性を使用します(注:MemberTypeは列挙型です)

[Allow(MyProperty = MemberType.User | MemberType.Administrator)]

属性自体は次のように定義されます。

public class AllowAttribute : AuthorizeAttribute
{
    public MemberType MyProperty { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (MemberContext.Current.Member == null || MemberContext.Current.Member.MemberType != this.MyProperty)
            throw new HttpException(403, "Forbidden");

        base.OnAuthorization(filterContext);
    }
}

基本的に、現在ログインしているユーザーのMemberTypeを、MyProperty内で渡されたものと比較しようとしています。現在ログインしているユーザーがパラメーターで渡された値と一致しない場合、禁止された例外をスローします。

複数の列挙値が属性に渡された場合、単純な(等しくない)は機能しないため、ビット単位の比較に関するガイダンスが必要です。

ありがとう

4

1 に答える 1

3

複数の値の組み合わせである列挙型がある場合:

MemberType.User | MemberType.Administrator

そして、MemberType.Administratorが設定されているかどうかを確認します。

var myValue = MemberType.User | MemberType.Administrator;

bool isAdministrator = (myValue & MemberType.Administrator) == MemberType.Administrator;
bool isUser = (myValue & MemberType.User) == MemberType.User;

列挙型が[Flags]属性でマークされていること、および値が2の累乗で設定されていることを確認してください。

[Flags]
public enum MemberType
{
    None = 0,
    User = 1,
    Administrator = 2,
    SuperAdmin = 4
}

これらの列挙型が16進表記を使用してリストされている場合もあります。

[Flags]
public enum MemberType
{
    None = 0x0,
    User = 0x1,
    Admin = 0x2,
    Super = 0x4,
    ...
    Overlord = 0x10,
    SupremeOverlord = 0x20
}

これは個人的な好みの問題です。

于 2012-07-31T16:01:57.410 に答える