web-dev-qa-db-ja.com

ロールに基づいてコントロールを表示または非表示にする方法-ASP.NETMVC 4 Razor

ASP.NET MVC 4アプリケーションに取り組んでいます。ダッシュボードがあり、ユーザーグループはWindowsドメインに基づいているため、ユーザーの認証にWINDOWS認証を使用しています。関数AuthorizeAttribute、ActionFilterAttributeをオーバーライドすることでカスタム認証を使用するサンプルアプリケーションを作成しました。これは良いアプローチですか?

  1. 認証に最適な属性はどれですか?

ダッシュボードがあります。したがって、ロールに基づいてコントロールを表示または非表示にする必要があります。 3つのグリッド(テーブル)がある場合、管理者がログインしていると、3つのグリッド(テーブル)を表示できます。ただし、サポートユーザーがログインしている場合、2つのグリッド(テーブル)のみが表示されます。

私の計画は、グリッドごとに部分ビューを作成することです。そのため、部分ビューごとにアクションとコントローラーがあります。データベースがあり、その中で各グループが実行できるアクションを指定します。リクエストをフィルタリングできるようにします。

2ロールに基づいて部分ビューを非表示または表示するにはどうすればよいですか?.

いくつかのSOリンクを試しましたが、すべて2,3の役割について話していて、ハードコーディングされていました。私の場合、役割は異なる可能性があり、dbを使用して役割へのアクセスを設定します。

前もって感謝します。

17
kbvishnu

私は似たようなことをしました。私がそれをした方法(最高ではないかもしれません)

ブール値をビューに送り返すことです

コントローラーで:

bool showSection1 = true;
bool showSection2 = false;

ViewData["showSection1"] = showSection1;
ViewData["showSection2"] = showSection2;
/// may be better to use a viewmodel here rather than ViewData

次に、ビューで:

@if((bool)ViewData["showSection1"])
{
    @{Html.RenderPartial("section1");}
}
@if((bool)ViewData["showSection2"))
{
    @{Html.RenderPartial("Section2");}
}

ブール値を希望どおりに設定するロジックを実行する必要がありますが、これが出発点になるはずです。

ロールを返す静的メソッドを作成して、その値をビューから直接取得することもできます。これは悪い形かもしれません。

@if(AppHelper.GetRole().equals("role1")){
    //show the partial
}

次に、AppHelperというクラスと、ユーザーのロールを返すGetRoleというメソッドを作成します。

4
twaldron

ロールベースのチェックには、次のコードを使用できます

@if(Request.IsAuthenticated)

{
    if(User.IsInRole("Admin"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for Admin role</li>
     </Ul>
    }
     if(User.IsInRole("User"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for User role</li>
     </Ul>
    }
}
@* For unknown user *@
else
{
     <Ul Class="SubMenuItem">
         <li> this menu item is for Unknown user</li>
     </Ul>
}
20
Yogesh

通常、ロジックをほとんどまたはまったく使用せずに、ビューをできるだけクリーンに保つ必要があります。ロールチェックロジックをコントローラーアクションに移動し、ユーザーロールに基づいて部分ビューをレンダリングすることをお勧めします。

ChildActions およびHtml.Action拡張メソッドを使用して、これを接続できます。

MSDNから:

子アクションメソッドは、ビュー全体をレンダリングするのではなく、ビューの一部にインラインHTMLマークアップをレンダリングします。 ChildActionOnlyAttributeでマークされたメソッドは、ActionまたはRenderAction HTML拡張メソッドでのみ呼び出すことができます。

プロジェクトで、Dashboardという名前の新しいコントローラーを作成し、BuildTableという名前の単一のアクションを追加します。

public class DashboardController : Controller
{
    [ChildActionOnly]
    public ActionResult BuildTable()
    {
        if (Roles.IsUserInRole("Administrator"))
        {
            return PartialView("_AdminTable");
        }

        return PartialView("_SupportTable");
    }
}

ダッシュボードテーブルを表示するビューに次の行を含めます。

@Html.Action("BuildTable", "Dashboard")
12
matt.