webapi 基于bitmask的

主要讨论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对应数据库中的表

[Flags]
public enum Permissions
{
    ViewDocument= 1,
    ViewSearch= 2,
    ViewDetail= 4
}

当存储过程获得数值后存储在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();
或者直接用位运算的 或 来判断是不是可以





[Flags]
public enum Permissions
{
    ViewDocument= 1,
    ViewSearch= 2,
    ViewDetail= 4
}

你可能感兴趣的:(有用的技术)