1

我有一个使用 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 

用户.IsInRole:

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

我对 ASP.NET 很陌生,所以我不确定从哪里开始。我应该以某种方式覆盖 SimpleMembership Role Provider,还是应该考虑编写自己的 Role 列、类等?围绕身份验证手动编码任何内容都会感觉不对......任何关于此的指针将不胜感激。

4

1 回答 1

3

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

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

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

于 2013-11-11T16:10:45.930 回答