2011-12-05 12 views
4

私はいくつかのタブを含むページを持つサイトを持っていて、1つを選択すると、そのコンテンツはAJAX呼び出しを使用してサーバから取得されます。すべてのタブは別のコントローラを介してロードされます。たとえば、[製品]タブと[クライアント]タブがある[顧客]ページがあります。ASP.NET MVC 3のコントローラメソッドへのアクセスを制限する

サイトには、権限レベルの異なる種類のユーザーがあります。

私がしたいのは、コントローラを保護し、ログインしているユーザに許可がある場合にのみタブの内容を表示することです。したがって、許可のないユーザがコントローラのURLを入力すると、ログインページにリダイレクトする必要があります。 URLは次のようになります。

http://localhost/MyApp/Products/1 

ここで、1は製品のデータベースIDです。

私はこれらの2つのソリューションを実装することができますが、それらのどれが最適ではない:

  1. はChildOnlyAction属性を使用します。この属性を持つProductコントローラのアクションをマークし、RenderActionを使用してメインビューからタブをレンダリングします。しかし、それは、ページ上のすべてのタブをレンダリングする必要があることを意味します。これは、ユーザーがタブをクリックしたときにのみデータを読み込みたいので最適ではありません。

  2. Productコントローラへのリクエストごとに、レコードのIDを使用してユーザーにアクセス権があるかどうかを確認するデータベースクエリを作成します。しかし、これはすべてのリクエストに対して追加のクエリを実行する必要があることを意味します。

もっと良いアプローチがあるのでしょうか。

答えて

4

Romiasが提案したのと同様です。 Authorizeメタ属性とカスタムIAuthorizationFilterフィルターを組み合わせることができます。

Authorizeメタ属性を実装するときは、そのアクションに対する許可を持つユーザーまたはロールのリストを指定します。これは、データベースを使用して、ユーザーがアクセスする必要があるIDを指定する機能が欠けています。

IAuthorizationFilterが再生するのは、このIDからユーザーへのマッピングです。フィルタでは、現在のユーザをデータベースに対してチェックすることができます。

IAuthorizationFilterとその使用は、以下のページにありますサンプル:カスタムIAuthorizationFilterなければ

http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

+0

+1リンクの例 – Romias

3

保護したいコントローラを装飾するために認証フィルタを使用しようとしましたか?

[Authorize(Roles = "UserType1")] 

独自のロジックを追加するためにAuthorizeフィルタを拡張することもできます。 Authorizeフィルタを拡張する例を次に示します。https://stackoverflow.com/a/428266/7720

+0

、役割、さらにはユーザーを設定すると動作しません。 IDに基づいてフィルタリングするには、Authorize属性とカスタムIAuthorizationFilterの両方が必要です。 –

関連する問題