認証、役割、セキュリティを DDD にどのように組み込むのでしょうか?
-
23-08-2019 - |
質問
C# ドメイン駆動設計プロジェクトにロールとセキュリティを実装するにはどうすればよいですか?これを呼び出し側アプリケーション (ASP.NET MVC) で実装するか、ドメイン モデル自体 (モデル エンティティとサービス) で実装するかについて、激しい議論が行われています。Web サイト自体に認証がすでに存在するため、その中にあるべきだと主張する人もいます。ただし、これは、コア ビジネス システムと統合するたびにセキュリティを再実装する必要があることを意味します。
例として: 管理者は、レコードの編集や削除など、システム内でほとんどすべてのアクションを実行できる必要があります(つまり、ユーザーの注文を削除することもできます)。一方、ユーザーは自分のレコードの編集と削除のみができるようにする必要があります(つまり、ショッピング カートに商品を追加/削除できます)。
ちなみに、これは DDD とセキュリティに関する 7 つの異なるシナリオをカバーするこのトピックに関する素晴らしい論文です。
- 第 4 章 セキュリティ サービスの設計シナリオ
- 4.1 シナリオ 1:セキュリティサービスを定期サービスとして
- 4.2 シナリオ 2:UIに組み込まれたセキュリティ
- 4.3 シナリオ 3:ドメインモデルをカプセル化したセキュリティサービス
- 4.4 シナリオ 4:UIのゲートウェイとしてのセキュリティサービス
- 4.5 シナリオ 5:UIのアダプターとしてのセキュリティサービス
- 4.6 シナリオ 6:AOP とアダプターによって統合されたセキュリティ サービス
- 4.7 シナリオ 7:AOPと統合されたセキュリティサービス
私は個人的には PostSharp を使用する AOP に傾いていますが、これまでに AOP をあまり使ったことがないため、思い切って踏み出すのをためらっています。
解決
ランタイムにはすでに抽象化されたセキュリティ/ユーザー システム、つまりプリンシパルが組み込まれていることを忘れないでください (これを参照してください) 既存の答え - ご了承ください GenericIdentity
は 1 つのオプションにすぎません。自分で書くのは非常に簡単です)。
UI は、特定の実装に基づいてプリンシパルの作成と割り当てを処理できます (実際、IIRC ASP.NET と WCF ではこれが自動的に行われます。また、winforms/wpf の場合は、Windows ID または (Web サービス経由で) 同じ ASP を使用できます) .NET ログイン)。
ビジネス ロジックはチェックするだけです Thread.CurrentPrincipal
;これにより、名前、認証方法を取得し、ロールを確認できます (ロールの実装方法を知る必要はありません)。
ランタイムには組み込みチェックも提供されます。
[PrincipalPermission(SecurityAction.Demand, Role = Roles.Admin)]
public void Foo() {...}
(どこ Roles.Admin
はロール名の文字列定数です) これにより、アクセスが自動的にチェックされ、 SecurityException
役割を果たしていない場合。コード経由で確認することもできます (コンパイル時に役割が固定されていない場合に便利です)。
明らかに、UI はロールを (機能を無効化/非表示にするために) チェックする必要がありますが、ビジネス コードがあることは良いことです。 強制する UI について知らなくても役割を理解できます。
(追加した)
それについて言及しておきます GenericIdentity
単体テストに便利です。もちろんあなた できた 独自のセキュリティ API の役割を果たせば、誰もあなたを止めません...