扩展SimpleMembership以支持多租户

时间:2013-11-09 01:30:40

标签: asp.net asp.net-mvc asp.net-mvc-4 simplemembership

我有一个使用SimpleMembership的多租户应用。我系统中的每个用户都链接到一个或多个租户。我只是通过向User模型(和租户)添加必填字段来扩展用户:

public class User{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public virtual ICollection<Tenant> Tenants { get; set; }
}

这很有效。但是现在我想让Roles成为特定于租户的,其中一些角色类型必须定义TenantId。这不像用户问题那么简单,因为以下每个都会受到影响:

添加角色,检查角色:

 if (!Roles.Privider.RoleExists("Moderator"))  // I now want to include TenantId here
        {
            roles.CreateRole("Moderator"); // and here
        }

使用提供商分配/检查角色:

    if (!Roles.IsUserInRole("Admin", "SystemAdministrator")) // and here
        {
            roles.AddUsersToRoles(new[] { "Admin" }, new[] { "SystemAdministrator" }); // and here
        }

角色属性:

 [System.Web.Http.Authorize(Roles = "SystemAdministrator")]
 public class AdminApiController : BaseApiController 

User.IsInRole:

 if (User.IsInRole("Administrator"))
            {

我是ASP.NET新手,所以我不知道从哪里开始。我应该以某种方式覆盖SimpleMembership角色提供者,还是应该考虑编写自己的角色列,类等?

表示非常感谢任何有关身份验证的指针

1 个答案:

答案 0 :(得分:3)

我实现这一点时遇到的第一个问题是使用AuthorizeAttribute,因为属性需要在编译时定义的常量信息。使用基于租户的方法,我认为在运行期间需要确定哪个租户需要确定。所以我要做的第一件事就是采用 Decoupling You Security Model From The Application Model With SimpleMembership 中本文所述的方法。现在,您使用资源和操作(将是静态的)来装饰此属性,并且可以配置在数据库中在运行时为资源/操作分配的角色。在添加租户时,这为您设计安全模型提供了更大的灵活性。

无法在SimpleMembership中更改除UserProfile表之外的任何内容的数据库模型(See this QA)。因此,如果不编写自己的成员资格提供程序,则无法将角色ID添加到角色中。如果您想坚持使用SimpleMembership,一种解决方案是在角色的命名约定中处理此问题,其中包括角色名称和租户名称或ID。例如,如果您有两个具有admin角色的租户,则您将拥有两个名为“Administrator_Tenant1”和“Administrator_Tenant2”的角色。如果您需要向分配角色的任何用户显示此信息,您可以通过删除租户ID /名称来清理名称。

如果这是一个新项目并且您不依赖于SimpleMembership,您可能希望查看使用Microsoft最新的名为ASP.NET Identity的会员系统。此成员资格系统取代了MVC 5中的SimpleMembership.ASP.NET身份可以轻松定制,您应该能够更改角色模型。有article on customizing ASP.NET Identity here