4

我对为网站设置安全性还很陌生,并且在为 .NET MVC 环境中需要的身份验证/授权类型找到正确的架构/设计/模式/最佳实践时遇到了麻烦。我什至不知道该怎么称呼它才能进行更多研究。下面是我需要实现的示例。这个叫什么?(我不认为它是多租户的。)

乔为一家杂货店连锁店的几家商店处理库存。Joe 是商店 A 的库存经理(可以编辑商品),但只是商店 B 的库存文员(仅查看商品),无权访问商店 C。

因此,如果 Joe 尝试编辑 Store A,他应该能够访问ActionResult Editin the ,但如果他尝试编辑 Store B 或 C InventoryController,则应该无法访问相同的内容。ActionResult Edit

对于这种情况,直接的基于身份或声明的授权是不够的(我不认为),但我不知道我需要做进一步研究的设计的“名称”。这种设计叫什么?

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 回答
1

您可以将其设置为多租户系统。如果每个商店都是拥有自己用户目录的租户,那么 Joe 需要为商店 A 登录到不同的目录,然后为商店 B 登录,并获得分配的另一个角色。

Joe 将无法登录存储 C,因为他在该目录中没有帐户。

如果您希望用户通过联合系统进行身份验证,您需要为每个商店设置一个角色,并根据用户来自哪个 IdP 来分配这些角色。

于 2015-02-12T16:21:37.363 回答