如何在ASP.NET MVC中的角色内设置权限?

时间:2016-07-28 13:27:19

标签: asp.net asp.net-mvc authorization asp.net-identity privileges

我目前有一个系统,其中有一个用户表,一个角色表和一个用户角色关联表,其中一个用户可以与多个角色(如Admin,BasicUser等)相关联。我能够根据这些角色授权操作方法。这来自Identity框架。

现在我想添加对权限的支持,以便可以根据这些权限而不仅仅是角色来限制操作方法。例如,在Controller中,我可能有一个HTTPPost操作,只有具有“写入”权限的人才能成功执行。

我需要做哪些更改才能为角色分配权限? I.E.,我想选择“Admin”角色以获得“Write”和“Read”权限,而“BasicUser”角色只会被赋予“Read”权限。这样,管理员可以访问Write权限允许的任何方法,而BasicUser则不能。

如果我要创建另一个名为“Privilege”的表以及该角色和角色之间的关联表,以及在角色中设置权限的代码,我该如何将该权限用作过滤器?因此,例如,只允许用户在具有归属于它的“写入”权限的角色中执行以下操作。

new_level0 = []
new_level1 = []
new_values  = []

for level0 in df.index.levels[0].values:
    #this will loop with A and B

    #retrieve the values
    level1_values = df[level0]['Value'].values
    #retrieve the index, we will keep some of the values of it
    level1_index  = df[level0].index.values


    #split the values into two vectors
    #reverse so that it starts pairing values from the end
    level1_even = [i for enum,i in enumerate(level1_values) if enum%2==0].reverse()
    level1_odd =  [i for enum,i in enumerate(level1_values) if enum%2==1].reverse()
    #
    #
    #sum and reverse again to bring back to normal order
    summed = [i+j for i,j in zip(level1_even,level1_odd)]
    summed.reverse()
    #
    #
    #now that we have the values, lets get the index that we need
    #again, reverse so that we keep the right one
    level1_index.reverse()

    #keep only the multiples of two, then undo the reverse
    new_index = [i for enum,i in enumerate(level1_values) if enum%2==0].reverse()

    #now store the combination of level0, level1 and value
    new_level0 += [level0 for i in summed]
    new_level1 += new_index
    new_values += summed

    #your final structure is:
    s = pd.Series(summed, index= [new_level0, new_level1])    

谢谢。

1 个答案:

答案 0 :(得分:1)

AuthorizeAttribute的工作方式相同,您可以创建从中继承的自定义授权属性:

public class AuthorizePrivilegeAttribute : AuthorizeAttribute
{
    // Custom property
    public string Privilege { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Reusing default authentication. 
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {                
            return false;
        }

        return YourCustomCode.HasPrivilege(this.Privilege))      
    }
}

然后在你的方法上使用它:

[AuthorizePrivilege(Privilege = "Write")]
public ActionResult Create()
{
    return View();
}