4

Web サイトのセキュリティを設定するのはかなり初めてで、.NET MVC 環境で必要な認証/承認の種類に適したアーキテクチャ/設計/パターン/ベスト プラクティスを見つけるのに苦労しています。さらに調査を行うために、それを何と呼ぶべきかさえわかりません。以下は、私が実装する必要があるものの例です。これは何と呼ばれていますか?(マルチテナントではないと思います。)

ジョーは、食料品店チェーンのいくつかの店舗の棚卸作業を行っています。Joe は、店舗 A の在庫管理者 (アイテムの編集が可能) ですが、店舗 B の在庫係 (アイテムの表示のみ) であり、店舗 C へのアクセス権はありません。

したがって、Joe は、ストア A を編集しようとしActionResult Editている場合は にアクセスできるはずですが、ストア B または C を編集しようとしている場合はInventoryControllerアクセスできないはずです。ActionResult Edit

このシナリオでは、単純な ID またはクレーム ベースの承認では不十分ですが (そうは思いません)、さらに調査を行うために必要な設計の "名前" がわかりません。このデザインは何と呼ばれていますか?

4

2 に答える 2

3

これは、オブジェクト レベルの承認と呼ばれます (オブジェクト レベルのセキュリティ、きめ細かい承認など)。基本的に、アクセス許可はオブジェクトの「所有権」に基づいています。このシナリオでは、オブジェクトによって所有されていることをより適切に表現できます。役割/許可のペイロードを使用して、店舗と従業員の間に多対多の関係を設定する必要があります。例えば:

public class StoreEmployee
{
    [Key, Column(Order = 1)]
    [ForeignKey("Store")]
    public int StoreId { get; set; }
    public virtual Store Store { get; set; }

    [Key, Column(Order = 2)]
    [ForeignKey("Employee")]
    public int EmployeeId { get; set; }
    public virtual Employee Employee { get; set; }

    public string Role { get; set; }
}

public class Store
{
    ...
    public virtual ICollection<StoreEmployee> Employees { get; set; }
}

public class Employee
{
    ...
    public virtual ICollection<StoreEmployee> Stores { get; set; }
}

これにより、アクションでこの関係を使用して、ユーザーがアクセスできるかどうかを確認できます。

if (!joe.Stores.Any(m => m.Store == storeA && m.Role == "Manager"))
{
    return new HttpUnauthorizedResult();
}

ここでは、文字列を作成するだけで物事を単純に保ちましRoleた。列挙型を使用することも、データベースに永続化される実際のクラスを使用することもできます。または、一般的なユーザーの既存の役割に結び付けることができます。それはあなた次第です。また、それをカスタム アクション フィルターに変換することもできます。

于 2015-02-12T16:57:39.583 に答える