【问题标题】:Extending SimpleMembership to support Multi-Tenancy扩展 SimpleMembership 以支持多租户
【发布时间】:2013-11-09 01:30:39
【问题描述】:

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

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

这很好用。但是现在我想让角色是特定于租户的,其中某些角色类型必须定义一个 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 Role Provider,还是应该考虑编写自己的 Role 列、类等?围绕身份验证手动编码任何内容都会感觉不对...任何关于此的指针将不胜感激。

【问题讨论】:

  • 您能否详细说明一下。 “但现在我想让角色特定于租户,其中某些角色类型必须定义 TenantId。”是什么意思?尤其是“某些角色类型必须定义 TenantId”是什么意思。您是否希望角色具有指定的租户 ID?
  • @Raj - 是的,每个角色都应该有一个租户 ID。我能想到的一个例外是“租户管理员”角色,但这是一个我以后可以弄清楚的例外。

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


【解决方案1】:

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

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

如果这是一个新项目并且您没有绑定到 SimpleMembership,您可能希望使用 Microsoft 最新的会员系统 ASP.NET Identity。这个成员系统取代了 MVC 5 中的 SimpleMembership。ASP.NET 身份被构建为易于定制,您应该能够更改角色模型。有一个article on customizing ASP.NET Identity here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多