2012-01-18 9 views
2

私が取り組んでいるアプリケーションはマルチユーザーとマルチ企業であり、現在、データレベルのセキュリティを確保するための最も効率的な/最良の方法を幅広く把握しようとしていますユーザーAがUserBのデータを見るのを妨げます。いろいろなコントローラ(製品、注文など)とモデルがある場合、ルートはProduct/Edit/1とOrder/Edit/1のようなものです。しかし、ユーザーが各自のデータを見るためにルートを変更できないようにするためには、各サービスレイヤ/ dbレイヤーコールで、特定のプロダクトキー/オーダーキーが認証されたユーザーに属することを確認する必要がありますか?これが最善の選択ですか、それとももっと優雅なものが欠けていますか?MVC3マルチユーザーデータレベルのセキュリティ

編集更新

以下オムリの回答からは、最初のリンクは、実際にhereへのリンクがあります。アクセスレベルのセキュリティを実現するさまざまな方法について言及していますが、これは私が人々の意見を知りたいことだと思います。私はこのような何かを行う必要があります。

public class ProductController 
{ 
    public ActionResult Edit(int id) 
    { 
     if (_productService.CanUserEdit(id, userID)) 
     { 
      _productService.Save(id); 
     } 
     else 
     { 
      throw UnauthorizedException; 
     } 

     return RedirectToAction("Index"); 
    } 
} 

OR

public class ProductController 
{ 
    public ActionResult Edit(int id) 
    { 
     _productService.Save(id, userID); 

     return RedirectToAction("Index"); 
    } 
} 

public class ProductService 
{ 
    public void Save(int id, int userID) 
    { 
     if (CanUserEdit(id, userID)) 
     { 
      //DO SAVE 
     } 
    } 

    private CanUserEdit(int id, int userID) 
    { 
    } 
} 

は明らかにアクションがコントローラ内またはサービスレベルで行わだけかどうか、2つの実装の間に大きな違いはありません。サービスレベルは会社に基づいてオンザフライで変更されるので、最初のオプションを実行し、CanUserEdit機能を実装する共通基本クラスから各社の製品サービスを派生させる必要があります。

答えて

1

OnActionExecutingまたはAuthorizeAttributeの2つの一般的なアプローチと思われます。ここを参照してください: How to Extend/Architect the ASP.NET MVC 3 Authorize Attribute to Handle This Scenario

ASP.NET MVC 3はまた、あなたが明示的な属性宣言を必要とせずに、グローバルアクションフィルタを適用することができるようになり、グローバルアクションフィルタがあります。 http://blog.tallan.com/2011/02/04/global-action-filters-in-asp-net-mvc-3/

+0

オムリを、私が含まれるように、私のオリジナルのポストを更新しますあなたが投稿した最初のリンクからのリンクに基づいた詳細はほとんどありません。 – wigs