具有不同角色的多个组织中的用户

时间:2015-02-12 15:39:05

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

我在为网站设置安全性方面相当新,并且无法在.NET MVC环境中找到我需要的身份验证/授权类型的正确架构/设计/模式/最佳实践。我甚至不知道该怎么称呼才能做更多的研究。以下是我需要实现的示例。这个叫什么? (我不认为它是多方的。)

Joe为Grocery Store连锁店中的几家商店提供库存。 Joe是商店A的库存管理员(可以编辑商品),但只是商店B的库存文员(仅查看商品),并且无权访问商店C.

如果Joe试图编辑商店A,那么Joe应该能够访问ActionResult Edit中的InventoryController,但如果他正在尝试,则应该无法访问相同的ActionResult Edit编辑商店B或C.

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

2 个答案:

答案 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来分配这些角色。