2

MVCを使用してアプリケーションを設計しています。数千のユーザーと100を超える役割があります。タスク(特定のアクションのアクセス権)がロールに割り当てられます。複数の役割に割り当てられた多くのタスクがあります。これは、タスクを役割間で共有できることを意味します。アプリケーションの性質上、ロールを追加/削除/更新する必要があるため、ロールベースの承認を使用することはできません。

アプリケーションが役割を気にしない場合に、タスクベースの承認を実装する方法についてアドバイスする必要があります。ありがとう。

4

1 に答える 1

1

ビットフラグ列挙型を使用して、タスクのリストを作成し、それらを使用してユーザー権限を割り当てることができます。残念ながら、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
}
于 2012-08-17T23:25:13.893 に答える