在我的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中传递的一个(或多个)进行比较。如果当前登录的用户与参数中传递的值不匹配,则抛出一个禁止的异常。
我需要一些关于按位比较的指导,因为如果将多个枚举值传递给属性,则简单(不等于)不起作用。
由于
答案 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
}
这只是个人品味的问题。