3

CRUDの動的ロールに基づいて、アプリケーションでユーザーができることを制限する機能が必要です。

たとえば、ユーザー/インデックスには、ユーザーが表示するセキュリティを持っているかどうかを確認できるように[ClaimsAuthorize("View", "User")]、反対などの認証が必要です。[Authorise(Roles="Administrator")]

ユーザー ロールを構成しましたが、ロールによってユーザーが実行できることは動的です。管理者は、さまざまなセキュリティ グループがさまざまなことを実行できるようにするチェック ボックスを使用して、セキュリティ レベルを変更できます。

主な問題は、Razorでこれを行うことです。に似たものが必要ですが@User.CanEditUsers、これを行う方法がまったくわかりません。

これについて正しい方法を見つけるのに苦労しているので、どんな助けでも大歓迎です。

4

3 に答える 3

2

ユーザーに特定のページ要素を表示することを許可することは、要素が Controller の操作アクションを指していない限り、CRUD またはその他のデータベース操作を許可することとは異なることに注意してください。特定のユーザーに表示する必要がなく、特定のデータベース操作を持たない要素がいくつかあると考えてください。これまでのところ、次のアクセス許可が必要であると結論付けています。

  1. 閲覧許可
  2. 指揮権

どちらの部分にもMicrosoft Role Providerを使用できると思います。MSDNのドキュメントによると、それを考慮して:

Authorize 属性を使用すると、承認が事前定義された役割または個々のユーザーに制限されていることを示すことができます。これにより、サイトのページを閲覧できるユーザーを高度に制御できます。

次のステップ/質問では、それを行う方法は?

私たちの目的を達成するには、3つの方法があると思います。

  • 解決策 1:各ユーザーを関連するビューに転送するため、特定のページ要素を持つ個別のビューを作成します。このシナリオでは、別のコントローラー アクションも作成する必要があります。のような各アクションの前に、ユーザー タイプを確認する必要があります[Authorise(Roles="Administrator")]。静的 (定義済み) の役割とアクセシビリティを強制しました。そして一言で言えば、冗長性と不安定性のため、良い解決策ではありません

  • 解決策 2:ページを動的に作成する1 つのページ(たとえば、ページの編集)if内のアクセス制限された要素ごとにいくつかの条件を追加するだけです。これは、特定のユーザーを承認し、関連するページ要素 (ボタンなど) を表示するために使用するようなものです。コントローラー側では、 条件を使用して (生成/追加された新しいロールに基づいて動的機能を追加するためではなく)、データベースに対して有効なトランザクションを制御できます。ただし、いくつかの優れた機能主義者が追加されます (パフォーマンスの最適化など)。一文で 適度な解決策.@if (User.IsInRole("Admin"))ifFilterAttributeFilterAttribute

  • 解決策 3:解決策 2 のように動作します。承認用に独自のカスタム FilterAttribute を作成してコントローラーの問題を修正するだけです。これは、メソッドから継承されAuthorizeAttribute、メソッドをオーバーライドして、 Operations にのみOnAuthorize 必要なことを行います。

例えば ​​:

public class TableAuthorizeAttribute : AuthorizeAttribute
{
    public enum TableAction
    {
        Read,
        Create,
        Update,
        Delete
    }
    public TableAction Action { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        //do custom authorizization using Action and getting TableEntryID 
        //from filterContext.HttpContext.Request.QueryString or
        //filterContext.HttpContext.Request.Form
    }
}

そして、その使用法は次のようになります:

[TableAuthorize(Action=TableAuthorizeAttribute.TableAction.Update)]

上記の概念に関する完全な例を次に示しますAuthorizeAttributeアプリケーションに追加された新しいロールを承認するためのダイナミックを作成するための完全な例を次に示します。

解決策 3 を一言で言うと完璧だが複雑な解決策.

FilterAttributebefore Actions を使用することで、アプリケーションを静的/事前定義されたロールに制限していることに注意してください。別のデータ構造を使用したり、データベースにテーブルを生成したりする必要はありません。

于 2013-10-25T23:09:19.177 に答える
1

馬の口から: 「ロール管理は承認を管理するのに役立ちます。これにより、アプリケーション内のユーザーがアクセスできるリソースを指定できます。ロール管理では、ユーザーをマネージャーなどのロールに割り当てることで、ユーザーのグループを 1 つの単位として扱うことができます。販売、メンバーなど。」(参照: http://msdn.microsoft.com/en-us/library/5k850zwb%28v=vs.100%29.aspx )

ユーザーは複数の役割を持つことができ、アクション フィルターを活用して、サイト内のさまざまなリソースへのアクセスをきめ細かく制御できます。

 [Authorize(Roles="Contributor, Designer, Reviewer")]

あなたが求めている「動的」な側面は、管理者がそれらのリソースへのアクセスを提供する役割からオンデマンドでユーザーを追加および削除できることを中心に展開していると思います。これはかなり典型的です。

ロールが付与するアクセス許可を常に変更するという考えは、設計上の選択として不適切です。

于 2013-08-19T11:28:39.297 に答える