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
をどのように渡してルールを適用しますか?もちろん、処理を進める前に、それぞれのアクションの中にチェックを入れることも可能です。ベストプラクティスの方法はありますか?
あなたのヘルプははるかに高く評価されます。ありがとう。
通常、私はこれをカスタムロジックとフレームワークロジックが少ないと考えているため、アクション内のチェック(またはシステムのデザインによってはモデル)を追加しました。認証の直交する2つの側面を考慮してください。「垂直」認可はフレームワークベースで、ユーザーが実行できる操作を決定します。フレームワークの標準的なアイデンティティーはこれを簡単に処理します。 「水平」認可はよりカスタムであり、ビジネスロジックによって変更することができます。ユーザーがアクセスできるデータ(レコードレベルまたは値レベル)を決定します。 – David
ユーザIDでデータソースにクエリをフィルタリングするだけの理由はありますか?つまり、誰がレコードを作成したか知っていれば、レコードを返すクエリにフィルタを渡すことができます.S/heはMyController/Edit/9999にURLを変更しますレコード、クエリは何も返さないはずです。 – JCM