ASP.NETメンバーシップ、特にASP.NET MVCでのアクセス許可(ロールではない)を最適に処理する方法
-
18-09-2020 - |
質問
ASP.NETメンバーシップ、ロールプロバイダなどを設定する上でたくさんの質問(および情報)があります。 Microsoftによって提供されている組み込みプラットフォームを使用するかどうか、または役割を延ばすか、自分のベースクラスと役割を拡張します。
私はデフォルトのプロバイダを拡張し、自分の会員および役割プロバイダを実装することを決定しました。今、私の質問は特に役割認証に関するものです。
伝統的に、あなたは「マネージャ、管理者、従業員、スーパーユーザー」のような役割を作成するでしょう。しかし、私がより細かいコントロールの穀物であると考える許可に関して何をするか/あなたは何をすべきか?私に精巧に......
MISP.NET MVCサイトでは、管理、管理、メッセージング、報告などのさまざまな分野があります。適切な役割なしに、「管理者」、 'Manager'、 'Reporter'など、これらのそれぞれの役割を決済します。 、サイトのその領域にアクセスすることはできません。そのため、クラスレベルでコントローラ全体をロックします。
しかし、今や一つの領域を一例として取ります。メッセージング、そして、私はCrudのためのより細かい穀物の権限を持っていたかったと言う。メッセージを作成し、メッセージの表示/読み取り、メッセージの編集、メッセージの削除など。
最後に私の質問。このより細かいコントロール粒を実装するのが最善でしょうか。私が見る1つのアプローチ(それが良いものであるかどうかわからない)は、すべてのためにASP.NETメンバーシップの役割を作成するだけです。だから私は持っているかもしれません....
メッセンジャー(広いレベルの役割)、CreateMessage、ReadMessage、EditMessage、DeleteMessage。
片手では、何人かのユーザーがメッセージを読み/表示できるようにしたいです。しかし、必ずしもそれらを作成または削除するわけではありません。個々のコントローラのアクションには、特定の役割が適用される可能性があります。
このアプローチに問題がありますか?あなたはより良い考えを持っていますか?
これまでのところ
私は自分のスキーマを作成し、カスタムメンバーシップとロールプロバイダを実装することを決定しました。私のスキーマには;
- user
- userprofile
- 許可
- PermissionAssignment
- 役割
- roleassignment
翌日または2つのために離れているが、私がチャンスを得るときより多くの情報で更新されるでしょう。
解決
承認メカニズムで役割を忘れないようにするには、代わりに権限を求めることができます(ロールが権限のagrupationsのagrupationsの場合)、そのように見ている場合は、Authorize
属性がエンティティとアクションを要求する必要があります。特定の役割ではありません。
[Authorize(Entities.Message, Actions.Create)]
public ActionResult CreateMessage()
[Authorize(Entities.Message, Actions.Edit)]
public ActionResult EditMessage()
[Authorize(Entities.Message, Actions.View)]
public ActionResult ViewMessage()
.
そのようにあなたの役割は、柔軟なアクセスレベルを決定する代わりに、それらが最善のものであることをすること、抽象的な権限のコレクションを実行します。
編集: David Robbinsが指すもののような特定の規則を処理するために、マネージャAはマネージャBによって作成されたメッセージを削除することはできません。認証はこのタイプのルールをチェックする責任がありません。アクションフィルタレベルでそれが苦痛になることを確認しようとしている場合でも、あなたができることはActionResultへの認証検証を拡張することです(保持しているアクションパラメータの注入)。検証結果)、そしてActionResultには、すべての引数が配置されているロジックの決定を実行させます。
このはAです同じ質問は、まさにここで指摘されていませんが、アクションパラメータでの検証を承認するのは良い出発点です。
他のヒント
あなたのCrudの例に関しては、あなたは承認について本当に話していません、そして、認証は会員の役割「マネージャー」と「レポーター」によって異なりますか?役割がメッセージ間の読み取りおよび書き込み権限を区別しない場合は、これらの細かいアクティビティに別のメカニズムを作成する必要があると思います。
各アクションのロールを作成する場合 - editMessage、deleteMessage - マネージャAがマネージャBのメッセージを削除できない場合はどうしません。
コントローラの上の[Authorize(Roles="Administrator")]
etcを追加します。 も