【问题标题】:Users in Multiple Organizations with Different Roles具有不同角色的多个组织中的用户
【发布时间】:2015-04-13 10:20:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc security claims-based-identity asp.net-authorization


    【解决方案1】:

    这称为对象级授权(又名对象级安全性,又名细粒度授权等)。基本上,权限是基于对象的“所有权”,或者在这种情况下更好的说法是,由一个对象拥有。您需要在商店和员工之间建立多对多关系,并带有角色/授权的有效负载。例如:

    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

    【讨论】:

    • 谢谢你,克里斯。这让我开始走上正确的道路。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢@user18044。不幸的是,用户不想按商店登录。他们宁愿只选择一个下拉列表。
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2021-03-09
    • 2013-03-21
    • 2012-06-08
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多