我们正在使用 MVC 设计应用程序。我们有成千上万的用户和 100 多个角色。任务(特定操作的访问权限)分配给角色。有许多任务分配给多个角色,这意味着任务可以在角色之间共享。由于应用程序的性质,我们必须添加/删除/更新角色,因此我们不能使用基于角色的授权。
需要帮助来建议如何在应用程序不关心角色的情况下实施基于任务的授权。谢谢。
我们正在使用 MVC 设计应用程序。我们有成千上万的用户和 100 多个角色。任务(特定操作的访问权限)分配给角色。有许多任务分配给多个角色,这意味着任务可以在角色之间共享。由于应用程序的性质,我们必须添加/删除/更新角色,因此我们不能使用基于角色的授权。
需要帮助来建议如何在应用程序不关心角色的情况下实施基于任务的授权。谢谢。
您可以使用位标志枚举来创建任务列表并使用它们分配用户权限。不幸的是,即使您使用 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
}