扩展SimpleMembership以支持多租户

抢夺

我有一个使用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列,类等?手动对身份验证周围的任何内容进行编码是错误的。对此的任何指导将不胜感激。

凯文·荣汉斯

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

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

如果这是一个新项目,并且您不受SimpleMembership的束缚,则可以考虑使用Microsoft最新的会员系统ASP.NET Identity该成员资格系统替代了MVC 5中的SimpleMembership。ASP.NETIdentity的创建易于定制,您应该可以更改角色模型。这里有一篇有关自定义ASP.NET身份文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章