主要讨论web api实现基于bitmask的认证; 这里说的是有没有权利访问一个web method
这个应该可以实现,代码片段来自网络
这个方法适用于权限不多的情况,如果太多了需要改良
1. DB: id 是按照bit来设置的而不是连续数字序列。 1,2,4,8, 16,32.....
Role | PermissionId | Name |
1 | 1 | ViewDocument |
1 | 2 | ViewSearch |
1 | 4 | ViewDetail |
存储过程: 对于特定的role=1, 返回id的总数sum; 也就是说返回值=7
2. Application
设置一个enum对应数据库中的表
|
当存储过程获得数值后存储在memory 或者cache中, 自己写一个AuthorizeAttribute的拓展
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public PermissionsPermission{ get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
return false;
string username = httpContext.User.Identity.Name;
UserRepository repo = new UserRepository();
return repo.IsUserInR(username, this.Permission);
}
}
在api中写
[CustomAuthorize(Permission = Permission.ViewSearch)]
public HttpResponseMessage LoadSearch(){};
在IsUserInR是真正检查的地方
小窍门,如下代码可以根据总数返回符合要求的bitmask列表
var mask = (Permissions)7;
var result =
Enum.GetValues(typeof(Permissions))
.Cast<Permissions>()
.Where(value => mask.HasFlag(value))
.ToList();
或者直接用位运算的 或 来判断是不是可以
|