它被称为对象级授权(又名对象级安全性,又名细粒度授权等)。基本上,权限是基于对象的“所有权”,或者在这种情况下更好的说法是,由一个对象拥有。您需要在商店和员工之间建立多对多关系,并带有角色/授权的有效负载。例如:
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
一个字符串来保持简单。您可以使用枚举,甚至可以使用也将持久保存在数据库中的实际类。或者,您可以绑定到一般用户的现有角色。由你决定。您可能还希望将其转换为自定义操作过滤器。