我在为网站设置安全性方面相当新,并且无法在.NET MVC环境中找到我需要的身份验证/授权类型的正确架构/设计/模式/最佳实践。我甚至不知道该怎么称呼才能做更多的研究。以下是我需要实现的示例。这个叫什么? (我不认为它是多方的。)
Joe为Grocery Store连锁店中的几家商店提供库存。 Joe是商店A的库存管理员(可以编辑商品),但只是商店B的库存文员(仅查看商品),并且无权访问商店C.
如果Joe试图编辑商店A,那么Joe应该能够访问ActionResult Edit
中的InventoryController
,但如果他正在尝试,则应该无法访问相同的ActionResult Edit
编辑商店B或C.
基于身份或声明的直接授权对于这种情况来说还不够(我不这么认为),但我不知道"名称"为了进一步研究我需要的设计。这个设计叫什么?
答案 0 :(得分:2)
它被称为对象级授权(又名对象级安全性,又称细粒度授权等)。基本上,权限基于对象的“所有权”,或者更好地放在这种情况下,拥有对象。您需要在商店和员工之间建立多对多关系,并使用角色/拨款的有效负载。例如:
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
作为字符串就可以保持简单。您可以使用枚举,甚至是也可以保留在数据库中的实际类。或者,您可以将用户的现有角色绑定到一般情况下。由你决定。您可能还希望将其转换为custom action filter。
答案 1 :(得分:1)
您可以将其设置为多租户系统。如果每个商店都是具有自己的用户目录的租户,则Joe需要登录到商店A的不同目录,然后登录商店B,并且将分配另一个角色。
Joe无法登录商店C,因为他在该目录中没有帐户。
如果您希望用户通过联合系统进行身份验证,则需要为每个商店设置一个角色,并根据用户来自哪个IdP来分配这些角色。