17

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

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

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

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

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

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

前もって感謝します。

4

3 に答える 3

22

次のコードを使用して、役割ベースのチェックを行うことができます

@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>
}
于 2013-03-25T07:39:42.553 に答える
13

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

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

MSDN から:

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

プロジェクトで、 Dashboardという新しい Controller を作成し、BuildTableというアクションを 1 つ追加します。

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

        return PartialView("_SupportTable");
    }
}

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

@Html.Action("BuildTable", "Dashboard")
于 2014-07-12T04:30:51.273 に答える
6

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

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

コントローラーで次を使用します。

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 というメソッドを作成します。

于 2012-08-06T15:19:42.523 に答える