如何使用基于任务的模型来授权请求

时间:2012-08-17 22:48:34

标签: asp.net-mvc authorization

我们正在使用MVC设计应用程序。我们拥有数千名用户和100多个角色。任务(特定操作的访问权限)分配给角色。 分配给多个角色的任务很多,这意味着可以在角色之间共享任务。由于应用程序的性质,我们必须添加/删除/更新角色,因此我们不能使用基于角色的授权。

需要帮助来建议如何在应用程序不关心角色的情况下实现基于任务的授权。 感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用bit flag enums创建任务列表并使用它们分配用户权限。不幸的是,即使您使用ulong,这也将限制您最多64个选项。以下是示例代码:

[Flags]
public enum TaskPermissions : ulong
{
    None = 0x0000,
    CanDoTask1 = 0x0001,
    CanDoTask2 = 0x0002,
    CanDoTask3 = 0x0004,
    CanDoTask4 = 0x0008,
    CanDoTask5 = 0x0010,
    // ... powers of 2
    CanDoEverything = 0xFFFF
}

public class Member
{
    public string Username {get;set;}
    public TaskPermissions Permissions { get; set; }
    // other things that are necessary

    public bool HasPermission(TaskPermissions permissions)
    {
        return (Permissions & permissions) == permissions;
    }
}

设置权限:

var member=new Member():
member.Permissions= TaskPermissions.CanDoTask1 | TaskPermissions.CanDoTask2;

检查权限:

member.HasPermission(TaskPermissions.CanDoTask1);

Mvc的示例AuthorizationRequiredAttribute(假设成员正在进行会话):

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizationRequiredAttribute : ActionFilterAttribute
{
    public TaskPermissions RequiredPermissions { get; set; }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.Controller.Session["Member"].HasPermission(RequiredPermissions))
        {
            base.OnActionExecuting(filterContext);
            return;
        }
        throw new AuthenticationException("Access denied");
    }
}

用法:

[AuthorizationRequired(RequiredPermissions = TaskPermissions.CanDoTask1)]
public class TestController : Controller
{
    //methods
}