12

すべてのページ (ビュー) とすべてのコントロール (ボタン、リンク、メニュー項目など) にセキュリティ ロールが適用されているシステムがあります。

したがって、すべてのページとコントロールが登録されている管理インターフェイスがあります。また、各ユーザーには一連の個別の権限があります。

たとえば、次のようになります。

「新規」、「削除」、「戻る」の 3 つのボタンを備えた View EditCar があります。

したがって、ユーザー X には View EditCar を表示する権限があり、「戻る」ボタンのみが表示されます。

そのため、それぞれの新しいビューを登録し、ユーザーを関連付ける必要があります。各ユーザーは 100% 構成可能であるため、役割はありません。

だから、私は FilterAttribute を持っています:

public class CustomAuthorize : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {

            var userPermissions = repository.GetAll().Where(x => x.Name.Equals(User.Identity.Name);                

            //   if (!userPermissions.Pages.Any(x => x.NamePage.Contains(???))))               
        }
        else
        {
            filterContext.Result = new HttpUnauthorizedResult();          
        }
    }
}

だから私の質問は: - 各 View(Action) を識別するためにデータベースに何を保持する必要がありますか? たぶん3つの値?エリアコントローラアクション?

それは最良の選択肢ですか?その解決策について他に何か考えはありますか?

ありがとう

4

5 に答える 5

1

ユーザーに特定のページ要素を表示することを許可することは、要素が 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-25T22:52:20.373 に答える