Asp.net mvc 多个组织中具有不同角色的用户

Asp.net mvc 多个组织中具有不同角色的用户,asp.net-mvc,security,claims-based-identity,asp.net-authorization,Asp.net Mvc,Security,Claims Based Identity,Asp.net Authorization,我对为网站设置安全性相当陌生,在.NETMVC环境中,我很难找到正确的体系结构/设计/模式/最佳实践,以满足我需要的身份验证/授权类型。为了做更多的研究,我甚至不知道该怎么称呼它。下面是我需要实现的一个示例。这叫什么?(我不认为这是多重坦能。) 乔在一家杂货连锁店的几家商店做存货工作。Joe是门店A的库存经理(可以编辑商品),但只是门店B的库存文员(仅查看商品),无权访问门店C 因此,如果Joe试图编辑存储A,他应该能够访问InventoryController中的ActionResult Ed

我对为网站设置安全性相当陌生,在.NETMVC环境中,我很难找到正确的体系结构/设计/模式/最佳实践,以满足我需要的身份验证/授权类型。为了做更多的研究,我甚至不知道该怎么称呼它。下面是我需要实现的一个示例。这叫什么?(我不认为这是多重坦能。)

乔在一家杂货连锁店的几家商店做存货工作。Joe是门店A的库存经理(可以编辑商品),但只是门店B的库存文员(仅查看商品),无权访问门店C

因此,如果Joe试图编辑存储A,他应该能够访问
InventoryController
中的
ActionResult Edit
,但如果他试图编辑存储B或C,他不应该能够访问相同的
ActionResult Edit


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

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

Joe将无法登录到store C,因为他在该目录中没有帐户


如果希望用户通过联邦系统进行身份验证,则需要为每个存储设置一个角色,并根据用户来自哪个IdP来分配这些角色。

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

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; }
}

在这里,我通过将
Role
设置为一个字符串来简化事情。您可以使用一个枚举,甚至是一个实际的类,它也将被持久化到您的数据库中。或者,您也可以将现有角色与一般用户绑定在一起。这取决于你。你可能更愿意把它变成一个。谢谢你,克里斯。这让我走上了正确的道路。谢谢@user18044。不幸的是,用户不想登录每个商店。他们宁愿选择一个下拉列表。
if (!joe.Stores.Any(m => m.Store == storeA && m.Role == "Manager"))
{
    return new HttpUnauthorizedResult();
}