10

コントローラーとアクションで承認属性を使用する ASP.NET MVC アプリケーションがあります。これはうまく機能していますが、新しいしわが現れました.

オブジェクト: 出荷

役割:出荷、経理、一般ユーザー

出荷はワークフローを移動します。状態Aでは配送のみ編集可能です。状態 B では、経理のみが編集できます。

ShipmentController と Edit Action があります。編集アクションをこれら 2 つのロールのみに制限するために Authorization 属性を設定できますが、これでは、Shipment がどちらの状態にあるかが区別されません。サービス呼び出しの前に、アクション内でいくつかの Authorization を実行して、ユーザーが編集アクションの実行を実際に許可されています。

だから私は2つの質問が残っています:

1)アクション内で承認を得る良い方法は何ですか。コントローラ アクションがサービスを呼び出すと、サービスが適切な呼び出しを Shipment オブジェクト (更新数量、更新日など) に行います。Shipment オブジェクトが承認要件にとらわれないようにしたいことは確かです。一方で、サービス オブジェクトに承認について知らせたいかどうかはよくわかりません。これに適したパターンはありますか?

2) 私の問題は実際には悪い設計の兆候ですか? ShipmentController の代わりに、StateAShipmentController と StateBShipmentController を使用する必要がありますか? Shipment オブジェクトに組み込まれたポリモーフィズムはありません (状態は単なる列挙型です)。

私の場合の特定の解決策ではなく、より一般的な解決策を求めていると思います。質問を説明するための例を提供したかっただけです。

ありがとう!

4

4 に答える 4

3

Action メソッド内で追加の認証チェックを行うことに問題はありません。ロール プロバイダーを利用して、探しているきめ細かい承認を得ることができます。ここで私の構文を許してください - それはおそらくラフであり、私はこれをテストしていません.

[Authorize(Roles="Shipping, Accounting")]
public ActionResult Edit(int id)
{
    Shipment shipment = repos.GetShipment(id);


    switch (shipment.State)
    {
         case ShipmentState.A:
         if (Roles.IsUserInRole("Shipping"))
                return View(shipment);
         else
                return View("NotAuthorized");
         break;
         case ShipmentState.B:
         if (Roles.IsUserInRole("Accounting"))
                return View(shipment);
         else
               return View("NotAuthorized");
         break;
         default:
              return View("NotAuthorized");
     }
}
于 2009-05-21T14:18:19.347 に答える
2

承認属性は、アクション パラメーターまたはルート データから出荷を取得し、決定を下すことができます。

第 1 に、ドメイン オブジェクトでリッチな動作を可能にする多数のパターンがあります。ダブル ディスパッチでは、サービスの抽象化 (インターフェイス) への参照をオブジェクトのメソッドに渡します。その後、それはそのことを行うことができます。Shipment を受け取って作業を行うアプリケーション サービスを作成することもできます。

2番では、必ずしもそうではありません。「コンテキストシップメント」の概念を、現在のシップメントコンテキストを特定するサービスに抽象化する必要があるかもしれません。

于 2009-05-20T19:01:55.490 に答える
1

上記の回答に加えて、NotAuthorized の独自のビューを作成する代わりに、HttpUnauthorizedResult を返すことができます。これにより、ログイン ページにリダイレクトされ、通常の [Authorize] 属性と同じように動作します。

于 2009-05-22T13:15:00.430 に答える
1

Rhino.Securityを見ることができます。このようなシナリオでユーザー認証を実装するために使用できます。

于 2009-05-20T19:06:36.743 に答える