我刚开始为网站设置安全性,并且在为.NET MVC环境中所需的身份验证/授权类型找到正确的体系结构/设计/模式/最佳实践时遇到了困难。我甚至不知道怎么称呼它来做更多的研究。下面是我需要实现的一个例子。这叫什么?(我不认为这是多特南特。)
Joe在Grocery连锁店中为几家商店做库存工作。Joe是A商店的库存管理器(可以编辑项目),但只是B商店的库存管理员(只查看物品),无法访问商店C。
因此,如果乔试图编辑存储库A,他应该能够访问InventoryController中的InventoryController,但是如果他试图编辑存储库B或C,则不应该能够访问相同的ActionResult Edit。
对于这种情况,直截了当的身份或基于声明的授权是不够的(我不认为),但我不知道我需要做进一步研究的设计的“名称”。这个设计叫什么?
发布于 2015-02-12 16:57:39
它被称为对象级授权(也称为对象级安全性,也称为细粒度授权,等等)。基本上,权限是基于对象的“所有权”,或者更好地放在这个场景中,由对象拥有。您需要在商店和员工之间建立一个多到多的关系,其中包含一个角色/授予的有效负载。例如:
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-12 16:21:37
您可以将其设置为多租户系统。如果每个商店都是有自己用户目录的租户,那么Joe需要登录到存储A的不同目录,然后再登录存储B,并得到另一个指定的角色。
Joe将无法登录以存储C,因为他在该目录中没有帐户。
如果希望用户通过联邦系统进行身份验证,则需要在每个存储区设置一个角色,并分配用户来自哪个IdP的角色。
https://stackoverflow.com/questions/28481568
复制相似问题