2017-09-14 21 views
1

Visual Studio 2015 Update 3でASP.NET MVC 5アプリケーションを開発中です。ユーザーは既にIdentity Framework経由で認証されています。誰がどのコントローラー/アクションにアクセスできるか。しかし、私たちはもっと細かいことが必要です:アクションでは、ユーザーが表示し編集できるレコードを制限する必要があります。ASP.NET MVC - ユーザーが表示/編集できるものを制限する

たとえば、ユーザーはMyController/Edit/5というバージョンのGETにアクセスしますが、このユーザーはいくつかのルールに基づいてアクセス権を持つアイテムのみをフェッチでき、他のユーザーのレコードは単純にMyController/Edit/9999へのURL(この場合はIDを変更します)。場合によっては、ルールがより複雑なので、必ずしもIDではありません。同じルールがPOSTアクションに適用されます。

ビューモデル(VM)を使用して、ビューとの間でデータを送受信しています。したがって、1つのVMはItemVmになる可能性があります。その顧客は自分のItemVmにアクセスでき、他のユーザーにはアクセスできないようにしたいと考えています。ここでは、コントローラからのサンプルです:リソースに基づいてロックダウンに関する

public async Task<ActionResult> Edit(int id) 
{ 
    // Only allow users to see "items" they have access to 
    // based on custom rules. If they enter a different ID, 
    // prevent them from viewing/editing that information. 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Edit(ItemVm itemVm){ 
    // Only allow users to edit their own "items". 
} 

This article会談は、それが、この場合には必要なものだかどうかわかりませんでした。カスタム許可属性でこれを行うのでしょうか?その場合は、ItemVmをどのように渡してルールを適用しますか?もちろん、処理を進める前に、それぞれのアクションの中にチェックを入れることも可能です。ベストプラクティスの方法はありますか?

あなたのヘルプははるかに高く評価されます。ありがとう。

+1

通常、私はこれをカスタムロジックとフレームワークロジックが少ないと考えているため、アクション内のチェック(またはシステムのデザインによってはモデル)を追加しました。認証の直交する2つの側面を考慮してください。「垂直」認可はフレームワークベースで、ユーザーが実行できる操作を決定します。フレームワークの標準的なアイデンティティーはこれを簡単に処理します。 「水平」認可はよりカスタムであり、ビジネスロジックによって変更することができます。ユーザーがアクセスできるデータ(レコードレベルまたは値レベル)を決定します。 – David

+1

ユーザIDでデータソースにクエリをフィルタリングするだけの理由はありますか?つまり、誰がレコードを作成したか知っていれば、レコードを返すクエリにフィルタを渡すことができます.S/heはMyController/Edit/9999にURLを変更しますレコード、クエリは何も返さないはずです。 – JCM

答えて

1

詳細は変化するであろうが、このようになります:

public async Task<ActionResult> Edit(int id) 
{ 
    // Only allow users to see "items" they have access to 
    // based on custom rules. If they enter a different ID, 
    // prevent them from viewing/editing that information. 
    string userId = User.Identity.GetUserId(); 
    var items = context.Items.Where(m => m.Userid == userId); 
    return View(items); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Edit(ItemVm itemVm){ 
    // Only allow users to edit their own "items". 
    string userId = User.Identity.GetUserId(); 
    var item = context.Items.Where(m => m.Id == itemVm.ItemId && m.UserId == userId); 
    if (item != null) 
    { 
    //update item stuff 
    } 
    return View(); 
} 
1

をあなたの最後の段落を中心に。

この資料では、リソースに基づいてロックダウンについて説明していますが、この場合に必要なものかどうかは不明です。

プロジェクトが.NETコアを使用して構築されている場合は、はいです。それ以外の場合、プロジェクトは.NETフレームワークを使用して構築されます。つまり、記事は無関係です。

私たちはカスタム権限属性でこれを行いますか?もしそうなら、どのようにItemVmを渡してルールを適用しますか?

.NETコアプロジェクトの場合:カスタム権限属性は必要ありません。代わりに、あなたはもちろん

the articlethis video (start at around 27:00)は、より多くの情報を持っています)コントローラにIAuthorizationService依存性を注入します、それは一人ひとりに進む前に、アクション内のチェックを追加することが可能です。ベストプラクティスの方法はありますか?

ベストプラクティスはわかりませんが、現在のユーザーに基づいてリソースを承認する方法を持つ親コントローラを作成します。

関連する問題