11

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に傾倒しますが、これまであまり多くのことをしていなかったため、飛躍することを躊躇しています。

4

1 に答える 1

7

ランタイムにはすでに抽象化されたセキュリティ/ユーザーシステムが組み込まれていることを忘れないでください-プリンシパル(この既存の回答を参照してください-これは1つのオプションにすぎないことに注意しGenericIdentityてください。独自に作成するのは非常に簡単です)。

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を使用することもでき、誰もあなたを止めることはできません...

于 2009-05-20T20:51:35.253 に答える