我有一个使用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] 删除。
我来说两句