From b8cb698dc20a5636c8cf9dc87c951488e55f81ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 18 Feb 2018 17:15:37 +0300 Subject: [PATCH] Multi-tenancy support for the Identity module. --- .../Pages/Account/Login.cshtml.cs | 2 +- .../Pages/Account/Register.cshtml.cs | 2 +- .../AspNetCore/Mvc/RazorPages/AbpPageModel.cs | 6 + .../Abp/Identity/IdentityRoleAppService.cs | 2 +- .../Abp/Identity/IdentityUserAppService.cs | 2 +- .../Volo/Abp/Identity/IdentityClaim.cs | 12 +- .../Volo/Abp/Identity/IdentityRole.cs | 15 +- .../Volo/Abp/Identity/IdentityRoleClaim.cs | 24 +- .../Volo/Abp/Identity/IdentityUser.cs | 16 +- .../Volo/Abp/Identity/IdentityUserClaim.cs | 9 +- .../Volo/Abp/Identity/IdentityUserLogin.cs | 26 +- .../Volo/Abp/Identity/IdentityUserRole.cs | 8 +- .../Volo/Abp/Identity/IdentityUserToken.cs | 13 +- ..._Identity_Entities_MultiTenant.Designer.cs | 265 ++++++++++++++++++ ...0410_Made_Identity_Entities_MultiTenant.cs | 78 ++++++ .../IdentityDbContextModelSnapshot.cs | 16 +- .../Volo/Abp/MultiTenancy/IMultiTenant.cs | 3 + .../Volo/Abp/TestApp/Domain/Person.cs | 2 - 18 files changed, 458 insertions(+), 43 deletions(-) create mode 100644 src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.Designer.cs create mode 100644 src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.cs diff --git a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index 1e57e7ba2f..90837ba20f 100644 --- a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -124,7 +124,7 @@ namespace Volo.Abp.Account.Web.Pages.Account { var emailAddress = info.Principal.FindFirstValue(ClaimTypes.Email); - var user = new IdentityUser(GuidGenerator.Create(), emailAddress); + var user = new IdentityUser(GuidGenerator.Create(), emailAddress, CurrentTenant.Id); CheckIdentityErrors(await _userManager.CreateAsync(user)); CheckIdentityErrors(await _userManager.SetEmailAsync(user, emailAddress)); diff --git a/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs b/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs index ba0928c0fd..eedf6ae26b 100644 --- a/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs +++ b/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs @@ -38,7 +38,7 @@ namespace Volo.Abp.Account.Web.Pages.Account throw new NotImplementedException(); } - var user = new IdentityUser(GuidGenerator.Create(), input.UserName); + var user = new IdentityUser(GuidGenerator.Create(), input.UserName, CurrentTenant.Id); var result = await _userManager.CreateAsync(user, input.Password); diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs index 7954091d6d..dccfa6aaa0 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs @@ -5,7 +5,9 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.AspNetCore.Mvc.Validation; using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; +using Volo.Abp.Session; using Volo.Abp.Uow; namespace Volo.Abp.AspNetCore.Mvc.RazorPages @@ -20,6 +22,10 @@ namespace Volo.Abp.AspNetCore.Mvc.RazorPages public ILoggerFactory LoggerFactory { get; set; } + public ICurrentUser CurrentUser { get; set; } + + public ICurrentTenant CurrentTenant { get; set; } + public IModelStateValidator ModelValidator { get; set; } protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; diff --git a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs index f6bee59fa8..fb7c6c7d8b 100644 --- a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs +++ b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs @@ -46,7 +46,7 @@ namespace Volo.Abp.Identity public async Task CreateAsync(IdentityRoleCreateDto input) { - var role = new IdentityRole(GuidGenerator.Create(), input.Name); + var role = new IdentityRole(GuidGenerator.Create(), input.Name, CurrentTenant.Id); await _roleManager.CreateAsync(role); await CurrentUnitOfWork.SaveChangesAsync(); diff --git a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs index c660c614ac..44bcf08856 100644 --- a/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs +++ b/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs @@ -36,7 +36,7 @@ namespace Volo.Abp.Identity public async Task CreateAsync(IdentityUserCreateDto input) { - var user = new IdentityUser(GuidGenerator.Create(), input.UserName); + var user = new IdentityUser(GuidGenerator.Create(), input.UserName, CurrentTenant.Id); CheckIdentityErrors(await _userManager.CreateAsync(user, input.Password)); await UpdateUserByInput(user, input); diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaim.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaim.cs index 5114d64446..d64218a68f 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaim.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaim.cs @@ -2,11 +2,14 @@ using System.Security.Claims; using JetBrains.Annotations; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { - public abstract class IdentityClaim : Entity + public abstract class IdentityClaim : Entity, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the claim type for this claim. /// @@ -22,19 +25,20 @@ namespace Volo.Abp.Identity } - protected internal IdentityClaim(Guid id, [NotNull] Claim claim) - : this(id, claim.Type, claim.Value) + protected internal IdentityClaim(Guid id, [NotNull] Claim claim, Guid? tenantId) + : this(id, claim.Type, claim.Value, tenantId) { } - protected internal IdentityClaim(Guid id, [NotNull] string claimType, string claimValue) + protected internal IdentityClaim(Guid id, [NotNull] string claimType, string claimValue, Guid? tenantId) { Check.NotNull(claimType, nameof(claimType)); Id = id; ClaimType = claimType; ClaimValue = claimValue; + TenantId = tenantId; } /// diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs index 79ce254477..7b720862b0 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs @@ -5,14 +5,17 @@ using System.Security.Claims; using JetBrains.Annotations; using Volo.Abp.Domain.Entities; using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { /// /// Represents a role in the identity system /// - public class IdentityRole : AggregateRoot, IHasConcurrencyStamp + public class IdentityRole : AggregateRoot, IHasConcurrencyStamp, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the name for this role. /// @@ -38,17 +41,13 @@ namespace Volo.Abp.Identity /// protected IdentityRole() { } - /// - /// Initializes a new instance of . - /// - /// Role id. - /// The role name. - public IdentityRole(Guid id, [NotNull] string name) + public IdentityRole(Guid id, [NotNull] string name, Guid? tenantId = null) { Check.NotNull(name, nameof(name)); Id = id; Name = name; + TenantId = tenantId; NormalizedName = name.ToUpperInvariant(); ConcurrencyStamp = Guid.NewGuid().ToString(); @@ -60,7 +59,7 @@ namespace Volo.Abp.Identity Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claim, nameof(claim)); - Claims.Add(new IdentityRoleClaim(guidGenerator.Create(), Id, claim)); + Claims.Add(new IdentityRoleClaim(guidGenerator.Create(), Id, claim, TenantId)); } public virtual void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable claims) diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleClaim.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleClaim.cs index 716d5b52b6..70cf33b3d5 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleClaim.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleClaim.cs @@ -19,14 +19,30 @@ namespace Volo.Abp.Identity } - protected internal IdentityRoleClaim(Guid id, Guid roleId, [NotNull] Claim claim) - : base(id, claim) + protected internal IdentityRoleClaim( + Guid id, + Guid roleId, + [NotNull] Claim claim, + Guid? tenantId) + : base( + id, + claim, + tenantId) { RoleId = roleId; } - protected internal IdentityRoleClaim(Guid id, Guid roleId, [NotNull] string claimType, string claimValue) - : base(id, claimType, claimValue) + protected internal IdentityRoleClaim( + Guid id, + Guid roleId, + [NotNull] string claimType, + string claimValue, + Guid? tenantId) + : base( + id, + claimType, + claimValue, + tenantId) { RoleId = roleId; } diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs index 4cdec69935..8e7f79cc35 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs @@ -7,11 +7,14 @@ using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; using Volo.Abp.Domain.Entities; using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { - public class IdentityUser : AggregateRoot, IHasConcurrencyStamp + public class IdentityUser : AggregateRoot, IHasConcurrencyStamp, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the user name for this user. /// @@ -116,11 +119,12 @@ namespace Volo.Abp.Identity } - public IdentityUser(Guid id, [NotNull] string userName) + public IdentityUser(Guid id, [NotNull] string userName, Guid? tenantId = null) { Check.NotNull(userName, nameof(userName)); Id = id; + TenantId = tenantId; UserName = userName; NormalizedUserName = userName.ToUpperInvariant(); ConcurrencyStamp = Guid.NewGuid().ToString(); @@ -141,7 +145,7 @@ namespace Volo.Abp.Identity return; } - Roles.Add(new IdentityUserRole(Id, roleId)); + Roles.Add(new IdentityUserRole(Id, roleId, TenantId)); } public virtual void RemoveRole(Guid roleId) @@ -168,7 +172,7 @@ namespace Volo.Abp.Identity Check.NotNull(guidGenerator, nameof(guidGenerator)); Check.NotNull(claim, nameof(claim)); - Claims.Add(new IdentityUserClaim(guidGenerator.Create(), Id, claim)); + Claims.Add(new IdentityUserClaim(guidGenerator.Create(), Id, claim, TenantId)); } public virtual void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable claims) @@ -215,7 +219,7 @@ namespace Volo.Abp.Identity { Check.NotNull(login, nameof(login)); - Logins.Add(new IdentityUserLogin(Id, login)); + Logins.Add(new IdentityUserLogin(Id, login, TenantId)); } public virtual void RemoveLogin([NotNull] string loginProvider, [NotNull] string providerKey) @@ -237,7 +241,7 @@ namespace Volo.Abp.Identity var token = FindToken(loginProvider, name); if (token == null) { - Tokens.Add(new IdentityUserToken(Id, loginProvider, name, value)); + Tokens.Add(new IdentityUserToken(Id, loginProvider, name, value, TenantId)); } else { diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserClaim.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserClaim.cs index 655f95f637..d302beb7c2 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserClaim.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserClaim.cs @@ -19,15 +19,14 @@ namespace Volo.Abp.Identity } - protected internal IdentityUserClaim(Guid id, Guid userId, [NotNull] Claim claim) - : base(id, claim) + protected internal IdentityUserClaim(Guid id, Guid userId, [NotNull] Claim claim, Guid? tenantId) + : base(id, claim, tenantId) { UserId = userId; - } - protected internal IdentityUserClaim(Guid id, Guid userId, [NotNull] string claimType, string claimValue) - : base(id, claimType, claimValue) + protected internal IdentityUserClaim(Guid id, Guid userId, [NotNull] string claimType, string claimValue, Guid? tenantId) + : base(id, claimType, claimValue, tenantId) { UserId = userId; } diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLogin.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLogin.cs index 609a3b101a..f0747708e6 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLogin.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLogin.cs @@ -2,14 +2,17 @@ using System; using JetBrains.Annotations; using Microsoft.AspNetCore.Identity; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { /// /// Represents a login and its associated provider for a user. /// - public class IdentityUserLogin : Entity + public class IdentityUserLogin : Entity, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the of the primary key of the user associated with this login. /// @@ -35,7 +38,12 @@ namespace Volo.Abp.Identity } - protected internal IdentityUserLogin(Guid userId, [NotNull] string loginProvider, [NotNull] string providerKey, string providerDisplayName) + protected internal IdentityUserLogin( + Guid userId, + [NotNull] string loginProvider, + [NotNull] string providerKey, + string providerDisplayName, + Guid? tenantId) { Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(providerKey, nameof(providerKey)); @@ -44,12 +52,20 @@ namespace Volo.Abp.Identity LoginProvider = loginProvider; ProviderKey = providerKey; ProviderDisplayName = providerDisplayName; + TenantId = tenantId; } - protected internal IdentityUserLogin(Guid userId, [NotNull] UserLoginInfo login) - : this(userId, login.LoginProvider, login.ProviderKey, login.ProviderDisplayName) + protected internal IdentityUserLogin( + Guid userId, + [NotNull] UserLoginInfo login, + Guid? tenantId) + : this( + userId, + login.LoginProvider, + login.ProviderKey, + login.ProviderDisplayName, + tenantId) { - } public UserLoginInfo ToUserLoginInfo() diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserRole.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserRole.cs index daf1f4af6d..d684bded4e 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserRole.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserRole.cs @@ -1,13 +1,16 @@ using System; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { /// /// Represents the link between a user and a role. /// - public class IdentityUserRole : Entity + public class IdentityUserRole : Entity, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the primary key of the user that is linked to a role. /// @@ -23,10 +26,11 @@ namespace Volo.Abp.Identity } - protected internal IdentityUserRole(Guid userId, Guid roleId) + protected internal IdentityUserRole(Guid userId, Guid roleId, Guid? tenantId) { UserId = userId; RoleId = roleId; + TenantId = tenantId; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserToken.cs b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserToken.cs index 56045308d0..8950d47e28 100644 --- a/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserToken.cs +++ b/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserToken.cs @@ -1,14 +1,17 @@ using System; using JetBrains.Annotations; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.Identity { /// /// Represents an authentication token for a user. /// - public class IdentityUserToken : Entity + public class IdentityUserToken : Entity, IMultiTenant { + public virtual Guid? TenantId { get; protected set; } + /// /// Gets or sets the primary key of the user that the token belongs to. /// @@ -34,7 +37,12 @@ namespace Volo.Abp.Identity } - protected internal IdentityUserToken(Guid userId, [NotNull] string loginProvider, [NotNull] string name, string value) + protected internal IdentityUserToken( + Guid userId, + [NotNull] string loginProvider, + [NotNull] string name, + string value, + Guid? tenantId) { Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(name, nameof(name)); @@ -43,6 +51,7 @@ namespace Volo.Abp.Identity LoginProvider = loginProvider; Name = name; Value = value; + TenantId = tenantId; } } } \ No newline at end of file diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.Designer.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.Designer.cs new file mode 100644 index 0000000000..625d16cefb --- /dev/null +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.Designer.cs @@ -0,0 +1,265 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.Internal; +using System; +using Volo.Abp.Identity.EntityFrameworkCore; + +namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations +{ + [DbContext(typeof(IdentityDbContext))] + [Migration("20180218140410_Made_Identity_Entities_MultiTenant")] + partial class Made_Identity_Entities_MultiTenant + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.0.1-rtm-125") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("IdentityRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasMaxLength(1024); + + b.Property("RoleId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("IdentityRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasDefaultValue(0); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(256); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256); + + b.Property("PasswordHash") + .HasMaxLength(256); + + b.Property("PhoneNumber") + .HasMaxLength(16); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256); + + b.Property("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.ToTable("IdentityUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasMaxLength(1024); + + b.Property("TenantId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("IdentityUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(64); + + b.Property("ProviderDisplayName") + .HasMaxLength(128); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196); + + b.Property("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("IdentityUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.Property("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("IdentityUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("Name"); + + b.Property("TenantId"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("IdentityUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.cs new file mode 100644 index 0000000000..bf3bb866e0 --- /dev/null +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/20180218140410_Made_Identity_Entities_MultiTenant.cs @@ -0,0 +1,78 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System; +using System.Collections.Generic; + +namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations +{ + public partial class Made_Identity_Entities_MultiTenant : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityUserTokens", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityUsers", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityUserRoles", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityUserLogins", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityUserClaims", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityRoles", + nullable: true); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "IdentityRoleClaims", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityUserTokens"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityUsers"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityUserRoles"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityUserLogins"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityUserClaims"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityRoles"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "IdentityRoleClaims"); + } + } +} diff --git a/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/IdentityDbContextModelSnapshot.cs b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/IdentityDbContextModelSnapshot.cs index 54f5048a70..b998948e52 100644 --- a/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/IdentityDbContextModelSnapshot.cs +++ b/src/Volo.Abp.Identity.EntityFrameworkCore/Migrations/IdentityDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.0.0-rtm-26452") + .HasAnnotation("ProductVersion", "2.0.1-rtm-125") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => @@ -36,6 +36,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations .IsRequired() .HasMaxLength(256); + b.Property("TenantId"); + b.HasKey("Id"); b.HasIndex("NormalizedName"); @@ -57,6 +59,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations b.Property("RoleId"); + b.Property("TenantId"); + b.HasKey("Id"); b.HasIndex("RoleId"); @@ -112,6 +116,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations .IsRequired() .HasMaxLength(256); + b.Property("TenantId"); + b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() .HasDefaultValue(false); @@ -141,6 +147,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations b.Property("ClaimValue") .HasMaxLength(1024); + b.Property("TenantId"); + b.Property("UserId"); b.HasKey("Id"); @@ -164,6 +172,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations .IsRequired() .HasMaxLength(196); + b.Property("TenantId"); + b.HasKey("UserId", "LoginProvider"); b.HasIndex("LoginProvider", "ProviderKey"); @@ -177,6 +187,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations b.Property("RoleId"); + b.Property("TenantId"); + b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId", "UserId"); @@ -193,6 +205,8 @@ namespace Volo.Abp.Identity.EntityFrameworkCore.Migrations b.Property("Name"); + b.Property("TenantId"); + b.Property("Value"); b.HasKey("UserId", "LoginProvider", "Name"); diff --git a/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenant.cs b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenant.cs index b80bc9304a..1cc450128a 100644 --- a/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenant.cs +++ b/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenant.cs @@ -4,6 +4,9 @@ namespace Volo.Abp.MultiTenancy { public interface IMultiTenant { + /// + /// Id of the related tenant. + /// Guid? TenantId { get; } } } diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs index 7754f16cda..553ca30abd 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs @@ -1,8 +1,6 @@ using System; using System.Collections.ObjectModel; -using Volo.Abp.Application.Services; using Volo.Abp.Domain.Entities; -using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; namespace Volo.Abp.TestApp.Domain