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

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

谢谢

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
}

有时您还会看到使用十六进制表示法列出的这些枚举:

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

这只是个人品味的问题。

于 2012-07-31T16:01:57.410 回答