Action按位参数过滤

时间:2012-07-31 14:46:56

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4

在我的asp.net mvc 4.0应用程序中,我正在创建名为“ AllowAttribute ”的自定义AuthorizeAttribute。简而言之,我希望在某些方法(而不是整个控制器)上应用此属性,并允许该属性接收按位时尚参数。

我使用这样的属性(注意: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中传递的一个(或多个)进行比较。如果当前登录的用户与参数中传递的值不匹配,则抛出一个禁止的异常。

我需要一些关于按位比较的指导,因为如果将多个枚举值传递给属性,则简单(不等于)不起作用。

由于

1 个答案:

答案 0 :(得分: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
}

有时您会看到使用Hex表示法列出的这些枚举:

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

这只是个人品味的问题。