2

私が取り組んでいるアプリケーションはマルチユーザーおよび複数の会社であり、現在、データレベルのセキュリティを確保するための最も効率的/最良の方法を見つけようとして問題を抱えています。大まかに言えば、ユーザーAがユーザーBのデータを見るのを防ぎます。さまざまなコントローラー (製品、注文など) とモデルがある場合、ルートは製品/編集/1 と注文/編集/1 のようなものになります。ただし、ユーザーがルートを変更してお互いのデータを確認できないようにするために、サービス層/データベース層の呼び出しごとに、特定のプロダクト キー/オーダー キーが認証されたユーザーに属していることを確認する必要があるようです。これが最良の選択肢ですか、それとももっとエレガントなものがありませんか。

更新の編集

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

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

        return RedirectToAction("Index");
    }
}

また

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 機能を実装する共通の基本クラスから各会社の製品サービスを派生させる必要があると思います。これは変更されないためです。

4

1 に答える 1

1

OnActionExecutingまたはAuthorizeAttributeの2つの一般的なアプローチのようです。ここを参照してください: このシナリオを処理するためにASP.NETMVC3認証属性を拡張/設計する方法

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

于 2012-01-18T05:06:25.193 に答える