2

テーブル ユーザー、ロール、およびロール特権を持つ ASP.NET MVC4 Web アプリケーションがあります。

userid username password roleid] 値: 1 user1 12345 3、2 user2 12345 1、3 user3 12345 2

[roleid, rolename ] 値: 1 管理者、2 クライアント、3 ゲスト、4 ...

[Roleid、Action、GrantAccess] 値: 1 /Home/Index Y 1 /Home/Settings Y 1 /Home/Dashboard Y 2 /Home/Index Y 2 /Home/Settings N 2 /Home/Dashboard Y 3 /Home/Index Y 3 /ホーム/設定 N 3 /ホーム/ダッシュボード N

ASP.NET MVC フォーム認証で次のことを実現したいと思います。

コントローラー アクションには、ロールへの拒否されたアクセスを動的に付与する必要があります。ユーザーがアクセスを許可されていないコントローラー アクションにアクセスしようとすると、アプリケーションはサインアウトする必要があります。

1) Authorize(Roles="admin")] のようなロール名のハードコーディングは機能しないため、これを達成するための最良の方法を知りたい

2)ユーザーログイン時に初期化する必要があるユーザー固有の設定もあります.asp.netフォームでは、これはセッション変数に保存されていました.asp.net MVCでTempDataを使用して同じことを行うことができます.これはベストプラクティスですか?

4

1 に答える 1

3

役割ではなく、役割グループに基づいてアクション フィルターを作成できます。ロール グループは、1 対多の関係でデータベースに格納できます。(つまり、1 つのグループには多くの役割があります)。次に、グループ名をアクション フィルターにフィードします。

public class RoleGroupFilterAttribute : ActionFilterAttribute
{
    public string GroupName { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string [] users = new string[] {};
        string [] roles = new string[] {};

        // get the roles / users for the group from your db or storage
        // below is an example only
        roles = mydb.RoleGroups.Where(r=>r.Name == GroupName).Select(r=>r.Roles).ToArray();

        var user = filterContext.HttpContext.User;
        var userRoles = Roles.GetRolesForUser();

        if (!roles.Any(r => userRoles.Contains(r)) && !users.Contains(user.Identity.Name))
        {
            // return a not found result or redirect to an action
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}

使用するには、役割グループを管理するための管理ページを作成するだけです。また、フィルターをコントローラーまたはアクションに追加するのは非常に簡単です。

[RoleGroupFilter(GroupName="MyGroup")]
public ActionResult Index()
{
    return View();
}

上記の例では、ユーザーを役割グループに追加することも許可しましたが、それはあなたの選択です。

于 2013-07-01T03:46:27.723 に答える