From e1c7ce827d0f23dcc5e36ff19cd4a2f184224e5a Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 2 Jul 2020 16:43:18 +0800 Subject: [PATCH 01/55] Update the package and pass the build. --- .../Volo.Abp.IdentityServer.Domain.csproj | 4 +- .../IdentityServer/ApiResources/ApiScope.cs | 17 +++--- .../ApiResources/IApiResourceRepository.cs | 6 +- .../ApiResources/IApiScopeeRepository.cs | 16 +++++ .../AbpResourceOwnerPasswordValidator.cs | 10 +--- .../Grants/IPersistentGrantRepository.cs | 21 +++---- .../Grants/PersistedGrantStore.cs | 15 ++--- .../IIdentityResourceRepository.cs | 4 +- .../IdentityServerAutoMapperProfile.cs | 2 +- .../Volo/Abp/IdentityServer/ResourceStore.cs | 60 +++++++++++++------ ...IdentityServerEfCoreQueryableExtensions.cs | 17 +++++- .../ApiResources/ApiResourceRepository.cs | 18 +++--- .../ApiResources/ApiScopeRepository.cs | 29 +++++++++ .../Grants/PersistedGrantRepository.cs | 53 +++++++++------- .../IdentityResourceRepository.cs | 4 +- .../MongoDB/MongoApiResourceRepository.cs | 7 ++- .../MongoIdentityResourceRepository.cs | 2 +- .../MongoDB/MongoPersistedGrantRepository.cs | 41 ++++++++++++- .../Clients/IdentityResourceStore_Tests.cs | 21 +++---- .../Clients/PersistentGrant_Tests.cs | 22 +++++-- .../ApiResourceRepository_Tests.cs | 2 +- .../IdentityResourceRepository_Tests.cs | 2 +- .../PersistentGrantRepository_Tests.cs | 2 +- 23 files changed, 256 insertions(+), 119 deletions(-) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj index 0fbb06c694..18a73a1a67 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj @@ -25,8 +25,8 @@ - - + + diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs index c54caea3a9..1d22dec3dc 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs @@ -25,6 +25,8 @@ namespace Volo.Abp.IdentityServer.ApiResources public virtual List UserClaims { get; protected set; } + public virtual Dictionary Properties { get; protected set; } + protected ApiScope() { @@ -36,12 +38,12 @@ namespace Volo.Abp.IdentityServer.ApiResources } protected internal ApiScope( - Guid apiResourceId, - [NotNull] string name, - string displayName = null, - string description = null, - bool required = false, - bool emphasize = false, + Guid apiResourceId, + [NotNull] string name, + string displayName = null, + string description = null, + bool required = false, + bool emphasize = false, bool showInDiscoveryDocument = true) { Check.NotNull(name, nameof(name)); @@ -55,6 +57,7 @@ namespace Volo.Abp.IdentityServer.ApiResources ShowInDiscoveryDocument = showInDiscoveryDocument; UserClaims = new List(); + Properties = new Dictionary(); } public virtual void AddUserClaim([NotNull] string type) @@ -82,4 +85,4 @@ namespace Volo.Abp.IdentityServer.ApiResources return new object[] { ApiResourceId, Name }; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index 988cd8c4a6..af1dcd6e36 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -8,8 +8,8 @@ namespace Volo.Abp.IdentityServer.ApiResources { public interface IApiResourceRepository : IBasicRepository { - Task FindByNameAsync( - string name, + Task> FindByNameAsync( + string[] apiResourceNames, bool includeDetails = true, CancellationToken cancellationToken = default ); @@ -40,4 +40,4 @@ namespace Volo.Abp.IdentityServer.ApiResources CancellationToken cancellationToken = default ); } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs new file mode 100644 index 0000000000..184b8d1b67 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.IdentityServer.ApiResources +{ + public interface IApiScopeRepository : IBasicRepository + { + Task> GetListByNameAsync( + string[] scopeNames, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs index e45df9b3f7..c4169e367f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpResourceOwnerPasswordValidator.cs @@ -21,7 +21,6 @@ namespace Volo.Abp.IdentityServer.AspNetIdentity public class AbpResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { protected SignInManager SignInManager { get; } - protected IEventService Events { get; } protected UserManager UserManager { get; } protected ILogger> Logger { get; } protected IStringLocalizer Localizer { get; } @@ -29,13 +28,11 @@ namespace Volo.Abp.IdentityServer.AspNetIdentity public AbpResourceOwnerPasswordValidator( UserManager userManager, SignInManager signInManager, - IEventService events, - ILogger> logger, + ILogger> logger, IStringLocalizer localizer) { UserManager = userManager; SignInManager = signInManager; - Events = events; Logger = logger; Localizer = localizer; } @@ -59,7 +56,6 @@ namespace Volo.Abp.IdentityServer.AspNetIdentity var sub = await UserManager.GetUserIdAsync(user); Logger.LogInformation("Credentials validated for username: {username}", context.UserName); - await Events.RaiseAsync(new UserLoginSuccessEvent(context.UserName, sub, context.UserName, interactive: false)); var additionalClaims = new List(); @@ -76,26 +72,22 @@ namespace Volo.Abp.IdentityServer.AspNetIdentity else if (result.IsLockedOut) { Logger.LogInformation("Authentication failed for username: {username}, reason: locked out", context.UserName); - await Events.RaiseAsync(new UserLoginFailureEvent(context.UserName, "locked out", interactive: false)); errorDescription = Localizer["UserLockedOut"]; } else if (result.IsNotAllowed) { Logger.LogInformation("Authentication failed for username: {username}, reason: not allowed", context.UserName); - await Events.RaiseAsync(new UserLoginFailureEvent(context.UserName, "not allowed", interactive: false)); errorDescription = Localizer["LoginIsNotAllowed"]; } else { Logger.LogInformation("Authentication failed for username: {username}, reason: invalid credentials", context.UserName); - await Events.RaiseAsync(new UserLoginFailureEvent(context.UserName, "invalid credentials", interactive: false)); errorDescription = Localizer["InvalidUserNameOrPassword"]; } } else { Logger.LogInformation("No user found matching username: {username}", context.UserName); - await Events.RaiseAsync(new UserLoginFailureEvent(context.UserName, "invalid username", interactive: false)); errorDescription = Localizer["InvalidUsername"]; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/IPersistentGrantRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/IPersistentGrantRepository.cs index 65cfabd7e7..6642440234 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/IPersistentGrantRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/IPersistentGrantRepository.cs @@ -8,6 +8,12 @@ namespace Volo.Abp.IdentityServer.Grants { public interface IPersistentGrantRepository : IBasicRepository { + Task> GetListAsync( + string subjectId, + string sessionId, + string clientId, + string type, bool includeDetails = false, CancellationToken cancellationToken = default); + Task FindByKeyAsync( string key, CancellationToken cancellationToken = default @@ -25,16 +31,11 @@ namespace Volo.Abp.IdentityServer.Grants ); Task DeleteAsync( - string subjectId, - string clientId, - CancellationToken cancellationToken = default - ); - - Task DeleteAsync( - string subjectId, - string clientId, - string type, + string subjectId = null, + string sessionId = null, + string clientId = null, + string type = null, CancellationToken cancellationToken = default ); } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrantStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrantStore.cs index 091989931b..19efb54a56 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrantStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrantStore.cs @@ -44,10 +44,10 @@ namespace Volo.Abp.IdentityServer.Grants return ObjectMapper.Map(persistedGrant); } - public virtual async Task> GetAllAsync(string subjectId) + public virtual async Task> GetAllAsync(PersistedGrantFilter filter) { - var persistedGrants = await PersistentGrantRepository.GetListBySubjectIdAsync(subjectId); - return persistedGrants.Select(x => ObjectMapper.Map(x)); + var persistedGrants = await PersistentGrantRepository.GetListAsync(filter.SubjectId, filter.SessionId, filter.ClientId, filter.Type); + return ObjectMapper.Map, List>(persistedGrants); } public virtual async Task RemoveAsync(string key) @@ -61,14 +61,9 @@ namespace Volo.Abp.IdentityServer.Grants await PersistentGrantRepository.DeleteAsync(persistedGrant); } - public virtual async Task RemoveAllAsync(string subjectId, string clientId) + public virtual async Task RemoveAllAsync(PersistedGrantFilter filter) { - await PersistentGrantRepository.DeleteAsync(subjectId, clientId); - } - - public virtual async Task RemoveAllAsync(string subjectId, string clientId, string type) - { - await PersistentGrantRepository.DeleteAsync(subjectId, clientId, type); + await PersistentGrantRepository.DeleteAsync(filter.SubjectId, filter.SessionId, filter.ClientId, filter.Type); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs index c8b350ce1a..4dd5472ea9 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.IdentityServer.IdentityResources { public interface IIdentityResourceRepository : IBasicRepository { - Task> GetListByScopesAsync( + Task> GetListByScopeNameAsync( string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default @@ -35,4 +35,4 @@ namespace Volo.Abp.IdentityServer.IdentityResources CancellationToken cancellationToken = default ); } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs index e576d9413e..502e3fa1e2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs @@ -37,7 +37,7 @@ namespace Volo.Abp.IdentityServer CreateMap(); - CreateMap(); + CreateMap(); CreateMap>() .ReverseMap(); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index d01884380d..6252be400c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using IdentityServer4.Models; @@ -6,8 +6,7 @@ using IdentityServer4.Stores; using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.ObjectMapping; -using ApiResource = IdentityServer4.Models.ApiResource; -using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; +using ApiScope = Volo.Abp.IdentityServer.ApiResources.ApiScope; namespace Volo.Abp.IdentityServer { @@ -15,45 +14,70 @@ namespace Volo.Abp.IdentityServer { protected IIdentityResourceRepository IdentityResourceRepository { get; } protected IApiResourceRepository ApiResourceRepository { get; } + protected IApiScopeRepository ApiScopeRepository { get; } protected IObjectMapper ObjectMapper { get; } public ResourceStore( - IIdentityResourceRepository identityResourceRepository, - IObjectMapper objectMapper, - IApiResourceRepository apiResourceRepository) + IIdentityResourceRepository identityResourceRepository, + IObjectMapper objectMapper, + IApiResourceRepository apiResourceRepository, + IApiScopeRepository apiScopeRepository) { IdentityResourceRepository = identityResourceRepository; ObjectMapper = objectMapper; ApiResourceRepository = apiResourceRepository; + ApiScopeRepository = apiScopeRepository; } - public virtual async Task> FindIdentityResourcesByScopeAsync(IEnumerable scopeNames) + /// + /// Gets identity resources by scope name. + /// + public virtual async Task> FindIdentityResourcesByScopeNameAsync(IEnumerable scopeNames) { - var resource = await IdentityResourceRepository.GetListByScopesAsync(scopeNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(resource); + var resource = await IdentityResourceRepository.GetListByScopeNameAsync(scopeNames.ToArray(), includeDetails: true); + return ObjectMapper.Map, List>(resource); } - public virtual async Task> FindApiResourcesByScopeAsync(IEnumerable scopeNames) + /// + /// Gets API scopes by scope name. + /// + public virtual async Task> FindApiScopesByNameAsync(IEnumerable scopeNames) + { + var scopes = await ApiScopeRepository.GetListByNameAsync(scopeNames.ToArray(), includeDetails: true); + return ObjectMapper.Map, List>(scopes); + } + + /// + /// Gets API resources by scope name. + /// + public virtual async Task> FindApiResourcesByScopeNameAsync(IEnumerable scopeNames) { var resources = await ApiResourceRepository.GetListByScopesAsync(scopeNames.ToArray(), includeDetails: true); - return resources.Select(x => ObjectMapper.Map(x)); + return ObjectMapper.Map, List>(resources); } - public virtual async Task FindApiResourceAsync(string name) + /// + /// Gets API resources by API resource name. + /// + public virtual async Task> FindApiResourcesByNameAsync(IEnumerable apiResourceNames) { - var resource = await ApiResourceRepository.FindByNameAsync(name); - return ObjectMapper.Map(resource); + var resources = await ApiResourceRepository.FindByNameAsync(apiResourceNames.ToArray(), includeDetails: true); + return ObjectMapper.Map, List>(resources); } - public virtual async Task GetAllResourcesAsync() + /// + /// Gets all resources. + /// + public virtual async Task GetAllResourcesAsync() { var identityResources = await IdentityResourceRepository.GetListAsync(includeDetails: true); var apiResources = await ApiResourceRepository.GetListAsync(includeDetails: true); + var apiScopes = await ApiScopeRepository.GetListAsync(includeDetails: true); return new Resources( - ObjectMapper.Map, IdentityServer4.Models.IdentityResource[]>(identityResources), - ObjectMapper.Map, ApiResource[]>(apiResources) - ); + ObjectMapper.Map, List>(identityResources), + ObjectMapper.Map, List>(apiResources), + ObjectMapper.Map, List>(apiScopes)); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs index 51b490fc47..a72cadb943 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs @@ -22,6 +22,18 @@ namespace Volo.Abp.IdentityServer .ThenInclude(s => s.UserClaims); } + public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) + { + if (!include) + { + return queryable; + } + + return queryable + .Include(x => x.UserClaims) + .Include(x => x.Properties); + } + public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) { if (!include) @@ -30,7 +42,8 @@ namespace Volo.Abp.IdentityServer } return queryable - .Include(x => x.UserClaims); + .Include(x => x.UserClaims) + .Include(x => x.Properties); } public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) @@ -52,4 +65,4 @@ namespace Volo.Abp.IdentityServer .Include(x => x.Properties); } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index d4fc77ede2..d12a8208c2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -19,17 +19,14 @@ namespace Volo.Abp.IdentityServer.ApiResources } - public virtual async Task FindByNameAsync( - string name, - bool includeDetails = true, + public async Task> FindByNameAsync(string[] apiResourceNames, bool includeDetails = true, CancellationToken cancellationToken = default) { var query = from apiResource in DbSet.IncludeDetails(includeDetails) - where apiResource.Name == name - select apiResource; + where apiResourceNames.Contains(apiResource.Name) + select apiResource; - return await query - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + return await query.ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetListByScopesAsync( @@ -45,7 +42,10 @@ namespace Volo.Abp.IdentityServer.ApiResources } public virtual async Task> GetListAsync( - string sorting, int skipCount, int maxResultCount, string filter, bool includeDetails = false, + string sorting, int skipCount, + int maxResultCount, + string filter, + bool includeDetails = false, CancellationToken cancellationToken = default) { return await DbSet @@ -96,4 +96,4 @@ namespace Volo.Abp.IdentityServer.ApiResources return GetQueryable().IncludeDetails(); } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs new file mode 100644 index 0000000000..dba7405a06 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.IdentityServer.EntityFrameworkCore; + +namespace Volo.Abp.IdentityServer.ApiResources +{ + public class ApiScopeRepository : EfCoreRepository, IApiScopeRepository + { + public ApiScopeRepository(IDbContextProvider dbContextProvider) : base( + dbContextProvider) + { + } + + public async Task> GetListByNameAsync(string[] scopeNames, bool includeDetails = false, + CancellationToken cancellationToken = default) + { + var query = from scope in DbSet.IncludeDetails(includeDetails) + where scopeNames.Contains(scope.Name) + select scope; + + return await query.ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs index 03b752d61b..7a0bf0fbba 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs @@ -12,19 +12,24 @@ namespace Volo.Abp.IdentityServer.Grants { public class PersistentGrantRepository : EfCoreRepository, IPersistentGrantRepository { - public PersistentGrantRepository(IDbContextProvider dbContextProvider) + public PersistentGrantRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) { } + public async Task> GetListAsync(string subjectId, string sessionId, string clientId, string type, bool includeDetails = false, + CancellationToken cancellationToken = default) + { + return await Filter(subjectId, sessionId, clientId, type) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + public virtual async Task FindByKeyAsync( string key, CancellationToken cancellationToken = default) { - return await DbSet - .FirstOrDefaultAsync(x => x.Key == key, GetCancellationToken(cancellationToken)) - ; + return await DbSet.FirstOrDefaultAsync(x => x.Key == key, GetCancellationToken(cancellationToken)); } public virtual async Task> GetListBySubjectIdAsync( @@ -37,7 +42,7 @@ namespace Volo.Abp.IdentityServer.Grants } public virtual async Task> GetListByExpirationAsync( - DateTime maxExpirationDate, + DateTime maxExpirationDate, int maxResultCount, CancellationToken cancellationToken = default) { @@ -48,27 +53,33 @@ namespace Volo.Abp.IdentityServer.Grants .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task DeleteAsync( - string subjectId, - string clientId, + public async Task DeleteAsync( + string subjectId = null, + string sessionId = null, + string clientId = null, + string type = null, CancellationToken cancellationToken = default) { - await DeleteAsync( - x => x.SubjectId == subjectId && x.ClientId == clientId, - cancellationToken: GetCancellationToken(cancellationToken) - ); + var persistedGrants = await Filter(subjectId, sessionId, clientId, type).ToListAsync(GetCancellationToken(cancellationToken)); + + foreach (var persistedGrant in persistedGrants) + { + DbSet.Remove(persistedGrant); + } } - public virtual async Task DeleteAsync( - string subjectId, - string clientId, - string type, - CancellationToken cancellationToken = default) + private IQueryable Filter( + string subjectId, + string sessionId, + string clientId, + string type) { - await DeleteAsync( - x => x.SubjectId == subjectId && x.ClientId == clientId && x.Type == type, - cancellationToken: GetCancellationToken(cancellationToken) - ); + //IDS TODO: add SessionId to entity + return DbSet + .WhereIf(!subjectId.IsNullOrWhiteSpace(), x => x.SubjectId == subjectId) + // .WhereIf(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .WhereIf(!type.IsNullOrWhiteSpace(), x => x.Type == type); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs index faed5fb67a..e86732c1e5 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -19,7 +19,7 @@ namespace Volo.Abp.IdentityServer.IdentityResources } - public virtual async Task> GetListByScopesAsync( + public virtual async Task> GetListByScopeNameAsync( string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index d2c89f193c..de694a37c5 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -18,11 +18,12 @@ namespace Volo.Abp.IdentityServer.MongoDB { } - public virtual async Task FindByNameAsync(string name, bool includeDetails = true, CancellationToken cancellationToken = default) + public async Task> FindByNameAsync(string[] apiResourceNames, bool includeDetails = true, + CancellationToken cancellationToken = default) { return await GetMongoQueryable() - .Where(ar => ar.Name == name) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + .Where(ar => apiResourceNames.Contains(ar.Name)) + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetListByScopesAsync(string[] scopeNames, bool includeDetails = false, diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs index e166ee9ec5..533136ebb3 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoIdentityResourceRepository.cs @@ -40,7 +40,7 @@ namespace Volo.Abp.IdentityServer.MongoDB .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task> GetListByScopesAsync(string[] scopeNames, bool includeDetails = false, + public virtual async Task> GetListByScopeNameAsync(string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default) { return await GetMongoQueryable() diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs index e9b677453b..11559b7707 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs @@ -16,6 +16,13 @@ namespace Volo.Abp.IdentityServer.MongoDB { } + public async Task> GetListAsync(string subjectId, string sessionId, string clientId, string type, bool includeDetails = false, + CancellationToken cancellationToken = default) + { + return await Filter(subjectId, sessionId, clientId, type) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + public virtual async Task FindByKeyAsync(string key, CancellationToken cancellationToken = default) { @@ -27,8 +34,7 @@ namespace Volo.Abp.IdentityServer.MongoDB { return await GetMongoQueryable() .Where(x => x.SubjectId == subjectId) - .ToListAsync(GetCancellationToken(cancellationToken)) - ; + .ToListAsync(GetCancellationToken(cancellationToken)); } public virtual async Task> GetListByExpirationAsync(DateTime maxExpirationDate, int maxResultCount, @@ -41,6 +47,22 @@ namespace Volo.Abp.IdentityServer.MongoDB .ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task DeleteAsync( + string subjectId = null, + string sessionId = null, + string clientId = null, + string type = null, + CancellationToken cancellationToken = default) + { + var persistedGrants = await Filter(subjectId, sessionId, clientId, type) + .ToListAsync(GetCancellationToken(cancellationToken)); + + foreach (var persistedGrant in persistedGrants) + { + await DeleteAsync(persistedGrant, false, GetCancellationToken(cancellationToken)); + } + } + public virtual async Task DeleteAsync(string subjectId, string clientId, CancellationToken cancellationToken = default) { await DeleteAsync( @@ -56,5 +78,20 @@ namespace Volo.Abp.IdentityServer.MongoDB cancellationToken: GetCancellationToken(cancellationToken) ); } + + private IMongoQueryable Filter( + string subjectId, + string sessionId, + string clientId, + string type) + { + //IDS TODO: add SessionId to entity + return GetMongoQueryable() + .WhereIf(!subjectId.IsNullOrWhiteSpace(), x => x.SubjectId == subjectId) + // .WhereIf(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) + .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .WhereIf(!type.IsNullOrWhiteSpace(), x => x.Type == type) + .As>(); + } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs index a313c2717f..ef74266285 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.IdentityServer.Clients public async Task FindApiResourceAsync_Should_Return_Null_If_Not_Found() { //Act - var resource = await _resourceStore.FindApiResourceAsync("non-existing-name"); + var resource = await _resourceStore.FindApiResourcesByNameAsync(new []{"non-existing-name"}); //Assert resource.ShouldBeNull(); @@ -32,7 +32,7 @@ namespace Volo.Abp.IdentityServer.Clients public async Task FindApiResourceAsync_Should_Return_If_Found() { //Act - var apiResource = await _resourceStore.FindApiResourceAsync("Test-ApiResource-Name-1"); + var apiResource = (await _resourceStore.FindApiResourcesByNameAsync(new []{"Test-ApiResource-Name-1"})).FirstOrDefault(); //Assert apiResource.ShouldNotBe(null); @@ -45,7 +45,7 @@ namespace Volo.Abp.IdentityServer.Clients public async Task FindApiResourcesByScopeAsync_Should_Return_If_Found() { //Act - var apiResources = (await _resourceStore.FindApiResourcesByScopeAsync(new List + var apiResources = (await _resourceStore.FindApiResourcesByScopeNameAsync(new List { "Test-ApiResource-ApiScope-Name-1" })).ToList(); @@ -60,17 +60,18 @@ namespace Volo.Abp.IdentityServer.Clients public async Task FindIdentityResourcesByScopeAsync_Should_Return_For_Given_Scopes() { //Act - var identityResourcesByScope = await _resourceStore.FindIdentityResourcesByScopeAsync(new List + var identityResourcesByScope = (await _resourceStore.FindApiResourcesByScopeNameAsync(new List { "Test-Identity-Resource-Name-1" - }); + })).ToArray(); //Assert - var resourcesByScope = identityResourcesByScope as IdentityResource[] ?? identityResourcesByScope.ToArray(); - resourcesByScope.Length.ShouldBe(1); - resourcesByScope.First().DisplayName.ShouldBe("Test-Identity-Resource-DisplayName-1"); - resourcesByScope.First().Description.ShouldBe("Test-Identity-Resource-Description-1"); - resourcesByScope.First().Required.ShouldBe(true); + identityResourcesByScope.Length.ShouldBe(1); + identityResourcesByScope.First().DisplayName.ShouldBe("Test-Identity-Resource-DisplayName-1"); + identityResourcesByScope.First().Description.ShouldBe("Test-Identity-Resource-Description-1"); + + //IDS TODO: + //identityResourcesByScope.First().Required.ShouldBe(true); } [Fact] diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs index 8e83f57c51..c5848ec7de 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs @@ -122,7 +122,10 @@ namespace Volo.Abp.IdentityServer.Clients public async Task GetAllAsync_Should_Get_All_PersistedGrants_For_A_Given_SubjectId() { //Act - var persistentGrants = await _persistedGrantStore.GetAllAsync("TestSubject"); + var persistentGrants = await _persistedGrantStore.GetAllAsync(new PersistedGrantFilter() + { + SubjectId = "TestSubject" + }); //Assert var persistedGrants = persistentGrants as PersistedGrant[] ?? persistentGrants.ToArray(); @@ -156,16 +159,27 @@ namespace Volo.Abp.IdentityServer.Clients public async Task RemoveAllAsync_Should_RemoveAll_PeristedGrants_For_A_Given_Subject_And_ClientId() { //Arrange - var persistedGrantsWithTestSubjectX = await _persistedGrantStore.GetAllAsync("TestSubject-X"); + var persistedGrantsWithTestSubjectX = await _persistedGrantStore.GetAllAsync(new PersistedGrantFilter() + { + SubjectId = "TestSubject-X" + }); var persistedGrantsWithTestSubjectXBeforeLength = persistedGrantsWithTestSubjectX.ToArray().Length; //Act - await _persistedGrantStore.RemoveAllAsync("TestSubject-X", "TestClientId-X"); + await _persistedGrantStore.RemoveAllAsync(new PersistedGrantFilter() + { + SubjectId = "TestSubject-X", + ClientId = "TestClientId-X" + }); //Assert persistedGrantsWithTestSubjectXBeforeLength.ShouldBe(2); - var persistedGrants = (await _persistedGrantStore.GetAllAsync("TestClientId-37")).ToArray(); + var persistedGrants = (await _persistedGrantStore.GetAllAsync(new PersistedGrantFilter() + { + SubjectId = "TestClientId-37" + })).ToArray(); + persistedGrants.ShouldNotBe(null); persistedGrants.Length.ShouldBe(0); } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs index b79114c59a..76fbba2504 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.IdentityServer [Fact] public async Task FindByNormalizedNameAsync() { - (await apiResourceRepository.FindByNameAsync("NewApiResource2")).ShouldNotBeNull(); + (await apiResourceRepository.FindByNameAsync(new []{"NewApiResource2"})).ShouldNotBeNull(); } [Fact] diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs index 3ab47dd7ce..5d41b0afd2 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.IdentityServer [Fact] public async Task GetListByScopesAsync() { - (await identityResourceRepository.GetListByScopesAsync(new[] { "", "NewIdentityResource2" })).Count.ShouldBe(1); + (await identityResourceRepository.GetListByScopeNameAsync(new[] { "", "NewIdentityResource2" })).Count.ShouldBe(1); } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs index 20f6674515..91e14bbace 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs @@ -48,7 +48,7 @@ namespace Volo.Abp.IdentityServer [Fact] public async Task DeleteBySubjectIdAndClientIdAndType() { - await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantClientId1", + await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantSessionId1", "PersistedGrantClientId1", "PersistedGrantClientId1"); var persistedGrants = await _persistentGrantRepository.GetListAsync(); From 85b775184cc49551746717aa081a23b5d12fdc83 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 2 Jul 2020 21:36:48 +0800 Subject: [PATCH 02/55] Update entities & fix unit tests. --- .../ApiResources/ApiScopeConsts.cs | 4 +- .../Devices/DeviceFlowCodesEto.cs | 6 +- .../AllowedSigningAlgorithmsConverter.cs | 37 ++++++++ .../ApiResources/ApiResource.cs | 48 +++++------ .../ApiResources/ApiResourceScope.cs | 38 +++++++++ .../{ApiSecret.cs => ApiResourceSecret.cs} | 20 ++--- .../IdentityServer/ApiResources/ApiScope.cs | 30 +++---- .../ApiResources/ApiScopeClaim.cs | 14 +-- .../ApiResources/ApiScopeProperty.cs | 39 +++++++++ .../Volo/Abp/IdentityServer/Clients/Client.cs | 9 +- .../IdentityServer/Devices/DeviceFlowCodes.cs | 6 +- .../IdentityServer/Grants/PersistedGrant.cs | 12 ++- .../IdentityResources/IdentityResource.cs | 32 +++---- ...ntityClaim.cs => IdentityResourceClaim.cs} | 8 +- .../IdentityResourceProperty.cs | 39 +++++++++ .../IdentityServerAutoMapperProfile.cs | 42 +++++++-- .../Volo/Abp/IdentityServer/ResourceStore.cs | 1 - ...IdentityServerEfCoreQueryableExtensions.cs | 15 +--- .../ApiResources/ApiResourceRepository.cs | 8 +- .../ApiResources/ApiScopeRepository.cs | 4 +- .../IIdentityServerDbContext.cs | 6 +- .../IdentityServerDbContext.cs | 6 +- ...yServerDbContextModelCreatingExtensions.cs | 85 +++++++++++++------ .../Grants/PersistedGrantRepository.cs | 3 +- .../MongoDB/MongoApiResourceRepository.cs | 2 +- .../MongoDB/MongoPersistedGrantRepository.cs | 11 +-- .../Clients/IdentityResourceStore_Tests.cs | 10 +-- .../AbpIdentityServerTestDataBuilder.cs | 7 +- .../AbpIdentityServerTestDataBuilder.cs | 5 +- .../PersistentGrantRepository_Tests.cs | 2 +- 30 files changed, 377 insertions(+), 172 deletions(-) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedSigningAlgorithmsConverter.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/{ApiSecret.cs => ApiResourceSecret.cs} (74%) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/{IdentityClaim.cs => IdentityResourceClaim.cs} (75%) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs index d52b953921..b61aa097f4 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs @@ -3,7 +3,5 @@ public class ApiScopeConsts { public const int NameMaxLength = 200; - public const int DisplayNameMaxLength = 200; - public const int DescriptionMaxLength = 1000; } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesEto.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesEto.cs index f82af68bbf..66fa1f6eff 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesEto.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesEto.cs @@ -13,10 +13,14 @@ namespace Volo.Abp.IdentityServer.Devices public string SubjectId { get; set; } + public string SessionId { get; set; } + public string ClientId { get; set; } + public string Description { get; set; } + public DateTime? Expiration { get; set; } public string Data { get; set; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedSigningAlgorithmsConverter.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedSigningAlgorithmsConverter.cs new file mode 100644 index 0000000000..ba4809feab --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedSigningAlgorithmsConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using AutoMapper; + +namespace Volo.Abp.IdentityServer +{ + public class AllowedSigningAlgorithmsConverter : + IValueConverter, string>, + IValueConverter> + { + public static AllowedSigningAlgorithmsConverter Converter = new AllowedSigningAlgorithmsConverter(); + + public string Convert(ICollection sourceMember, ResolutionContext context) + { + if (sourceMember == null || !sourceMember.Any()) + { + return null; + } + return sourceMember.Aggregate((x, y) => $"{x},{y}"); + } + + public ICollection Convert(string sourceMember, ResolutionContext context) + { + var list = new HashSet(); + if (!String.IsNullOrWhiteSpace(sourceMember)) + { + sourceMember = sourceMember.Trim(); + foreach (var item in sourceMember.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct()) + { + list.Add(item); + } + } + return list; + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs index d2b1a630d4..dc795fb09b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using IdentityServer4; @@ -18,9 +18,13 @@ namespace Volo.Abp.IdentityServer.ApiResources public virtual bool Enabled { get; set; } - public virtual List Secrets { get; protected set; } + public virtual string AllowedAccessTokenSigningAlgorithms { get; set; } - public virtual List Scopes { get; protected set; } + public virtual bool ShowInDiscoveryDocument { get; set; } = true; + + public virtual List Secrets { get; protected set; } + + public virtual List Scopes { get; protected set; } public virtual List UserClaims { get; protected set; } @@ -44,21 +48,21 @@ namespace Volo.Abp.IdentityServer.ApiResources Enabled = true; - Secrets = new List(); - Scopes = new List(); + Secrets = new List(); + Scopes = new List(); UserClaims = new List(); Properties = new Dictionary(); - Scopes.Add(new ApiScope(id, name, displayName, description)); + Scopes.Add(new ApiResourceScope(id, name)); } public virtual void AddSecret( - [NotNull] string value, + [NotNull] string value, DateTime? expiration = null, string type = IdentityServerConstants.SecretTypes.SharedSecret, string description = null) { - Secrets.Add(new ApiSecret(Id, value, expiration, type, description)); + Secrets.Add(new ApiResourceSecret(Id, value, expiration, type, description)); } public virtual void RemoveSecret([NotNull] string value, string type = IdentityServerConstants.SecretTypes.SharedSecret) @@ -66,22 +70,16 @@ namespace Volo.Abp.IdentityServer.ApiResources Secrets.RemoveAll(s => s.Value == value && s.Type == type); } - public virtual ApiSecret FindSecret([NotNull] string value, string type = IdentityServerConstants.SecretTypes.SharedSecret) + public virtual ApiResourceSecret FindSecret([NotNull] string value, string type = IdentityServerConstants.SecretTypes.SharedSecret) { return Secrets.FirstOrDefault(s => s.Type == type && s.Value == value); } - public virtual ApiScope AddScope( - [NotNull] string name, - string displayName = null, - string description = null, - bool required = false, - bool emphasize = false, - bool showInDiscoveryDocument = true) + public virtual ApiResourceScope AddScope([NotNull] string scope) { - var scope = new ApiScope(Id, name, displayName, description, required, emphasize, showInDiscoveryDocument); - Scopes.Add(scope); - return scope; + var apiResourceScope = new ApiResourceScope(Id, scope); + Scopes.Add(apiResourceScope); + return apiResourceScope; } public virtual void AddUserClaim([NotNull] string type) @@ -111,21 +109,17 @@ namespace Volo.Abp.IdentityServer.ApiResources public virtual void RemoveAllScopes() { - foreach (var scope in Scopes) - { - scope.RemoveAllUserClaims(); - } Scopes.Clear(); } - public virtual void RemoveScope(string name) + public virtual void RemoveScope(string scope) { - Scopes.RemoveAll(r => r.Name == name); + Scopes.RemoveAll(r => r.Scope == scope); } - public virtual ApiScope FindScope(string name) + public virtual ApiResourceScope FindScope(string scope) { - return Scopes.FirstOrDefault(r => r.Name == name); + return Scopes.FirstOrDefault(r => r.Scope == scope); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs new file mode 100644 index 0000000000..4da2beaa3f --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs @@ -0,0 +1,38 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.IdentityServer.ApiResources +{ + public class ApiResourceScope : Entity + { + public virtual Guid ApiResourceId { get; protected set; } + + public virtual string Scope { get; set; } + + protected ApiResourceScope() + { + + } + + public virtual bool Equals(Guid apiResourceId, [NotNull] string scope) + { + return ApiResourceId == apiResourceId && Scope == scope; + } + + protected internal ApiResourceScope( + Guid apiResourceId, + [NotNull] string scope) + { + Check.NotNull(scope, nameof(scope)); + + ApiResourceId = apiResourceId; + Scope = scope; + } + + public override object[] GetKeys() + { + return new object[] { ApiResourceId, Scope }; + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiSecret.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs similarity index 74% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiSecret.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs index e692183a71..dcc6b04768 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiSecret.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs @@ -4,11 +4,11 @@ using JetBrains.Annotations; namespace Volo.Abp.IdentityServer.ApiResources { - public class ApiSecret : Secret + public class ApiResourceSecret : Secret { public virtual Guid ApiResourceId { get; protected set; } - protected ApiSecret() + protected ApiResourceSecret() { } @@ -18,16 +18,16 @@ namespace Volo.Abp.IdentityServer.ApiResources return ApiResourceId == apiResourceId && Value == value && Type == type; } - protected internal ApiSecret( + protected internal ApiResourceSecret( Guid apiResourceId, - [NotNull] string value, - DateTime? expiration = null, - string type = IdentityServerConstants.SecretTypes.SharedSecret, + [NotNull] string value, + DateTime? expiration = null, + string type = IdentityServerConstants.SecretTypes.SharedSecret, string description = null ) : base( - value, - expiration, - type, + value, + expiration, + type, description) { ApiResourceId = apiResourceId; @@ -38,4 +38,4 @@ namespace Volo.Abp.IdentityServer.ApiResources return new object[] { ApiResourceId, Type, Value }; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs index 1d22dec3dc..8e8605afa1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs @@ -1,14 +1,14 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; -using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Entities.Auditing; namespace Volo.Abp.IdentityServer.ApiResources { - public class ApiScope : Entity + public class ApiScope : FullAuditedAggregateRoot { - public virtual Guid ApiResourceId { get; protected set; } + public virtual bool Enabled { get; set; } [NotNull] public virtual string Name { get; protected set; } @@ -25,44 +25,39 @@ namespace Volo.Abp.IdentityServer.ApiResources public virtual List UserClaims { get; protected set; } - public virtual Dictionary Properties { get; protected set; } + public virtual List Properties { get; protected set; } protected ApiScope() { } - public virtual bool Equals(Guid apiResourceId, [NotNull] string name) - { - return ApiResourceId == apiResourceId && Name == name; - } - protected internal ApiScope( - Guid apiResourceId, [NotNull] string name, string displayName = null, string description = null, bool required = false, bool emphasize = false, - bool showInDiscoveryDocument = true) + bool showInDiscoveryDocument = true, + bool enabled = true) { Check.NotNull(name, nameof(name)); - ApiResourceId = apiResourceId; Name = name; DisplayName = displayName ?? name; Description = description; Required = required; Emphasize = emphasize; ShowInDiscoveryDocument = showInDiscoveryDocument; + Enabled = enabled; UserClaims = new List(); - Properties = new Dictionary(); + Properties = new List(); } public virtual void AddUserClaim([NotNull] string type) { - UserClaims.Add(new ApiScopeClaim(ApiResourceId, Name, type)); + UserClaims.Add(new ApiScopeClaim(Id, Name, type)); } public virtual void RemoveAllUserClaims() @@ -79,10 +74,5 @@ namespace Volo.Abp.IdentityServer.ApiResources { return UserClaims.FirstOrDefault(r => r.Name == Name && r.Type == type); } - - public override object[] GetKeys() - { - return new object[] { ApiResourceId, Name }; - } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs index 729ff9c344..e4444cbc8c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.IdentityServer.ApiResources { public class ApiScopeClaim : UserClaim { - public Guid ApiResourceId { get; protected set; } + public Guid ApiScopeId { get; protected set; } [NotNull] public string Name { get; protected set; } @@ -15,23 +15,23 @@ namespace Volo.Abp.IdentityServer.ApiResources } - public virtual bool Equals(Guid apiResourceId, [NotNull] string name, [NotNull] string type) + public virtual bool Equals(Guid apiScopeId, [NotNull] string name, [NotNull] string type) { - return ApiResourceId == apiResourceId && Name == name && Type == type; + return ApiScopeId == apiScopeId && Name == name && Type == type; } - protected internal ApiScopeClaim(Guid apiResourceId, [NotNull] string name, [NotNull] string type) + protected internal ApiScopeClaim(Guid apiScopeId, [NotNull] string name, [NotNull] string type) : base(type) { Check.NotNull(name, nameof(name)); - ApiResourceId = apiResourceId; + ApiScopeId = apiScopeId; Name = name; } public override object[] GetKeys() { - return new object[] { ApiResourceId, Name, Type }; + return new object[] { ApiScopeId, Name, Type }; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs new file mode 100644 index 0000000000..38f34567a8 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs @@ -0,0 +1,39 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.IdentityServer.ApiResources +{ + public class ApiScopeProperty : Entity + { + public virtual Guid ApiScopeId { get; set; } + + public virtual string Key { get; set; } + + public virtual string Value { get; set; } + + protected ApiScopeProperty() + { + + } + + public virtual bool Equals(Guid apiScopeId, [NotNull] string key, string value) + { + return ApiScopeId == apiScopeId && Key == key && Value == value; + } + + protected internal ApiScopeProperty(Guid apiScopeId, [NotNull] string key, [NotNull] string value) + { + Check.NotNull(key, nameof(key)); + + ApiScopeId = apiScopeId; + Key = key; + Value = value; + } + + public override object[] GetKeys() + { + return new object[] { ApiScopeId, Key }; + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/Client.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/Client.cs index b7a53ad66f..82ba75a5fb 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/Client.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/Client.cs @@ -36,6 +36,8 @@ namespace Volo.Abp.IdentityServer.Clients public virtual bool AllowPlainTextPkce { get; set; } + public virtual bool RequireRequestObject { get; set; } + public virtual bool AllowAccessTokensViaBrowser { get; set; } public virtual string FrontChannelLogoutUri { get; set; } @@ -50,6 +52,8 @@ namespace Volo.Abp.IdentityServer.Clients public virtual int IdentityTokenLifetime { get; set; } + public virtual string AllowedIdentityTokenSigningAlgorithms { get; set; } + public virtual int AccessTokenLifetime { get; set; } public virtual int AuthorizationCodeLifetime { get; set; } @@ -118,8 +122,9 @@ namespace Volo.Abp.IdentityServer.Clients ProtocolType = IdentityServerConstants.ProtocolTypes.OpenIdConnect; RequireClientSecret = true; - RequireConsent = true; + RequireConsent = false; AllowRememberConsent = true; + RequirePkce = true; FrontChannelLogoutSessionRequired = true; BackChannelLogoutSessionRequired = true; IdentityTokenLifetime = 300; @@ -319,4 +324,4 @@ namespace Volo.Abp.IdentityServer.Clients return IdentityProviderRestrictions.FirstOrDefault(r => r.Provider == provider); } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Devices/DeviceFlowCodes.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Devices/DeviceFlowCodes.cs index 3961de57a2..c24452a08b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Devices/DeviceFlowCodes.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Devices/DeviceFlowCodes.cs @@ -11,8 +11,12 @@ namespace Volo.Abp.IdentityServer.Devices public virtual string SubjectId { get; set; } + public virtual string SessionId { get; set; } + public virtual string ClientId { get; set; } + public virtual string Description { get; set; } + public virtual DateTime? Expiration { get; set; } public virtual string Data { get; set; } @@ -28,4 +32,4 @@ namespace Volo.Abp.IdentityServer.Devices } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrant.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrant.cs index 4a2bccd456..1865ec748b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrant.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Grants/PersistedGrant.cs @@ -1,4 +1,4 @@ -using System; +using System; using Volo.Abp.Domain.Entities; namespace Volo.Abp.IdentityServer.Grants @@ -11,17 +11,23 @@ namespace Volo.Abp.IdentityServer.Grants public virtual string SubjectId { get; set; } + public virtual string SessionId { get; set; } + public virtual string ClientId { get; set; } + public virtual string Description { get; set; } + public virtual DateTime CreationTime { get; set; } public virtual DateTime? Expiration { get; set; } + public virtual DateTime? ConsumedTime { get; set; } + public virtual string Data { get; set; } protected PersistedGrant() { - + } public PersistedGrant(Guid id) @@ -29,4 +35,4 @@ namespace Volo.Abp.IdentityServer.Grants Id = id; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs index f5d6f6c39c..246e1ddf98 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs @@ -22,9 +22,9 @@ namespace Volo.Abp.IdentityServer.IdentityResources public virtual bool ShowInDiscoveryDocument { get; set; } - public virtual List UserClaims { get; set; } + public virtual List UserClaims { get; set; } - public virtual Dictionary Properties { get; set; } + public virtual List Properties { get; set; } protected IdentityResource() { @@ -32,13 +32,13 @@ namespace Volo.Abp.IdentityServer.IdentityResources } public IdentityResource( - Guid id, - [NotNull] string name, - string displayName = null, - string description = null, - bool enabled = true, - bool required = false, - bool emphasize = false, + Guid id, + [NotNull] string name, + string displayName = null, + string description = null, + bool enabled = true, + bool required = false, + bool emphasize = false, bool showInDiscoveryDocument = true) { Check.NotNull(name, nameof(name)); @@ -51,9 +51,9 @@ namespace Volo.Abp.IdentityServer.IdentityResources Required = required; Emphasize = emphasize; ShowInDiscoveryDocument = showInDiscoveryDocument; - - UserClaims = new List(); - Properties = new Dictionary(); + + UserClaims = new List(); + Properties = new List(); } public IdentityResource(Guid id, IdentityServer4.Models.IdentityResource resource) @@ -66,13 +66,13 @@ namespace Volo.Abp.IdentityServer.IdentityResources Required = resource.Required; Emphasize = resource.Emphasize; ShowInDiscoveryDocument = resource.ShowInDiscoveryDocument; - UserClaims = resource.UserClaims.Select(claimType => new IdentityClaim(id, claimType)).ToList(); - Properties = resource.Properties.ToDictionary(x => x.Key, x => x.Value); + UserClaims = resource.UserClaims.Select(claimType => new IdentityResourceClaim(id, claimType)).ToList(); + Properties = resource.Properties.Select(x => new IdentityResourceProperty(Id, x.Key, x.Value)).ToList(); } public virtual void AddUserClaim([NotNull] string type) { - UserClaims.Add(new IdentityClaim(Id, type)); + UserClaims.Add(new IdentityResourceClaim(Id, type)); } public virtual void RemoveAllUserClaims() @@ -85,7 +85,7 @@ namespace Volo.Abp.IdentityServer.IdentityResources UserClaims.RemoveAll(c => c.Type == type); } - public virtual IdentityClaim FindUserClaim(string type) + public virtual IdentityResourceClaim FindUserClaim(string type) { return UserClaims.FirstOrDefault(c => c.Type == type); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceClaim.cs similarity index 75% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityClaim.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceClaim.cs index 8b4a22b584..2bce3f66cf 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceClaim.cs @@ -3,11 +3,11 @@ using JetBrains.Annotations; namespace Volo.Abp.IdentityServer.IdentityResources { - public class IdentityClaim : UserClaim + public class IdentityResourceClaim : UserClaim { public virtual Guid IdentityResourceId { get; set; } - protected IdentityClaim() + protected IdentityResourceClaim() { } @@ -17,7 +17,7 @@ namespace Volo.Abp.IdentityServer.IdentityResources return IdentityResourceId == identityResourceId && Type == type; } - protected internal IdentityClaim(Guid identityResourceId, [NotNull] string type) + protected internal IdentityResourceClaim(Guid identityResourceId, [NotNull] string type) : base(type) { IdentityResourceId = identityResourceId; @@ -28,4 +28,4 @@ namespace Volo.Abp.IdentityServer.IdentityResources return new object[] { IdentityResourceId, Type }; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs new file mode 100644 index 0000000000..d351addfc2 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs @@ -0,0 +1,39 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.IdentityServer.IdentityResources +{ + public class IdentityResourceProperty : Entity + { + public virtual Guid IdentityResourceId { get; set; } + + public virtual string Key { get; set; } + + public virtual string Value { get; set; } + + protected IdentityResourceProperty() + { + + } + + public virtual bool Equals(Guid identityResourceId, [NotNull] string key) + { + return IdentityResourceId == identityResourceId && Key == key; + } + + protected internal IdentityResourceProperty(Guid identityResourceId, [NotNull] string key, [NotNull] string value) + { + Check.NotNull(key, nameof(key)); + + IdentityResourceId = identityResourceId; + Key = key; + Value = value; + } + + public override object[] GetKeys() + { + return new object[] { IdentityResourceId, Key }; + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs index 502e3fa1e2..17aae1b084 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs @@ -15,8 +15,6 @@ namespace Volo.Abp.IdentityServer { //TODO: Reverse maps will not used probably. Remove those will not used - CreateMap(); - CreateMap() .ConstructUsing(src => src.Origin) .ReverseMap() @@ -25,26 +23,53 @@ namespace Volo.Abp.IdentityServer CreateMap() .ForMember(dest => dest.ApiSecrets, opt => opt.MapFrom(src => src.Secrets)); + CreateMap(); + + //TODO: Why PersistedGrant mapping is in this profile? CreateMap().ReverseMap(); - CreateMap(); + CreateMap() + .ConstructUsing(src => new IdentityServer4.Models.IdentityResource()); + + CreateMap() + .ConstructUsing(x => x.Type) + .ReverseMap() + .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); + + CreateMap>() + .ReverseMap(); CreateMap() .ConstructUsing(src => src.Type) .ReverseMap() .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); - CreateMap(); + CreateMap() + .ConstructUsing(x => x.Scope) + .ReverseMap() + .ForMember(dest => dest.Scope, opt => opt.MapFrom(src => src)); - CreateMap(); + CreateMap>() + .ReverseMap(); + + CreateMap() + .ConstructUsing(x => x.Type) + .ReverseMap() + .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); + + CreateMap(MemberList.Destination) + .ConstructUsing(src => new IdentityServer4.Models.ApiScope()) + .ReverseMap(); CreateMap>() .ReverseMap(); CreateMap() .ForMember(dest => dest.ProtocolType, opt => opt.Condition(srs => srs != null)) - .ReverseMap(); + .ForMember(x => x.AllowedIdentityTokenSigningAlgorithms, opts => opts.ConvertUsing(AllowedSigningAlgorithmsConverter.Converter, x => x.AllowedIdentityTokenSigningAlgorithms)) + .ReverseMap() + .ForMember(x => x.AllowedIdentityTokenSigningAlgorithms, opts => opts.ConvertUsing(AllowedSigningAlgorithmsConverter.Converter, x => x.AllowedIdentityTokenSigningAlgorithms)); CreateMap() .ConstructUsing(src => src.Origin) @@ -60,6 +85,10 @@ namespace Volo.Abp.IdentityServer .ConstructUsing(src => new Claim(src.Type, src.Value)) .ReverseMap(); + CreateMap(MemberList.None) + .ConstructUsing(src => new IdentityServer4.Models.ClientClaim(src.Type, src.Value, ClaimValueTypes.String)) + .ReverseMap(); + CreateMap() .ConstructUsing(src => src.Scope) .ReverseMap() @@ -89,6 +118,7 @@ namespace Volo.Abp.IdentityServer CreateMap(); CreateMap(); CreateMap(); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index 6252be400c..975fc7f801 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -6,7 +6,6 @@ using IdentityServer4.Stores; using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.ObjectMapping; -using ApiScope = Volo.Abp.IdentityServer.ApiResources.ApiScope; namespace Volo.Abp.IdentityServer { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs index a72cadb943..6e47d461e4 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs @@ -18,20 +18,7 @@ namespace Volo.Abp.IdentityServer return queryable .Include(x => x.Secrets) .Include(x => x.UserClaims) - .Include(x => x.Scopes) - .ThenInclude(s => s.UserClaims); - } - - public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) - { - if (!include) - { - return queryable; - } - - return queryable - .Include(x => x.UserClaims) - .Include(x => x.Properties); + .Include(x => x.Scopes); } public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index d12a8208c2..4d0baf7702 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -35,7 +35,7 @@ namespace Volo.Abp.IdentityServer.ApiResources CancellationToken cancellationToken = default) { var query = from api in DbSet.IncludeDetails(includeDetails) - where api.Scopes.Any(x => scopeNames.Contains(x.Name)) + where api.Scopes.Any(x => scopeNames.Contains(x.Scope)) select api; return await query.ToListAsync(GetCancellationToken(cancellationToken)); @@ -74,18 +74,18 @@ namespace Volo.Abp.IdentityServer.ApiResources public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default) { - var scopeClaims = DbContext.Set().Where(sc => sc.ApiResourceId == id); + var scopeClaims = DbContext.Set().Where(sc => sc.ApiScopeId == id); foreach (var scopeClaim in scopeClaims) { DbContext.Set().Remove(scopeClaim); } - var scopes = DbContext.Set().Where(s => s.ApiResourceId == id); + var scopes = DbContext.Set().Where(s => s.ApiResourceId == id); foreach (var scope in scopes) { - DbContext.Set().Remove(scope); + DbContext.Set().Remove(scope); } await base.DeleteAsync(id, autoSave, cancellationToken); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs index dba7405a06..6df9f5b90a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs @@ -19,9 +19,7 @@ namespace Volo.Abp.IdentityServer.ApiResources public async Task> GetListByNameAsync(string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default) { - var query = from scope in DbSet.IncludeDetails(includeDetails) - where scopeNames.Contains(scope.Name) - select scope; + var query = from scope in DbSet where scopeNames.Contains(scope.Name) select scope; return await query.ToListAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs index 52ba7c8e6c..93624174f9 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs @@ -14,17 +14,17 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore { DbSet ApiResources { get; set; } - DbSet ApiSecrets { get; set; } + DbSet ApiSecrets { get; set; } DbSet ApiResourceClaims { get; set; } - DbSet ApiScopes { get; set; } + DbSet ApiScopes { get; set; } DbSet ApiScopeClaims { get; set; } DbSet IdentityResources { get; set; } - DbSet IdentityClaims { get; set; } + DbSet IdentityClaims { get; set; } DbSet Clients { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs index f63cd6bf1c..84ec1f802a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs @@ -14,17 +14,17 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore { public DbSet ApiResources { get; set; } - public DbSet ApiSecrets { get; set; } + public DbSet ApiSecrets { get; set; } public DbSet ApiResourceClaims { get; set; } - public DbSet ApiScopes { get; set; } + public DbSet ApiScopes { get; set; } public DbSet ApiScopeClaims { get; set; } public DbSet IdentityResources { get; set; } - public DbSet IdentityClaims { get; set; } + public DbSet IdentityClaims { get; set; } public DbSet Clients { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 8acb8a9539..54b91e9dcc 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -81,8 +81,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) { ClientRedirectUriConsts.RedirectUriMaxLengthValue = 300; - } - + } + b.Property(x => x.RedirectUri).HasMaxLength(ClientRedirectUriConsts.RedirectUriMaxLengthValue).IsRequired(); }); @@ -97,8 +97,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) { ClientPostLogoutRedirectUriConsts.PostLogoutRedirectUriMaxLengthValue = 300; - } - + } + b.Property(x => x.PostLogoutRedirectUri) .HasMaxLength(ClientPostLogoutRedirectUriConsts.PostLogoutRedirectUriMaxLengthValue) .IsRequired(); @@ -129,7 +129,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore { SecretConsts.ValueMaxLengthValue = 300; } - + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); @@ -195,9 +195,9 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) { - PersistedGrantConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. + PersistedGrantConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. } - + b.Property(x => x.Data).HasMaxLength(PersistedGrantConsts.DataMaxLengthValue).IsRequired(); b.HasKey(x => x.Key); //TODO: What about Id!!! @@ -215,16 +215,14 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Name).HasMaxLength(IdentityResourceConsts.NameMaxLength).IsRequired(); b.Property(x => x.DisplayName).HasMaxLength(IdentityResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(IdentityResourceConsts.DescriptionMaxLength); - b.Property(x => x.Properties) - .HasConversion(new AbpJsonValueConverter>()) - .Metadata.SetValueComparer(new AbpDictionaryValueComparer()); b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); + b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); }); - builder.Entity(b => + builder.Entity(b => { - b.ToTable(options.TablePrefix + "IdentityClaims", options.Schema); + b.ToTable(options.TablePrefix + "IdentityResourceClaims", options.Schema); b.ConfigureByConvention(); @@ -233,6 +231,18 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Type).HasMaxLength(UserClaimConsts.TypeMaxLength).IsRequired(); }); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "IdentityResourceProperties", options.Schema); + + b.ConfigureByConvention(); + + b.HasKey(x => new {x.IdentityResourceId, x.Key}); + + b.Property(x => x.Key).HasMaxLength(250).IsRequired(); + b.Property(x => x.Value).HasMaxLength(2000).IsRequired(); + }); + builder.Entity(b => { b.ToTable(options.TablePrefix + "ApiResources", options.Schema); @@ -251,9 +261,9 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); }); - builder.Entity(b => + builder.Entity(b => { - b.ToTable(options.TablePrefix + "ApiSecrets", options.Schema); + b.ToTable(options.TablePrefix + "ApiResourceSecrets", options.Schema); b.ConfigureByConvention(); @@ -265,14 +275,14 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { SecretConsts.ValueMaxLengthValue = 300; - } - + } + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); }); builder.Entity(b => { - b.ToTable(options.TablePrefix + "ApiClaims", options.Schema); + b.ToTable(options.TablePrefix + "ApiResourceClaims", options.Schema); b.ConfigureByConvention(); @@ -281,19 +291,33 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Type).HasMaxLength(UserClaimConsts.TypeMaxLength).IsRequired(); }); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "ApiResourceScopes", options.Schema); + + b.ConfigureByConvention(); + + b.HasKey(x => new {x.ApiResourceId, x.Scope}); + + b.Property(x => x.Scope).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); + }); + builder.Entity(b => { b.ToTable(options.TablePrefix + "ApiScopes", options.Schema); b.ConfigureByConvention(); - b.HasKey(x => new {x.ApiResourceId, x.Name}); + b.Property(x => x.Name).HasMaxLength(200).IsRequired(); + b.Property(x => x.DisplayName).HasMaxLength(200); + b.Property(x => x.Description).HasMaxLength(1000); - b.Property(x => x.Name).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); - b.Property(x => x.DisplayName).HasMaxLength(ApiScopeConsts.DisplayNameMaxLength); - b.Property(x => x.Description).HasMaxLength(ApiScopeConsts.DescriptionMaxLength); + b.HasIndex(x => x.Name).IsUnique(); - b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => new {x.ApiResourceId, x.Name}).IsRequired(); + b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); + + //Identity Server does not configure the relationship of Properties + //b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); }); builder.Entity(b => @@ -302,12 +326,25 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.ApiResourceId, x.Name, x.Type}); + b.HasKey(x => new {x.ApiScopeId, x.Name, x.Type}); b.Property(x => x.Type).HasMaxLength(UserClaimConsts.TypeMaxLength).IsRequired(); b.Property(x => x.Name).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); }); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "ApiScopeProperties", options.Schema); + + b.ConfigureByConvention(); + + b.HasKey(x => new {x.ApiScopeId, x.Key}); + + b.Property(x => x.Key).HasMaxLength(250).IsRequired(); + //oracle? + b.Property(x => x.Value).HasMaxLength(2000).IsRequired(); + }); + builder.Entity(b => { b.ToTable(options.TablePrefix + "DeviceFlowCodes", options.Schema); @@ -344,4 +381,4 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore return false; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs index 7a0bf0fbba..9b54a4cf24 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Grants/PersistedGrantRepository.cs @@ -74,10 +74,9 @@ namespace Volo.Abp.IdentityServer.Grants string clientId, string type) { - //IDS TODO: add SessionId to entity return DbSet .WhereIf(!subjectId.IsNullOrWhiteSpace(), x => x.SubjectId == subjectId) - // .WhereIf(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) + .WhereIf(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) .WhereIf(!type.IsNullOrWhiteSpace(), x => x.Type == type); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index de694a37c5..20d55b3d0e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -30,7 +30,7 @@ namespace Volo.Abp.IdentityServer.MongoDB CancellationToken cancellationToken = default) { return await GetMongoQueryable() - .Where(ar => ar.Scopes.Any(x => scopeNames.Contains(x.Name))) + .Where(ar => ar.Scopes.Any(x => scopeNames.Contains(x.Scope))) .ToListAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs index 11559b7707..6af1f5488d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoPersistedGrantRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; @@ -8,6 +9,7 @@ using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.MongoDB; + namespace Volo.Abp.IdentityServer.MongoDB { public class MongoPersistentGrantRepository : MongoDbRepository, IPersistentGrantRepository @@ -85,12 +87,11 @@ namespace Volo.Abp.IdentityServer.MongoDB string clientId, string type) { - //IDS TODO: add SessionId to entity return GetMongoQueryable() - .WhereIf(!subjectId.IsNullOrWhiteSpace(), x => x.SubjectId == subjectId) - // .WhereIf(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) - .WhereIf(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) - .WhereIf(!type.IsNullOrWhiteSpace(), x => x.Type == type) + .WhereIf>(!subjectId.IsNullOrWhiteSpace(), x => x.SubjectId == subjectId) + .WhereIf>(!sessionId.IsNullOrWhiteSpace(), x => x.SessionId == sessionId) + .WhereIf>(!clientId.IsNullOrWhiteSpace(), x => x.ClientId == clientId) + .WhereIf>(!type.IsNullOrWhiteSpace(), x => x.Type == type) .As>(); } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs index ef74266285..a196fd7534 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs @@ -19,13 +19,13 @@ namespace Volo.Abp.IdentityServer.Clients } [Fact] - public async Task FindApiResourceAsync_Should_Return_Null_If_Not_Found() + public async Task FindApiResourceAsync_Should_Return_Empty_If_Not_Found() { //Act var resource = await _resourceStore.FindApiResourcesByNameAsync(new []{"non-existing-name"}); //Assert - resource.ShouldBeNull(); + resource.ShouldBeEmpty(); } [Fact] @@ -60,7 +60,7 @@ namespace Volo.Abp.IdentityServer.Clients public async Task FindIdentityResourcesByScopeAsync_Should_Return_For_Given_Scopes() { //Act - var identityResourcesByScope = (await _resourceStore.FindApiResourcesByScopeNameAsync(new List + var identityResourcesByScope = (await _resourceStore.FindIdentityResourcesByScopeNameAsync(new List { "Test-Identity-Resource-Name-1" })).ToArray(); @@ -69,9 +69,7 @@ namespace Volo.Abp.IdentityServer.Clients identityResourcesByScope.Length.ShouldBe(1); identityResourcesByScope.First().DisplayName.ShouldBe("Test-Identity-Resource-DisplayName-1"); identityResourcesByScope.First().Description.ShouldBe("Test-Identity-Resource-Description-1"); - - //IDS TODO: - //identityResourcesByScope.First().Required.ShouldBe(true); + identityResourcesByScope.First().Required.ShouldBe(true); } [Fact] diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index 0d87a2fd19..d2efa7b352 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -27,7 +27,7 @@ namespace Volo.Abp.IdentityServer IClientRepository clientRepository, IGuidGenerator guidGenerator, IPersistentGrantRepository persistentGrantRepository, - IApiResourceRepository apiResourceRepository, + IApiResourceRepository apiResourceRepository, IIdentityResourceRepository identityResourceRepository) { _clientRepository = clientRepository; @@ -51,7 +51,7 @@ namespace Volo.Abp.IdentityServer { ProtocolType = "TestProtocol-42" }; - + client42.AddCorsOrigin("Origin1"); client42.AddScope("api1"); @@ -108,7 +108,8 @@ namespace Volo.Abp.IdentityServer }; apiResource.AddSecret("secret".Sha256()); - apiResource.AddScope("Test-ApiResource-ApiScope-Name-1", "Test-ApiResource-ApiScope-DisplayName-1"); + apiResource.AddScope("Test-ApiResource-ApiScope-Name-1"); + apiResource.AddScope("Test-ApiResource-ApiScope-DisplayName-1"); apiResource.AddUserClaim("Test-ApiResource-Claim-Type-1"); await _apiResourceRepository.InsertAsync(apiResource); diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index c36fef2d58..21e7123abe 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -91,6 +91,7 @@ namespace Volo.Abp.IdentityServer { Key = "PersistedGrantKey1", SubjectId = "PersistedGrantSubjectId1", + SessionId = "PersistedGrantSessionId1", ClientId = "PersistedGrantClientId1", Type = "PersistedGrantType1", Data = "" @@ -147,9 +148,9 @@ namespace Volo.Abp.IdentityServer apiResource.Description = nameof(apiResource.Description); apiResource.DisplayName = nameof(apiResource.DisplayName); - apiResource.AddScope(nameof(ApiScope.Name)); + apiResource.AddScope(nameof(ApiResourceScope.Scope)); apiResource.AddUserClaim(nameof(ApiResourceClaim.Type)); - apiResource.AddSecret(nameof(ApiSecret.Value)); + apiResource.AddSecret(nameof(ApiResourceSecret.Value)); await _apiResourceRepository.InsertAsync(apiResource); await _apiResourceRepository.InsertAsync(new ApiResource(_guidGenerator.Create(), "NewApiResource2")); diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs index 91e14bbace..73e2537207 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs @@ -36,7 +36,7 @@ namespace Volo.Abp.IdentityServer [Fact] public async Task DeleteBySubjectIdAndClientId() { - await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantClientId1"); + await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantSessionId1", "PersistedGrantClientId1"); var persistedGrants = await _persistentGrantRepository.GetListAsync(); persistedGrants.ShouldNotBeEmpty(); From b839f679325735120c329dffb230a0e17e6fc59d Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 11:36:36 +0800 Subject: [PATCH 03/55] Refactored the consensus page. --- .../ConsentOptions.cs | 17 ++ .../IdentityServerSupportedLoginModel.cs | 9 +- .../Pages/Consent.cshtml | 72 +++-- .../Pages/Consent.cshtml.cs | 252 +++++++++++------- .../Clients/IdentityResourceStore_Tests.cs | 2 +- 5 files changed, 219 insertions(+), 133 deletions(-) create mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs new file mode 100644 index 0000000000..3aaafd5d11 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs @@ -0,0 +1,17 @@ +namespace Volo.Abp.Account.Web +{ + public class ConsentOptions + { + public static bool EnableOfflineAccess = true; + + public static string OfflineAccessDisplayName = "Offline Access"; + + public static string OfflineAccessDescription = "Access to your applications and resources, even when you are offline"; + + //TODO: How to handle this + public static readonly string MustChooseOneErrorMessage = "You must pick at least one permission"; + + //TODO: How to handle this + public static readonly string InvalidSelectionErrorMessage = "Invalid selection"; + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs index 60f55497da..c09c9751c2 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs @@ -73,9 +73,9 @@ namespace Volo.Abp.Account.Web.Pages.Account EnableLocalLogin = await SettingProvider.IsTrueAsync(AccountSettingNames.EnableLocalLogin); - if (context?.ClientId != null) + if (context?.Client?.ClientId != null) { - var client = await ClientStore.FindEnabledClientByIdAsync(context.ClientId); + var client = await ClientStore.FindEnabledClientByIdAsync(context?.Client?.ClientId); if (client != null) { EnableLocalLogin = client.EnableLocalLogin; @@ -105,7 +105,10 @@ namespace Volo.Abp.Account.Web.Pages.Account return Redirect("~/"); } - await Interaction.GrantConsentAsync(context, ConsentResponse.Denied); + await Interaction.GrantConsentAsync(context, new ConsentResponse() + { + Error = AuthorizationError.AccessDenied + }); return Redirect(ReturnUrl); } diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml index b61ad00152..d92e72532e 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml @@ -1,18 +1,18 @@ @page +@using IdentityServer4.Extensions @using Volo.Abp.Account.Web.Pages -@using Volo.Abp.Account.Web.Pages.Account @model ConsentModel

- @if (Model.ClientInfo.ClientLogoUrl != null) + @if (Model.Consent.ClientLogoUrl != null) { - + } - @Model.ClientInfo.ClientName + @Model.Consent.ClientName is requesting your permission

@@ -25,29 +25,30 @@
Uncheck the permissions you do not wish to grant.
- @if (!Model.ConsentInput.IdentityScopes.IsNullOrEmpty()) + @if (!Model.Consent.IdentityScopes.IsNullOrEmpty()) {

Personal Information

    - @for (var i = 0; i < Model.ConsentInput.IdentityScopes.Count; i++) + + @foreach (var identityScope in Model.Consent.IdentityScopes) {
  • -
    - @* TODO: Use attributes on the view model instead of using hidden here *@ - @if (Model.ConsentInput.IdentityScopes[i].Description != null) + @* TODO: Use attributes on the view model instead of using hidden here *@ + @if (identityScope.Description != null) { }
  • @@ -55,29 +56,30 @@
} - @if (!Model.ConsentInput.ApiScopes.IsNullOrEmpty()) + @if (!Model.Consent.ApiScopes.IsNullOrEmpty()) {

Application Access

    - @for (var i = 0; i < Model.ConsentInput.ApiScopes.Count; i++) + + @foreach (var apiScope in Model.Consent.ApiScopes) {
  • -
    - @* TODO: Use attributes on the view model instead of using hidden here *@ - @if (Model.ConsentInput.ApiScopes[i].Description != null) + @* TODO: Use attributes on the view model instead of using hidden here *@ + @if (apiScope.Description != null) { }
  • @@ -85,11 +87,23 @@
} - @if (Model.ClientInfo.AllowRememberConsent) +
+
+
+ + Description +
+
+ +
+
+
+ + @if (Model.Consent.AllowRememberConsent) {
-
@@ -98,10 +112,10 @@
- @if (Model.ClientInfo.ClientUrl != null) + @if (Model.Consent.ClientUrl != null) { - - @Model.ClientInfo.ClientName + + @Model.Consent.ClientName }
@@ -110,4 +124,4 @@ - \ No newline at end of file + diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs index a0f0543765..64173917e3 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs @@ -3,12 +3,13 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; +using IdentityServer4.Extensions; using IdentityServer4.Models; using IdentityServer4.Services; using IdentityServer4.Stores; +using IdentityServer4.Validation; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; -using Volo.Abp.UI; namespace Volo.Abp.Account.Web.Pages { @@ -24,9 +25,7 @@ namespace Volo.Abp.Account.Web.Pages public string ReturnUrlHash { get; set; } [BindProperty] - public ConsentModel.ConsentInputModel ConsentInput { get; set; } - - public ClientInfoModel ClientInfo { get; set; } + public ConsentViewModel Consent { get; set; } private readonly IIdentityServerInteractionService _interaction; private readonly IClientStore _clientStore; @@ -44,37 +43,7 @@ namespace Volo.Abp.Account.Web.Pages public virtual async Task OnGet() { - var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); - if (request == null) - { - throw new ApplicationException($"No consent request matching request: {ReturnUrl}"); - } - - var client = await _clientStore.FindEnabledClientByIdAsync(request.ClientId); - if (client == null) - { - throw new ApplicationException($"Invalid client id: {request.ClientId}"); - } - - var resources = await _resourceStore.FindEnabledResourcesByScopeAsync(request.ScopesRequested); - if (resources == null || (!resources.IdentityResources.Any() && !resources.ApiResources.Any())) - { - throw new ApplicationException($"No scopes matching: {request.ScopesRequested.Aggregate((x, y) => x + ", " + y)}"); - } - - ClientInfo = new ClientInfoModel(client); - ConsentInput = new ConsentInputModel - { - RememberConsent = true, - IdentityScopes = resources.IdentityResources.Select(x => CreateScopeViewModel(x, true)).ToList(), - ApiScopes = resources.ApiResources.SelectMany(x => x.Scopes).Select(x => CreateScopeViewModel(x, true)).ToList() - }; - - if (resources.OfflineAccess) - { - ConsentInput.ApiScopes.Add(GetOfflineAccessScope(true)); - } - + Consent = await BuildViewModelAsync(ReturnUrl); return Page(); } @@ -96,53 +65,137 @@ namespace Volo.Abp.Account.Web.Pages throw new ApplicationException("Unknown Error!"); } - protected virtual async Task ProcessConsentAsync() + protected virtual async Task ProcessConsentAsync() { - var result = new ConsentModel.ProcessConsentResult(); + var result = new ProcessConsentResult(); + + // validate return url is still valid + var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); + if (request == null) + { + return result; + } - ConsentResponse grantedConsent; + ConsentResponse grantedConsent = null; - if (ConsentInput.UserDecision == "no") + // user clicked 'no' - send back the standard 'access_denied' response + if (Consent?.Button == "no") { - grantedConsent = ConsentResponse.Denied; + grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied }; + // emit event + //await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); } - else + // user clicked 'yes' - validate the data + else if (Consent?.Button == "yes") { - if (!ConsentInput.IdentityScopes.IsNullOrEmpty() || !ConsentInput.ApiScopes.IsNullOrEmpty()) + // if the user consented to some scope, build the response model + if (!Consent.ScopesConsented.IsNullOrEmpty()) { + var scopes = Consent.ScopesConsented; + if (ConsentOptions.EnableOfflineAccess == false) + { + scopes = scopes.Where(x => x != IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess); + } + grantedConsent = new ConsentResponse { - RememberConsent = ConsentInput.RememberConsent, - ScopesConsented = ConsentInput.GetAllowedScopeNames() + RememberConsent = Consent.RememberConsent, + ScopesValuesConsented = scopes.ToArray(), + Description = Consent.Description }; + + // emit event + //await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); } else { - throw new UserFriendlyException("You must pick at least one permission"); //TODO: How to handle this + //throw new UserFriendlyException("You must pick at least one permission"); //TODO: How to handle this + result.ValidationError = ConsentOptions.MustChooseOneErrorMessage; } } + else + { + result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage; + } if (grantedConsent != null) { - var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); - if (request == null) - { - return result; - } - + // communicate outcome of consent back to identityserver await _interaction.GrantConsentAsync(request, grantedConsent); - result.RedirectUri = ReturnUrl; //TODO: ReturnUrlHash? + // indicate that's it ok to redirect back to authorization endpoint + result.RedirectUri = Consent.ReturnUrl; //TODO: ReturnUrlHash? + result.Client = request.Client; + } + else + { + // we need to redisplay the consent UI + + result.ViewModel = await BuildViewModelAsync(ReturnUrl, Consent); } return result; } - protected virtual ConsentModel.ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) + private async Task BuildViewModelAsync(string returnUrl, ConsentInputModel model = null) + { + var request = await _interaction.GetAuthorizationContextAsync(returnUrl); + if (request != null) + { + return CreateConsentViewModel(model, returnUrl, request); + } + + throw new ApplicationException($"No consent request matching request: {returnUrl}"); + } + + private ConsentViewModel CreateConsentViewModel(ConsentInputModel model, string returnUrl, AuthorizationRequest request) + { + var consentViewModel = new ConsentViewModel + { + RememberConsent = model?.RememberConsent ?? true, + ScopesConsented = model?.ScopesConsented ?? Enumerable.Empty(), + Description = model?.Description, + + ReturnUrl = returnUrl, + + ClientName = request.Client.ClientName ?? request.Client.ClientId, + ClientUrl = request.Client.ClientUri, + ClientLogoUrl = request.Client.LogoUri, + AllowRememberConsent = request.Client.AllowRememberConsent + }; + + consentViewModel.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => + CreateScopeViewModel(x, consentViewModel.ScopesConsented.Contains(x.Name) || model == null)) + .ToArray(); + + var apiScopes = new List(); + foreach(var parsedScope in request.ValidatedResources.ParsedScopes) + { + var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName); + if (apiScope != null) + { + var scopeVm = CreateScopeViewModel(parsedScope, apiScope, + consentViewModel.ScopesConsented.Contains(parsedScope.RawValue) || model == null); + apiScopes.Add(scopeVm); + } + } + + if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess) + { + apiScopes.Add(GetOfflineAccessScope(consentViewModel.ScopesConsented.Contains(IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess) || model == null)); + } + + consentViewModel.ApiScopes = apiScopes; + + return consentViewModel; + } + + + protected virtual ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) { - return new ConsentModel.ScopeViewModel + return new ScopeViewModel { - Name = identity.Name, + Value = identity.Name, DisplayName = identity.DisplayName, Description = identity.Description, Emphasize = identity.Emphasize, @@ -151,24 +204,30 @@ namespace Volo.Abp.Account.Web.Pages }; } - protected virtual ConsentModel.ScopeViewModel CreateScopeViewModel(Scope scope, bool check) + protected virtual ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check) { - return new ConsentModel.ScopeViewModel - { - Name = scope.Name, - DisplayName = scope.DisplayName, - Description = scope.Description, - Emphasize = scope.Emphasize, - Required = scope.Required, - Checked = check || scope.Required + var displayName = apiScope.DisplayName ?? apiScope.Name; + if (!string.IsNullOrWhiteSpace(parsedScopeValue.ParsedParameter)) + { + displayName += ":" + parsedScopeValue.ParsedParameter; + } + + return new ScopeViewModel + { + Value = parsedScopeValue.RawValue, + DisplayName = displayName, + Description = apiScope.Description, + Emphasize = apiScope.Emphasize, + Required = apiScope.Required, + Checked = check || apiScope.Required }; } - protected virtual ConsentModel.ScopeViewModel GetOfflineAccessScope(bool check) + protected virtual ScopeViewModel GetOfflineAccessScope(bool check) { - return new ConsentModel.ScopeViewModel + return new ScopeViewModel { - Name = IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess, + Value = IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess, DisplayName = "Offline Access", //TODO: Localize Description = "Access to your applications and resources, even when you are offline", Emphasize = true, @@ -178,28 +237,37 @@ namespace Volo.Abp.Account.Web.Pages public class ConsentInputModel { - public List IdentityScopes { get; set; } - - public List ApiScopes { get; set; } - [Required] - public string UserDecision { get; set; } + public string Button { get; set; } + public IEnumerable ScopesConsented { get; set; } public bool RememberConsent { get; set; } - public List GetAllowedScopeNames() - { - var identityScopes = IdentityScopes ?? new List(); - var apiScopes = ApiScopes ?? new List(); - return identityScopes.Union(apiScopes).Where(s => s.Checked).Select(s => s.Name).ToList(); - } + public string ReturnUrl { get; set; } + + public string Description { get; set; } + } + + + public class ConsentViewModel : ConsentInputModel + { + public string ClientName { get; set; } + public string ClientUrl { get; set; } + + public string ClientLogoUrl { get; set; } + + public bool AllowRememberConsent { get; set; } + + public IEnumerable IdentityScopes { get; set; } + + public IEnumerable ApiScopes { get; set; } } public class ScopeViewModel { [Required] [HiddenInput] - public string Name { get; set; } + public string Value { get; set; } public bool Checked { get; set; } @@ -216,29 +284,13 @@ namespace Volo.Abp.Account.Web.Pages { public bool IsRedirect => RedirectUri != null; public string RedirectUri { get; set; } + public Client Client { get; set; } + + public bool ShowView => ViewModel != null; + public ConsentViewModel ViewModel { get; set; } public bool HasValidationError => ValidationError != null; public string ValidationError { get; set; } } - - public class ClientInfoModel - { - public string ClientName { get; set; } - - public string ClientUrl { get; set; } - - public string ClientLogoUrl { get; set; } - - public bool AllowRememberConsent { get; set; } - - public ClientInfoModel(Client client) - { - //TODO: Automap - ClientName = client.ClientId; - ClientUrl = client.ClientUri; - ClientLogoUrl = client.LogoUri; - AllowRememberConsent = client.AllowRememberConsent; - } - } } -} \ No newline at end of file +} diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs index a196fd7534..fcbb937bc4 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs @@ -53,7 +53,7 @@ namespace Volo.Abp.IdentityServer.Clients //Assert apiResources.ShouldNotBe(null); - apiResources[0].Scopes.Count.ShouldBe(2); + apiResources[0].Scopes.Count.ShouldBe(3); } [Fact] From 6f6d238bb5ff1d10b6ab1d8556d2ff5d2141cb62 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 12:00:16 +0800 Subject: [PATCH 04/55] Add FindByNameAsync to IApiResourceRepository. --- .../ApiResources/IApiResourceRepository.cs | 6 ++++++ .../IdentityServer/ApiResources/ApiResourceRepository.cs | 9 +++++++++ .../IdentityServer/MongoDB/MongoApiResourceRepository.cs | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index af1dcd6e36..8b9057d129 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -8,6 +8,12 @@ namespace Volo.Abp.IdentityServer.ApiResources { public interface IApiResourceRepository : IBasicRepository { + Task FindByNameAsync( + string apiResourceName, + bool includeDetails = true, + CancellationToken cancellationToken = default + ); + Task> FindByNameAsync( string[] apiResourceNames, bool includeDetails = true, diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 4d0baf7702..1949238a3b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -19,6 +19,15 @@ namespace Volo.Abp.IdentityServer.ApiResources } + public async Task FindByNameAsync(string apiResourceName, bool includeDetails = true, CancellationToken cancellationToken = default) + { + var query = from apiResource in DbSet.IncludeDetails(includeDetails) + where apiResource.Name == apiResourceName + select apiResource; + + return await query.FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + public async Task> FindByNameAsync(string[] apiResourceNames, bool includeDetails = true, CancellationToken cancellationToken = default) { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index 20d55b3d0e..44375fce93 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -18,6 +18,13 @@ namespace Volo.Abp.IdentityServer.MongoDB { } + public async Task FindByNameAsync(string apiResourceName, bool includeDetails = true, CancellationToken cancellationToken = default) + { + return await GetMongoQueryable() + .Where(ar => ar.Name == apiResourceName) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + public async Task> FindByNameAsync(string[] apiResourceNames, bool includeDetails = true, CancellationToken cancellationToken = default) { From a40b35a089532e6d47ff1340ad13cf20b81bfa9e Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 17:18:32 +0800 Subject: [PATCH 05/55] Use constants in EF entity configuration. --- .../ApiResources/ApiResourceScopeConsts.cs | 7 ++ .../ApiResourceSecretConsts.cs} | 12 +-- .../ApiResources/ApiScopeConsts.cs | 7 -- .../ApiScopes/ApiResourceConsts.cs | 9 ++ .../ApiScopes/ApiScopeClaimConsts.cs | 7 ++ .../ApiScopes/ApiScopePropertyConsts.cs | 9 ++ .../Devices/DeviceFlowCodesConsts.cs | 12 +++ .../IdentityResourcePropertyConsts.cs | 9 ++ .../{ApiResources => ApiScopes}/ApiScope.cs | 2 +- .../ApiScopeClaim.cs | 2 +- .../ApiScopeProperty.cs | 2 +- .../IApiScopeeRepository.cs | 2 +- .../IdentityServerAutoMapperProfile.cs | 1 + .../Volo/Abp/IdentityServer/ResourceStore.cs | 5 +- .../ApiResources/ApiResourceRepository.cs | 12 ++- .../ApiResources/ApiScopeRepository.cs | 1 + .../IIdentityServerDbContext.cs | 28 +++++- .../IdentityServerDbContext.cs | 28 +++++- ...yServerDbContextModelCreatingExtensions.cs | 90 +++++++++++++------ .../AbpIdentityServerMongoDbContext.cs | 3 + 20 files changed, 193 insertions(+), 55 deletions(-) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/{SecretConsts.cs => ApiResources/ApiResourceSecretConsts.cs} (84%) delete mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiResourceConsts.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaimConsts.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopePropertyConsts.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesConsts.cs create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/{ApiResources => ApiScopes}/ApiScope.cs (97%) rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/{ApiResources => ApiScopes}/ApiScopeClaim.cs (94%) rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/{ApiResources => ApiScopes}/ApiScopeProperty.cs (95%) rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/{ApiResources => ApiScopes}/IApiScopeeRepository.cs (89%) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs new file mode 100644 index 0000000000..8b0d8f4769 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.IdentityServer.ApiResources +{ + public class ApiResourceScopeConsts + { + public const int ScopeMaxLength = 200; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs similarity index 84% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs index 156088a97b..261f48ac2e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs @@ -1,22 +1,22 @@ -namespace Volo.Abp.IdentityServer +namespace Volo.Abp.IdentityServer.ApiResources { - public class SecretConsts + public class ApiResourceSecretConsts { /// /// Default value: 250 /// public static int TypeMaxLength { get; set; } = 250; - + /// /// Default value: 4000 /// public static int ValueMaxLength { get; set; } = 4000; - + public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; - + /// /// Default value: 2000 /// public static int DescriptionMaxLength { get; set; } = 2000; } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs deleted file mode 100644 index b61aa097f4..0000000000 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiScopeConsts.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.IdentityServer.ApiResources -{ - public class ApiScopeConsts - { - public const int NameMaxLength = 200; - } -} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiResourceConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiResourceConsts.cs new file mode 100644 index 0000000000..ab268690be --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiResourceConsts.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.IdentityServer.ApiScopes +{ + public class ApiScopeConsts + { + public const int NameMaxLength = 200; + public const int DisplayNameMaxLength = 200; + public const int DescriptionMaxLength = 1000; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaimConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaimConsts.cs new file mode 100644 index 0000000000..f3175e8774 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaimConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.IdentityServer.ApiScopes +{ + public class ApiScopeClaimConsts + { + public const int NameMaxLength = 200; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopePropertyConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopePropertyConsts.cs new file mode 100644 index 0000000000..5450e67030 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiScopes/ApiScopePropertyConsts.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.IdentityServer.ApiScopes +{ + public class ApiScopePropertyConsts + { + public const int KeyMaxLength = 250; + public const int ValueMaxLength = 2000; + public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesConsts.cs new file mode 100644 index 0000000000..b0c87fe89d --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Devices/DeviceFlowCodesConsts.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.IdentityServer.Devices +{ + public class DeviceFlowCodesConsts + { + public const int DeviceCodeMaxLength = 200; + public const int UserCodeMaxLength = 200; + public const int SubjectIdMaxLength = 200; + public const int ClientIdMaxLength = 200; + public const int DataMaxLength = 50000; + public static int DataMaxLengthValue { get; set; } = DataMaxLength; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs new file mode 100644 index 0000000000..2c9ccbb0c4 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.IdentityServer.IdentityResources +{ + public class IdentityResourcePropertyConsts + { + public const int KeyMaxLength = 250; + public const int ValueMaxLength = 2000; + public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs similarity index 97% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs index 8e8605afa1..d35294c27f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs @@ -4,7 +4,7 @@ using System.Linq; using JetBrains.Annotations; using Volo.Abp.Domain.Entities.Auditing; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiScope : FullAuditedAggregateRoot { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs similarity index 94% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs index e4444cbc8c..0bb6704a22 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiScopeClaim : UserClaim { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeProperty.cs similarity index 95% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeProperty.cs index 38f34567a8..b6e5d7fbe8 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiScopeProperty.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeProperty.cs @@ -2,7 +2,7 @@ using JetBrains.Annotations; using Volo.Abp.Domain.Entities; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiScopeProperty : Entity { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs similarity index 89% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs index 184b8d1b67..1cbc48499e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiScopeeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs @@ -3,7 +3,7 @@ using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public interface IApiScopeRepository : IBasicRepository { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs index 17aae1b084..99d24e617d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs @@ -2,6 +2,7 @@ using System.Security.Claims; using AutoMapper; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index 975fc7f801..5afaaf4400 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using IdentityServer4.Models; using IdentityServer4.Stores; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.ObjectMapping; @@ -43,7 +44,7 @@ namespace Volo.Abp.IdentityServer public virtual async Task> FindApiScopesByNameAsync(IEnumerable scopeNames) { var scopes = await ApiScopeRepository.GetListByNameAsync(scopeNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(scopes); + return ObjectMapper.Map, List>(scopes); } /// @@ -76,7 +77,7 @@ namespace Volo.Abp.IdentityServer return new Resources( ObjectMapper.Map, List>(identityResources), ObjectMapper.Map, List>(apiResources), - ObjectMapper.Map, List>(apiScopes)); + ObjectMapper.Map, List>(apiScopes)); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 1949238a3b..74ea53d9e0 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -83,16 +83,14 @@ namespace Volo.Abp.IdentityServer.ApiResources public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default) { - var scopeClaims = DbContext.Set().Where(sc => sc.ApiScopeId == id); - - foreach (var scopeClaim in scopeClaims) + var resourceClaims = DbContext.Set().Where(sc => sc.ApiResourceId == id); + foreach (var scopeClaim in resourceClaims) { - DbContext.Set().Remove(scopeClaim); + DbContext.Set().Remove(scopeClaim); } - var scopes = DbContext.Set().Where(s => s.ApiResourceId == id); - - foreach (var scope in scopes) + var resourceScopes = DbContext.Set().Where(s => s.ApiResourceId == id); + foreach (var scope in resourceScopes) { DbContext.Set().Remove(scope); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs index 6df9f5b90a..87f67ec330 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.EntityFrameworkCore; namespace Volo.Abp.IdentityServer.ApiResources diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs index 93624174f9..7834db31fb 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; @@ -12,20 +13,41 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore [ConnectionStringName(AbpIdentityServerDbProperties.ConnectionStringName)] public interface IIdentityServerDbContext : IEfCoreDbContext { + #region ApiResource + DbSet ApiResources { get; set; } - DbSet ApiSecrets { get; set; } + DbSet ApiResourceSecrets { get; set; } DbSet ApiResourceClaims { get; set; } - DbSet ApiScopes { get; set; } + DbSet ApiResourceScopes { get; set; } + + #endregion + + #region ApiScope + + DbSet ApiScopes { get; set; } DbSet ApiScopeClaims { get; set; } + DbSet ApiScopeProperties { get; set; } + + #endregion + + + #region IdentityResource + DbSet IdentityResources { get; set; } DbSet IdentityClaims { get; set; } + DbSet IdentityResourceProperties { get; set; } + + #endregion + + #region Client + DbSet Clients { get; set; } DbSet ClientGrantTypes { get; set; } @@ -46,6 +68,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore DbSet ClientProperties { get; set; } + #endregion + DbSet PersistedGrants { get; set; } DbSet DeviceFlowCodes { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs index 84ec1f802a..686d2e0ac1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; @@ -12,20 +13,41 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore [ConnectionStringName(AbpIdentityServerDbProperties.ConnectionStringName)] public class IdentityServerDbContext : AbpDbContext, IIdentityServerDbContext { + #region ApiResource + public DbSet ApiResources { get; set; } - public DbSet ApiSecrets { get; set; } + public DbSet ApiResourceSecrets { get; set; } public DbSet ApiResourceClaims { get; set; } - public DbSet ApiScopes { get; set; } + public DbSet ApiResourceScopes { get; set; } + + #endregion + + #region ApiScope + + public DbSet ApiScopes { get; set; } public DbSet ApiScopeClaims { get; set; } + public DbSet ApiScopeProperties { get; set; } + + #endregion + + + #region IdentityResource + public DbSet IdentityResources { get; set; } public DbSet IdentityClaims { get; set; } + public DbSet IdentityResourceProperties { get; set; } + + #endregion + + #region Client + public DbSet Clients { get; set; } public DbSet ClientGrantTypes { get; set; } @@ -46,6 +68,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore public DbSet ClientProperties { get; set; } + #endregion + public DbSet PersistedGrants { get; set; } public DbSet DeviceFlowCodes { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 54b91e9dcc..26b8036aba 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -6,10 +6,16 @@ using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.ValueComparers; using Volo.Abp.EntityFrameworkCore.ValueConverters; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; +using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using Client = Volo.Abp.IdentityServer.Clients.Client; +using ClientClaim = Volo.Abp.IdentityServer.Clients.ClientClaim; +using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; +using PersistedGrant = Volo.Abp.IdentityServer.Grants.PersistedGrant; namespace Volo.Abp.IdentityServer.EntityFrameworkCore { @@ -28,6 +34,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore optionsAction?.Invoke(options); + #region Client + builder.Entity(b => { b.ToTable(options.TablePrefix + "Clients", options.Schema); @@ -123,16 +131,16 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ClientId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLengthValue = 300; + ApiResourceSecretConsts.ValueMaxLengthValue = 300; } - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLengthValue).IsRequired(); - b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); + b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); }); builder.Entity(b => @@ -206,6 +214,10 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasIndex(x => x.Expiration); }); + #endregion + + #region IdentityResource + builder.Entity(b => { b.ToTable(options.TablePrefix + "IdentityResources", options.Schema); @@ -216,6 +228,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.DisplayName).HasMaxLength(IdentityResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(IdentityResourceConsts.DescriptionMaxLength); + b.HasIndex(x => x.Name).IsUnique(); + b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.IdentityResourceId).IsRequired(); }); @@ -239,11 +253,19 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.IdentityResourceId, x.Key}); - b.Property(x => x.Key).HasMaxLength(250).IsRequired(); - b.Property(x => x.Value).HasMaxLength(2000).IsRequired(); + b.Property(x => x.Key).HasMaxLength(IdentityResourcePropertyConsts.KeyMaxLength).IsRequired(); + if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) + { + IdentityResourcePropertyConsts.ValueMaxLengthValue = 300; + } + b.Property(x => x.Value).HasMaxLength(IdentityResourcePropertyConsts.ValueMaxLengthValue).IsRequired(); }); - builder.Entity(b => + #endregion + + #region ApiResource + + builder.Entity(b => { b.ToTable(options.TablePrefix + "ApiResources", options.Schema); @@ -269,15 +291,15 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiResourceId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); - b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); + b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLengthValue = 300; + ApiResourceSecretConsts.ValueMaxLengthValue = 300; } - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLengthValue).IsRequired(); }); builder.Entity(b => @@ -299,24 +321,28 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiResourceId, x.Scope}); - b.Property(x => x.Scope).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); + b.Property(x => x.Scope).HasMaxLength(ApiResourceScopeConsts.ScopeMaxLength).IsRequired(); }); + #endregion + + #region ApiScope + builder.Entity(b => { b.ToTable(options.TablePrefix + "ApiScopes", options.Schema); b.ConfigureByConvention(); - b.Property(x => x.Name).HasMaxLength(200).IsRequired(); - b.Property(x => x.DisplayName).HasMaxLength(200); - b.Property(x => x.Description).HasMaxLength(1000); + b.Property(x => x.Name).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); + b.Property(x => x.DisplayName).HasMaxLength(ApiScopeConsts.DisplayNameMaxLength); + b.Property(x => x.Description).HasMaxLength(ApiScopeConsts.DescriptionMaxLength); b.HasIndex(x => x.Name).IsUnique(); b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); - //Identity Server does not configure the relationship of Properties + //TODO: Identity Server does not configure the relationship of Properties //b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); }); @@ -329,7 +355,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiScopeId, x.Name, x.Type}); b.Property(x => x.Type).HasMaxLength(UserClaimConsts.TypeMaxLength).IsRequired(); - b.Property(x => x.Name).HasMaxLength(ApiScopeConsts.NameMaxLength).IsRequired(); + b.Property(x => x.Name).HasMaxLength(ApiScopeClaimConsts.NameMaxLength).IsRequired(); }); builder.Entity(b => @@ -340,28 +366,42 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiScopeId, x.Key}); - b.Property(x => x.Key).HasMaxLength(250).IsRequired(); - //oracle? - b.Property(x => x.Value).HasMaxLength(2000).IsRequired(); + b.Property(x => x.Key).HasMaxLength(ApiScopePropertyConsts.KeyMaxLength).IsRequired(); + if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) + { + ApiScopePropertyConsts.ValueMaxLengthValue = 300; + } + b.Property(x => x.Value).HasMaxLength(ApiScopePropertyConsts.ValueMaxLengthValue).IsRequired(); }); + #endregion + + #region DeviceFlowCodes + builder.Entity(b => { b.ToTable(options.TablePrefix + "DeviceFlowCodes", options.Schema); b.ConfigureByConvention(); - b.Property(x => x.DeviceCode).HasMaxLength(200).IsRequired(); - b.Property(x => x.UserCode).HasMaxLength(200).IsRequired(); - b.Property(x => x.SubjectId).HasMaxLength(200); - b.Property(x => x.ClientId).HasMaxLength(200).IsRequired(); + b.Property(x => x.DeviceCode).HasMaxLength(DeviceFlowCodesConsts.DeviceCodeMaxLength).IsRequired(); + b.Property(x => x.UserCode).HasMaxLength(DeviceFlowCodesConsts.UserCodeMaxLength).IsRequired(); + b.Property(x => x.SubjectId).HasMaxLength(DeviceFlowCodesConsts.SubjectIdMaxLength); + b.Property(x => x.ClientId).HasMaxLength(DeviceFlowCodesConsts.ClientIdMaxLength).IsRequired(); b.Property(x => x.Expiration).IsRequired(); - b.Property(x => x.Data).HasMaxLength(50000).IsRequired(); + + if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) + { + DeviceFlowCodesConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. + } + b.Property(x => x.Data).HasMaxLength(DeviceFlowCodesConsts.DataMaxLengthValue).IsRequired(); b.HasIndex(x => new {x.UserCode}).IsUnique(); b.HasIndex(x => x.DeviceCode).IsUnique(); b.HasIndex(x => x.Expiration); }); + + #endregion } private static bool IsDatabaseProvider( diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs index b4b5fe9b60..093f7434dc 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs @@ -1,6 +1,7 @@ using MongoDB.Driver; using Volo.Abp.Data; using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; @@ -14,6 +15,8 @@ namespace Volo.Abp.IdentityServer.MongoDB { public IMongoCollection ApiResources => Collection(); + public IMongoCollection ApiScopes => Collection(); + public IMongoCollection Clients => Collection(); public IMongoCollection IdentityResources => Collection(); From 9c4a3f63d37c6a17771f5b2950a8beb3f1978e77 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 18:31:37 +0800 Subject: [PATCH 06/55] Refactor. --- .../ApiResources/ApiResourceConsts.cs | 2 +- .../ApiResources/ApiResourceEto.cs | 2 +- .../ApiResources/ApiResourceScopeConsts.cs | 2 +- .../ApiResources/ApiResourceSecretConsts.cs | 2 +- .../AbpIdentityServerDomainModule.cs | 2 +- .../ApiResources/ApiResource.cs | 2 +- .../ApiResources/ApiResourceClaim.cs | 2 +- .../ApiResources/ApiResourceScope.cs | 2 +- .../ApiResources/ApiResourceSecret.cs | 2 +- .../ApiResources/IApiResourceRepository.cs | 2 +- .../Abp/IdentityServer/ApiScopes/ApiScope.cs | 20 ++++++++++++ .../IdentityServerAutoMapperProfile.cs | 1 - .../Volo/Abp/IdentityServer/ResourceStore.cs | 7 ++-- ...IdentityServerEfCoreQueryableExtensions.cs | 15 ++++++++- .../ApiResources/ApiResourceRepository.cs | 2 +- .../ApiScopeRepository.cs | 7 ++-- ...IdentityServerEntityFrameworkCoreModule.cs | 2 +- .../IIdentityServerDbContext.cs | 1 - .../IdentityServerDbContext.cs | 1 - ...yServerDbContextModelCreatingExtensions.cs | 3 +- .../AbpIdentityServerMongoDbContext.cs | 3 +- ...pIdentityServerMongoDbContextExtensions.cs | 12 +++++-- .../MongoDB/AbpIdentityServerMongoDbModule.cs | 7 ++-- .../IAbpIdentityServerMongoDbContext.cs | 5 ++- .../MongoDB/MongoApiResourceRepository.cs | 2 +- .../MongoDB/MongoApiScopeRepository.cs | 32 +++++++++++++++++++ .../AbpIdentityServerTestDataBuilder.cs | 4 +-- .../AbpIdentityServerTestDataBuilder.cs | 2 +- .../ApiResourceRepository_Tests.cs | 2 +- 29 files changed, 109 insertions(+), 39 deletions(-) rename modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/{ApiResources => ApiScopes}/ApiScopeRepository.cs (80%) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs index 1c3aecc531..b20b743b50 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceConsts { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceEto.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceEto.cs index 1130b0bc92..1aeb83727f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceEto.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceEto.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { [Serializable] public class ApiResourceEto diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs index 8b0d8f4769..c9b874b12c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceScopeConsts.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceScopeConsts { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs index 261f48ac2e..dce950d30c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs @@ -1,4 +1,4 @@ -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceSecretConsts { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index 9e36576e56..bd03a3f34e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -8,7 +8,7 @@ using Volo.Abp.BackgroundWorkers; using Volo.Abp.Caching; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Identity; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.IdentityResources; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs index dc795fb09b..9d81b95def 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs @@ -5,7 +5,7 @@ using IdentityServer4; using JetBrains.Annotations; using Volo.Abp.Domain.Entities.Auditing; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResource : FullAuditedAggregateRoot { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs index e71d694656..e3e92d0721 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceClaim : UserClaim { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs index 4da2beaa3f..ecdff780e9 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs @@ -2,7 +2,7 @@ using JetBrains.Annotations; using Volo.Abp.Domain.Entities; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceScope : Entity { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs index dcc6b04768..ccf63b8a3c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs @@ -2,7 +2,7 @@ using IdentityServer4; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceSecret : Secret { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index 8b9057d129..4f2abd3aed 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public interface IApiResourceRepository : IBasicRepository { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs index d35294c27f..047c688b67 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs @@ -74,5 +74,25 @@ namespace Volo.Abp.IdentityServer.ApiScopes { return UserClaims.FirstOrDefault(r => r.Name == Name && r.Type == type); } + + public virtual void AddProperty([NotNull] string key, string value) + { + Properties.Add(new ApiScopeProperty(Id, key, value)); + } + + public virtual void RemoveAllProperties() + { + Properties.Clear(); + } + + public virtual void RemoveProperty(string key) + { + Properties.RemoveAll(r => r.Key == key); + } + + public virtual ApiScopeProperty FindProperty(string key) + { + return Properties.FirstOrDefault(r => r.Key == key); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs index 99d24e617d..34a831ca38 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Security.Claims; using AutoMapper; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index 5afaaf4400..a2d13c72fd 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Threading.Tasks; using IdentityServer4.Models; using IdentityServer4.Stores; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.ObjectMapping; @@ -53,7 +52,7 @@ namespace Volo.Abp.IdentityServer public virtual async Task> FindApiResourcesByScopeNameAsync(IEnumerable scopeNames) { var resources = await ApiResourceRepository.GetListByScopesAsync(scopeNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(resources); + return ObjectMapper.Map, List>(resources); } /// @@ -62,7 +61,7 @@ namespace Volo.Abp.IdentityServer public virtual async Task> FindApiResourcesByNameAsync(IEnumerable apiResourceNames) { var resources = await ApiResourceRepository.FindByNameAsync(apiResourceNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(resources); + return ObjectMapper.Map, List>(resources); } /// @@ -76,7 +75,7 @@ namespace Volo.Abp.IdentityServer return new Resources( ObjectMapper.Map, List>(identityResources), - ObjectMapper.Map, List>(apiResources), + ObjectMapper.Map, List>(apiResources), ObjectMapper.Map, List>(apiScopes)); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs index 6e47d461e4..347b3c4d22 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs @@ -1,6 +1,6 @@ using System.Linq; using Microsoft.EntityFrameworkCore; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; @@ -21,6 +21,19 @@ namespace Volo.Abp.IdentityServer .Include(x => x.Scopes); } + public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) + { + if (!include) + { + return queryable; + } + + return queryable + .Include(x => x.UserClaims) + .Include(x => x.Properties); + } + + public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) { if (!include) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 74ea53d9e0..bf8a8c2df2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -10,7 +10,7 @@ using Volo.Abp.IdentityServer.EntityFrameworkCore; using System.Linq.Dynamic.Core; using System.Runtime.InteropServices.ComTypes; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiResourceRepository : EfCoreRepository, IApiResourceRepository { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs similarity index 80% rename from modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs index 87f67ec330..9828a48d30 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiScopeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs @@ -5,10 +5,9 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.EntityFrameworkCore; -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer.ApiScopes { public class ApiScopeRepository : EfCoreRepository, IApiScopeRepository { @@ -20,7 +19,9 @@ namespace Volo.Abp.IdentityServer.ApiResources public async Task> GetListByNameAsync(string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default) { - var query = from scope in DbSet where scopeNames.Contains(scope.Name) select scope; + var query = from scope in DbSet.IncludeDetails(includeDetails) + where scopeNames.Contains(scope.Name) + select scope; return await query.ToListAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs index a932cd3351..4d89745874 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs index 7834db31fb..db1017b9ab 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs @@ -1,7 +1,6 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs index 686d2e0ac1..f7ccb1d309 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs @@ -1,7 +1,6 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 26b8036aba..8d96f2c442 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -5,13 +5,12 @@ using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; using Volo.Abp.EntityFrameworkCore.ValueComparers; using Volo.Abp.EntityFrameworkCore.ValueConverters; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; -using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; using Client = Volo.Abp.IdentityServer.Clients.Client; using ClientClaim = Volo.Abp.IdentityServer.Clients.ClientClaim; using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs index 093f7434dc..760505e75f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs @@ -1,12 +1,11 @@ using MongoDB.Driver; using Volo.Abp.Data; -using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; +using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.MongoDB; -using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; namespace Volo.Abp.IdentityServer.MongoDB { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs index b6a20d842a..026312312a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs @@ -1,5 +1,5 @@ using System; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; @@ -27,15 +27,21 @@ namespace Volo.Abp.IdentityServer.MongoDB b.CollectionName = options.CollectionPrefix + "ApiResources"; }); - builder.Entity(b => + builder.Entity(b => { - b.CollectionName = options.CollectionPrefix + "Clients"; + b.CollectionName = options.CollectionPrefix + "ApiScopes"; }); + builder.Entity(b => { b.CollectionName = options.CollectionPrefix + "IdentityResources"; }); + builder.Entity(b => + { + b.CollectionName = options.CollectionPrefix + "Clients"; + }); + builder.Entity(b => { b.CollectionName = options.CollectionPrefix + "PersistedGrants"; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs index 251378e087..1924ad3a68 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs @@ -1,11 +1,11 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; +using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.Modularity; using Volo.Abp.MongoDB; -using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; -using Client = Volo.Abp.IdentityServer.Clients.Client; -using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; namespace Volo.Abp.IdentityServer.MongoDB { @@ -30,6 +30,7 @@ namespace Volo.Abp.IdentityServer.MongoDB context.Services.AddMongoDbContext(options => { options.AddRepository(); + options.AddRepository(); options.AddRepository(); options.AddRepository(); options.AddRepository(); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs index 3bb21a8198..ad1cfbfcf5 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs @@ -1,11 +1,12 @@ using MongoDB.Driver; using Volo.Abp.Data; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.MongoDB; -using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; namespace Volo.Abp.IdentityServer.MongoDB { @@ -14,6 +15,8 @@ namespace Volo.Abp.IdentityServer.MongoDB { IMongoCollection ApiResources { get; } + IMongoCollection ApiScopes { get; } + IMongoCollection Clients { get; } IMongoCollection IdentityResources { get; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index 44375fce93..c7a93cdb60 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using MongoDB.Driver; using MongoDB.Driver.Linq; using Volo.Abp.Domain.Repositories.MongoDB; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using System.Linq.Dynamic.Core; using Volo.Abp.MongoDB; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs new file mode 100644 index 0000000000..5efa8a5a48 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Linq; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.MongoDB; + +namespace Volo.Abp.IdentityServer.MongoDB +{ + public class MongoApiScopeRepository : MongoDbRepository, + IApiScopeRepository + { + public MongoApiScopeRepository(IMongoDbContextProvider dbContextProvider) : + base(dbContextProvider) + { + } + + public async Task> GetListByNameAsync(string[] scopeNames, bool includeDetails = false, + CancellationToken cancellationToken = default) + { + var query = from scope in GetMongoQueryable() + where scopeNames.Contains(scope.Name) + select scope; + + return await query.ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index d2efa7b352..52fbc0513a 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -2,11 +2,11 @@ using IdentityServer4.Models; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; -using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; using Client = Volo.Abp.IdentityServer.Clients.Client; using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; using PersistedGrant = Volo.Abp.IdentityServer.Grants.PersistedGrant; diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index 21e7123abe..a2cf0f428c 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.Identity; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs index 76fbba2504..d3350ab59f 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.Modularity; using Xunit; From 1b9a9b67221d4f0547a462a2556e125a0af8fb76 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 20:05:30 +0800 Subject: [PATCH 07/55] Update IdentityServerDataSeedContributor.cs. --- .../IdentityServer/IdentityServerDataSeedContributor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs index 593169ae48..5c4da23953 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs @@ -6,7 +6,7 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.PermissionManagement; From c77856c7c685489e51a3e764951d7314daf9260f Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 3 Jul 2020 20:36:13 +0800 Subject: [PATCH 08/55] Update IdentityServerDataSeedContributor.cs. --- .../IdentityServer/IdentityServerDataSeedContributor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 2bce06c77d..511a20b3ea 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -7,12 +7,12 @@ using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; -using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.PermissionManagement; using Volo.Abp.Uow; -using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; using Client = Volo.Abp.IdentityServer.Clients.Client; namespace MyCompanyName.MyProjectName.IdentityServer From b8719fbc157f043156cce2556632e513a397ebe4 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 6 Jul 2020 22:23:19 +0800 Subject: [PATCH 09/55] Update Consent. --- .../Pages/Consent.cshtml | 38 +-- .../Pages/Consent.cshtml.cs | 21 +- .../Volo.Abp.IdentityServer.Domain.csproj | 4 +- .../Abp/IdentityServer/ApiScopes/ApiScope.cs | 4 +- .../ApiScopes/IApiScopeeRepository.cs | 6 + .../ApiScopes/ApiScopeRepository.cs | 5 + .../MongoDB/MongoApiScopeRepository.cs | 5 + .../IdentityServerDataSeedContributor.cs | 18 +- ....cs => 20200706091528_Initial.Designer.cs} | 247 ++++++++++++++---- ...2_Initial.cs => 20200706091528_Initial.cs} | 179 +++++++++---- ...ectNameMigrationsDbContextModelSnapshot.cs | 245 +++++++++++++---- .../MyProjectNameIdentityServerModule.cs | 3 +- 12 files changed, 594 insertions(+), 181 deletions(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200624023152_Initial.Designer.cs => 20200706091528_Initial.Designer.cs} (90%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200624023152_Initial.cs => 20200706091528_Initial.cs} (90%) diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml index d92e72532e..5060e55a99 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml @@ -1,5 +1,4 @@ @page -@using IdentityServer4.Extensions @using Volo.Abp.Account.Web.Pages @model ConsentModel @@ -31,28 +30,29 @@
    - @foreach (var identityScope in Model.Consent.IdentityScopes) + @for (var i = 0; i < Model.Consent.IdentityScopes.Count; i++) {
  • -
    - @* TODO: Use attributes on the view model instead of using hidden here *@ - @if (identityScope.Description != null) + @* TODO: Use attributes on the view model instead of using hidden here *@ + @if (Model.Consent.IdentityScopes[i].Description != null) { }
  • } +
} @@ -62,24 +62,24 @@
public static int KeyMaxLength { get; set; } = 200; - + /// /// Default value: 50 /// public static int TypeMaxLength { get; set; } = 50; - + /// /// Default value: 200 /// public static int SubjectIdMaxLength { get; set; } = 200; - + + /// + /// Default value: 100 + /// + public static int SessionIdMaxLength { get; set; } = 100; + /// /// Default value: 200 /// public static int ClientIdMaxLength { get; set; } = 200; - + + /// + /// Default value: 200 + /// + public static int DescriptionMaxLength { get; set; } = 200; + /// /// Default value: 50000 /// public static int DataMaxLength { get; set; } = 50000; - + /// /// Default value: 50000 /// public static int DataMaxLengthValue { get; set; } = 50000; } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs index a7c713e161..66f8120b6a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs @@ -6,15 +6,15 @@ /// Default value: 200 ///
public static int NameMaxLength { get; set; } = 200; - + /// /// Default value: 200 /// public static int DisplayNameMaxLength { get; set; } = 200; - + /// - /// Default value: 200 + /// Default value: 1000 /// public static int DescriptionMaxLength { get; set; } = 1000; } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs index 2c9ccbb0c4..98a5a93941 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourcePropertyConsts.cs @@ -2,8 +2,8 @@ { public class IdentityResourcePropertyConsts { - public const int KeyMaxLength = 250; - public const int ValueMaxLength = 2000; - public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; + public static int KeyMaxLength { get; set; } = 250; + + public static int ValueMaxLength { get; set; } = 2000; } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConfiguration.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConfiguration.cs index 78a26900c9..fe89b7400a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConfiguration.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConfiguration.cs @@ -23,6 +23,15 @@ namespace Volo.Abp.ObjectExtending ); } + public IdentityServerModuleExtensionConfiguration ConfigureApiScope( + Action configureAction) + { + return this.ConfigureEntity( + IdentityServerModuleExtensionConsts.EntityNames.ApiScope, + configureAction + ); + } + public IdentityServerModuleExtensionConfiguration ConfigureIdentityResource( Action configureAction) { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConsts.cs index 8623b8830a..a9396ff95a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/ObjectExtending/IdentityServerModuleExtensionConsts.cs @@ -11,6 +11,8 @@ public const string IdentityResource = "IdentityResource"; public const string ApiResource = "ApiResource"; + + public const string ApiScope = "ApiScope"; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index bd03a3f34e..d07132e094 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -8,6 +8,7 @@ using Volo.Abp.BackgroundWorkers; using Volo.Abp.Caching; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Identity; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs index 9d81b95def..e6fe3b9318 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs @@ -4,6 +4,7 @@ using System.Linq; using IdentityServer4; using JetBrains.Annotations; using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.IdentityServer.ApiResources; namespace Volo.Abp.IdentityServer.ApiScopes { @@ -28,7 +29,7 @@ namespace Volo.Abp.IdentityServer.ApiScopes public virtual List UserClaims { get; protected set; } - public virtual Dictionary Properties { get; protected set; } + public virtual List Properties { get; protected set; } protected ApiResource() { @@ -51,7 +52,7 @@ namespace Volo.Abp.IdentityServer.ApiScopes Secrets = new List(); Scopes = new List(); UserClaims = new List(); - Properties = new Dictionary(); + Properties = new List(); Scopes.Add(new ApiResourceScope(id, name)); } @@ -121,5 +122,25 @@ namespace Volo.Abp.IdentityServer.ApiScopes { return Scopes.FirstOrDefault(r => r.Scope == scope); } + + public virtual void AddProperty([NotNull] string key, string value) + { + Properties.Add(new ApiResourceProperty(Id, key, value)); + } + + public virtual void RemoveAllProperties() + { + Properties.Clear(); + } + + public virtual void RemoveProperty(string key) + { + Properties.RemoveAll(r => r.Key == key); + } + + public virtual ApiResourceProperty FindProperty(string key) + { + return Properties.FirstOrDefault(r => r.Key == key); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceProperty.cs new file mode 100644 index 0000000000..7b6257c771 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceProperty.cs @@ -0,0 +1,39 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.IdentityServer.ApiResources +{ + public class ApiResourceProperty : Entity + { + public virtual Guid ApiResourceId { get; protected set; } + + public virtual string Key { get; set; } + + public virtual string Value { get; set; } + + protected ApiResourceProperty() + { + + } + + public virtual bool Equals(Guid aiResourceId, [NotNull] string key, string value) + { + return ApiResourceId == aiResourceId && Key == key && Value == value; + } + + protected internal ApiResourceProperty(Guid aiResourceId, [NotNull] string key, [NotNull] string value) + { + Check.NotNull(key, nameof(key)); + + ApiResourceId = aiResourceId; + Key = key; + Value = value; + } + + public override object[] GetKeys() + { + return new object[] { ApiResourceId, Key }; + } + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index 4f2abd3aed..f2feff8917 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -35,11 +35,6 @@ namespace Volo.Abp.IdentityServer.ApiScopes CancellationToken cancellationToken = default ); - Task> GetListAsync( - bool includeDetails = false, - CancellationToken cancellationToken = default - ); - Task CheckNameExistAsync( string name, Guid? expectedId = null, diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs index 2f183b8b7e..27f8ad1d58 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScope.cs @@ -59,7 +59,7 @@ namespace Volo.Abp.IdentityServer.ApiScopes public virtual void AddUserClaim([NotNull] string type) { - UserClaims.Add(new ApiScopeClaim(Id, Name, type)); + UserClaims.Add(new ApiScopeClaim(Id, type)); } public virtual void RemoveAllUserClaims() @@ -74,7 +74,7 @@ namespace Volo.Abp.IdentityServer.ApiScopes public virtual ApiScopeClaim FindClaim(string type) { - return UserClaims.FirstOrDefault(r => r.Name == Name && r.Type == type); + return UserClaims.FirstOrDefault(r => r.Type == type); } public virtual void AddProperty([NotNull] string key, string value) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs index 0bb6704a22..95519195e7 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/ApiScopeClaim.cs @@ -7,31 +7,25 @@ namespace Volo.Abp.IdentityServer.ApiScopes { public Guid ApiScopeId { get; protected set; } - [NotNull] - public string Name { get; protected set; } - protected ApiScopeClaim() { } - public virtual bool Equals(Guid apiScopeId, [NotNull] string name, [NotNull] string type) + public virtual bool Equals(Guid apiScopeId, [NotNull] string type) { - return ApiScopeId == apiScopeId && Name == name && Type == type; + return ApiScopeId == apiScopeId && Type == type; } - protected internal ApiScopeClaim(Guid apiScopeId, [NotNull] string name, [NotNull] string type) + protected internal ApiScopeClaim(Guid apiScopeId, [NotNull] string type) : base(type) { - Check.NotNull(name, nameof(name)); - ApiScopeId = apiScopeId; - Name = name; } public override object[] GetKeys() { - return new object[] { ApiScopeId, Name, Type }; + return new object[] { ApiScopeId, Type }; } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs index d351addfc2..4480fdab5a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceProperty.cs @@ -17,9 +17,9 @@ namespace Volo.Abp.IdentityServer.IdentityResources } - public virtual bool Equals(Guid identityResourceId, [NotNull] string key) + public virtual bool Equals(Guid identityResourceId, [NotNull] string key, string value) { - return IdentityResourceId == identityResourceId && Key == key; + return IdentityResourceId == identityResourceId && Key == key && Value == value; } protected internal IdentityResourceProperty(Guid identityResourceId, [NotNull] string key, [NotNull] string value) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs index 34a831ca38..af155190f3 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerAutoMapperProfile.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Security.Claims; using AutoMapper; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; @@ -11,58 +12,32 @@ namespace Volo.Abp.IdentityServer { public class IdentityServerAutoMapperProfile : Profile { + /// + /// TODO: Reverse maps will not used probably. Remove those will not used + /// public IdentityServerAutoMapperProfile() { - //TODO: Reverse maps will not used probably. Remove those will not used - - CreateMap() - .ConstructUsing(src => src.Origin) - .ReverseMap() - .ForMember(dest => dest.Origin, opt => opt.MapFrom(src => src)); - - CreateMap() - .ForMember(dest => dest.ApiSecrets, opt => opt.MapFrom(src => src.Secrets)); - - CreateMap(); - - - //TODO: Why PersistedGrant mapping is in this profile? - CreateMap().ReverseMap(); - - CreateMap() - .ConstructUsing(src => new IdentityServer4.Models.IdentityResource()); - - CreateMap() - .ConstructUsing(x => x.Type) - .ReverseMap() - .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); - - CreateMap>() - .ReverseMap(); - CreateMap() .ConstructUsing(src => src.Type) .ReverseMap() .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); - CreateMap() - .ConstructUsing(x => x.Scope) - .ReverseMap() - .ForMember(dest => dest.Scope, opt => opt.MapFrom(src => src)); - - CreateMap>() - .ReverseMap(); + CreateClientMap(); + CreateApiResourceMap(); + CreateApiScopeMap(); + CreateIdentityResourceMap(); + CreatePersistedGrantMap(); + CreateDeviceFlowCodesMap(); + } - CreateMap() - .ConstructUsing(x => x.Type) + private void CreateClientMap() + { + CreateMap() + .ConstructUsing(src => src.Origin) .ReverseMap() - .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); - - CreateMap(MemberList.Destination) - .ConstructUsing(src => new IdentityServer4.Models.ApiScope()) - .ReverseMap(); + .ForMember(dest => dest.Origin, opt => opt.MapFrom(src => src)); - CreateMap>() + CreateMap>() .ReverseMap(); CreateMap() @@ -115,10 +90,64 @@ namespace Volo.Abp.IdentityServer CreateMap(); CreateMap(); - CreateMap(); - CreateMap(); + } + + private void CreateApiResourceMap() + { + CreateMap() + .ForMember(dest => dest.ApiSecrets, opt => opt.MapFrom(src => src.Secrets)); + + CreateMap(); + + CreateMap() + .ConstructUsing(x => x.Scope) + .ReverseMap() + .ForMember(dest => dest.Scope, opt => opt.MapFrom(src => src)); + + CreateMap(); + } + + private void CreateApiScopeMap() + { + CreateMap>() + .ReverseMap(); + + CreateMap() + .ConstructUsing(x => x.Type) + .ReverseMap() + .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); + + CreateMap(MemberList.Destination) + .ConstructUsing(src => new IdentityServer4.Models.ApiScope()) + .ReverseMap(); + } + + private void CreateIdentityResourceMap() + { + CreateMap() + .ConstructUsing(src => new IdentityServer4.Models.IdentityResource()); + + CreateMap() + .ConstructUsing(x => x.Type) + .ReverseMap() + .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src)); + + CreateMap>() + .ReverseMap(); + CreateMap(); + } + + private void CreatePersistedGrantMap() + { + //TODO: Why PersistedGrant mapping is in this profile? + CreateMap().ReverseMap(); + CreateMap(); + } + private void CreateDeviceFlowCodesMap() + { + CreateMap(); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs index 347b3c4d22..d830da07e0 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs @@ -18,7 +18,8 @@ namespace Volo.Abp.IdentityServer return queryable .Include(x => x.Secrets) .Include(x => x.UserClaims) - .Include(x => x.Scopes); + .Include(x => x.Scopes) + .Include(x => x.Properties); } public static IQueryable IncludeDetails(this IQueryable queryable, bool include = true) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index bf8a8c2df2..53644a1e1c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -67,15 +67,6 @@ namespace Volo.Abp.IdentityServer.ApiScopes .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task> GetListAsync( - bool includeDetails = false, - CancellationToken cancellationToken = default) - { - return await DbSet - .IncludeDetails(includeDetails) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - public virtual async Task CheckNameExistAsync(string name, Guid? expectedId = null, CancellationToken cancellationToken = default) { return await DbSet.AnyAsync(ar => ar.Id != expectedId && ar.Name == name, cancellationToken: cancellationToken); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs index 4d89745874..fd22e97fe4 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs @@ -33,6 +33,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore options.AddRepository(); options.AddRepository(); + options.AddRepository(); options.AddRepository(); options.AddRepository(); options.AddRepository(); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs index db1017b9ab..3178fa02f2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs @@ -34,7 +34,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore #endregion - #region IdentityResource DbSet IdentityResources { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs index f7ccb1d309..c8dc32b183 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs @@ -34,7 +34,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore #endregion - #region IdentityResource public DbSet IdentityResources { get; set; } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 8d96f2c442..b2dba48e15 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -1,10 +1,8 @@ using System; -using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; -using Volo.Abp.EntityFrameworkCore.ValueComparers; -using Volo.Abp.EntityFrameworkCore.ValueConverters; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; @@ -188,31 +186,6 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Value).HasMaxLength(ClientPropertyConsts.ValueMaxLength).IsRequired(); }); - builder.Entity(b => - { - b.ToTable(options.TablePrefix + "PersistedGrants", options.Schema); - - b.ConfigureByConvention(); - - b.Property(x => x.Key).HasMaxLength(PersistedGrantConsts.KeyMaxLength).ValueGeneratedNever(); - b.Property(x => x.Type).HasMaxLength(PersistedGrantConsts.TypeMaxLength).IsRequired(); - b.Property(x => x.SubjectId).HasMaxLength(PersistedGrantConsts.SubjectIdMaxLength); - b.Property(x => x.ClientId).HasMaxLength(PersistedGrantConsts.ClientIdMaxLength).IsRequired(); - b.Property(x => x.CreationTime).IsRequired(); - - if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) - { - PersistedGrantConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. - } - - b.Property(x => x.Data).HasMaxLength(PersistedGrantConsts.DataMaxLengthValue).IsRequired(); - - b.HasKey(x => x.Key); //TODO: What about Id!!! - - b.HasIndex(x => new {x.SubjectId, x.ClientId, x.Type}); - b.HasIndex(x => x.Expiration); - }); - #endregion #region IdentityResource @@ -255,9 +228,9 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Key).HasMaxLength(IdentityResourcePropertyConsts.KeyMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - IdentityResourcePropertyConsts.ValueMaxLengthValue = 300; + IdentityResourcePropertyConsts.ValueMaxLength = 300; } - b.Property(x => x.Value).HasMaxLength(IdentityResourcePropertyConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(IdentityResourcePropertyConsts.ValueMaxLength).IsRequired(); }); #endregion @@ -270,16 +243,16 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); + b.HasIndex(x => x.Name).IsUnique(); + b.Property(x => x.Name).HasMaxLength(ApiResourceConsts.NameMaxLength).IsRequired(); b.Property(x => x.DisplayName).HasMaxLength(ApiResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(ApiResourceConsts.DescriptionMaxLength); - b.Property(x => x.Properties) - .HasConversion(new AbpJsonValueConverter>()) - .Metadata.SetValueComparer(new AbpDictionaryValueComparer()); b.HasMany(x => x.Secrets).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); b.HasMany(x => x.Scopes).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); + b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); }); builder.Entity(b => @@ -291,14 +264,14 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiResourceId, x.Type, x.Value}); b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); - b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { ApiResourceSecretConsts.ValueMaxLengthValue = 300; } - b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLengthValue).IsRequired(); + + b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); }); builder.Entity(b => @@ -323,6 +296,22 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Scope).HasMaxLength(ApiResourceScopeConsts.ScopeMaxLength).IsRequired(); }); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "ApiResourceProperties", options.Schema); + + b.ConfigureByConvention(); + + b.HasKey(x => new {x.ApiResourceId, x.Key}); + + b.Property(x => x.Key).HasMaxLength(ApiResourcePropertyConsts.KeyMaxLength).IsRequired(); + if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) + { + ApiResourcePropertyConsts.ValueMaxLength = 300; + } + b.Property(x => x.Value).HasMaxLength(ApiResourcePropertyConsts.ValueMaxLength).IsRequired(); + }); + #endregion #region ApiScope @@ -340,9 +329,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasIndex(x => x.Name).IsUnique(); b.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); - - //TODO: Identity Server does not configure the relationship of Properties - //b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); + b.HasMany(x => x.Properties).WithOne().HasForeignKey(x => x.ApiScopeId).IsRequired(); }); builder.Entity(b => @@ -351,10 +338,9 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.ApiScopeId, x.Name, x.Type}); + b.HasKey(x => new {x.ApiScopeId, x.Type}); b.Property(x => x.Type).HasMaxLength(UserClaimConsts.TypeMaxLength).IsRequired(); - b.Property(x => x.Name).HasMaxLength(ApiScopeClaimConsts.NameMaxLength).IsRequired(); }); builder.Entity(b => @@ -368,9 +354,41 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Key).HasMaxLength(ApiScopePropertyConsts.KeyMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - ApiScopePropertyConsts.ValueMaxLengthValue = 300; + ApiScopePropertyConsts.ValueMaxLength = 300; } - b.Property(x => x.Value).HasMaxLength(ApiScopePropertyConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(ApiScopePropertyConsts.ValueMaxLength).IsRequired(); + }); + + #endregion + + #region PersistedGrant + + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "PersistedGrants", options.Schema); + + b.ConfigureByConvention(); + + b.Property(x => x.Key).HasMaxLength(PersistedGrantConsts.KeyMaxLength).ValueGeneratedNever(); + b.Property(x => x.Type).HasMaxLength(PersistedGrantConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.SubjectId).HasMaxLength(PersistedGrantConsts.SubjectIdMaxLength); + b.Property(x => x.SessionId).HasMaxLength(PersistedGrantConsts.SessionIdMaxLength); + b.Property(x => x.ClientId).HasMaxLength(PersistedGrantConsts.ClientIdMaxLength).IsRequired(); + b.Property(x => x.Description).HasMaxLength(PersistedGrantConsts.DescriptionMaxLength); + b.Property(x => x.CreationTime).IsRequired(); + + if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) + { + PersistedGrantConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. + } + + b.Property(x => x.Data).HasMaxLength(PersistedGrantConsts.DataMaxLengthValue).IsRequired(); + + b.HasKey(x => x.Key); //TODO: What about Id!!! + + b.HasIndex(x => new {x.SubjectId, x.ClientId, x.Type}); + b.HasIndex(x => new {x.SubjectId, x.SessionId, x.Type}); + b.HasIndex(x => x.Expiration); }); #endregion @@ -386,16 +404,19 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.DeviceCode).HasMaxLength(DeviceFlowCodesConsts.DeviceCodeMaxLength).IsRequired(); b.Property(x => x.UserCode).HasMaxLength(DeviceFlowCodesConsts.UserCodeMaxLength).IsRequired(); b.Property(x => x.SubjectId).HasMaxLength(DeviceFlowCodesConsts.SubjectIdMaxLength); + b.Property(x => x.SessionId).HasMaxLength(DeviceFlowCodesConsts.SessionIdMaxLength); b.Property(x => x.ClientId).HasMaxLength(DeviceFlowCodesConsts.ClientIdMaxLength).IsRequired(); + b.Property(x => x.Description).HasMaxLength(DeviceFlowCodesConsts.DescriptionMaxLength); + b.Property(x => x.CreationTime).IsRequired(); b.Property(x => x.Expiration).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql)) { - DeviceFlowCodesConsts.DataMaxLengthValue = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. + DeviceFlowCodesConsts.DataMaxLength = 10000; //TODO: MySQL accepts 20.000. We can consider to change in v3.0. } - b.Property(x => x.Data).HasMaxLength(DeviceFlowCodesConsts.DataMaxLengthValue).IsRequired(); + b.Property(x => x.Data).HasMaxLength(DeviceFlowCodesConsts.DataMaxLength).IsRequired(); - b.HasIndex(x => new {x.UserCode}).IsUnique(); + b.HasIndex(x => new {x.UserCode}); b.HasIndex(x => x.DeviceCode).IsUnique(); b.HasIndex(x => x.Expiration); }); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 0662482b65..5190687342 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -182,7 +182,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer AccessTokenLifetime = 31536000, //365 days AuthorizationCodeLifetime = 300, IdentityTokenLifetime = 300, - RequireConsent = false, + RequireConsent = true, RequirePkce = false, FrontChannelLogoutUri = frontChannelLogoutUri }, From b2beaa2b0cf3e3ead74a2dffda34e5bedce47aaf Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 11:34:07 +0800 Subject: [PATCH 11/55] Update IdentityServerDataSeedContributor. --- .../IdentityServerDataSeedContributor.cs | 2 +- .../IdentityServerDataSeedContributor.cs | 54 +++++++++++++------ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 5190687342..0662482b65 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -182,7 +182,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer AccessTokenLifetime = 31536000, //365 days AuthorizationCodeLifetime = 300, IdentityTokenLifetime = 300, - RequireConsent = true, + RequireConsent = false, RequirePkce = false, FrontChannelLogoutUri = frontChannelLogoutUri }, diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs index 5c4da23953..7937265409 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs @@ -1,7 +1,8 @@ -using Microsoft.Extensions.Configuration; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using IdentityServer4.Models; +using Microsoft.Extensions.Configuration; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; @@ -11,12 +12,16 @@ using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.PermissionManagement; using Volo.Abp.Uow; +using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; +using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; +using Client = Volo.Abp.IdentityServer.Clients.Client; namespace MyCompanyName.MyProjectName.IdentityServer { public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IApiResourceRepository _apiResourceRepository; + private readonly IApiScopeRepository _apiScopeRepository; private readonly IClientRepository _clientRepository; private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; private readonly IGuidGenerator _guidGenerator; @@ -26,6 +31,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer public IdentityServerDataSeedContributor( IClientRepository clientRepository, IApiResourceRepository apiResourceRepository, + IApiScopeRepository apiScopeRepository, IIdentityResourceDataSeeder identityResourceDataSeeder, IGuidGenerator guidGenerator, IPermissionDataSeeder permissionDataSeeder, @@ -33,6 +39,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer { _clientRepository = clientRepository; _apiResourceRepository = apiResourceRepository; + _apiScopeRepository = apiScopeRepository; _identityResourceDataSeeder = identityResourceDataSeeder; _guidGenerator = guidGenerator; _permissionDataSeeder = permissionDataSeeder; @@ -44,6 +51,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer { await _identityResourceDataSeeder.CreateStandardResourcesAsync(); await CreateApiResourcesAsync(); + await CreateApiScopeAsync(); await CreateClientsAsync(); } @@ -88,10 +96,17 @@ namespace MyCompanyName.MyProjectName.IdentityServer return await _apiResourceRepository.UpdateAsync(apiResource); } - private async Task CreateClientsAsync() + private async Task CreateApiScopeAsync() { - const string commonSecret = "E5Xd4yMqjP5kjWFKrYgySBju6JVfCzMyFp7n2QmMrME="; + var apiScope = await _apiScopeRepository.GetByNameAsync("MyProjectName"); + if (apiScope == null) + { + await _apiScopeRepository.InsertAsync(new ApiScope(_guidGenerator.Create(), "MyProjectName", "MyProjectName API"), autoSave: true); + } + } + private async Task CreateClientsAsync() + { var commonScopes = new[] { "email", @@ -100,6 +115,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer "role", "phone", "address", + "MyProjectName" }; @@ -110,25 +126,30 @@ namespace MyCompanyName.MyProjectName.IdentityServer if (!webClientId.IsNullOrWhiteSpace()) { var webClientRootUrl = configurationSection["MyProjectName_Web:RootUrl"].EnsureEndsWith('/'); + + /* MyProjectName_Web client is only needed if you created a tiered + * solution. Otherwise, you can delete this client. */ + await CreateClientAsync( - webClientId, - commonScopes, - new[] { "hybrid" }, - commonSecret, + name: webClientId, + scopes: commonScopes, + grantTypes: new[] {"hybrid"}, + secret: (configurationSection["MyProjectName_Web:ClientSecret"] ?? "1q2w3e*").Sha256(), redirectUri: $"{webClientRootUrl}signin-oidc", - postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc" + postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc", + frontChannelLogoutUri: $"{webClientRootUrl}Account/FrontChannelLogout" ); } //Console Test Client - var consoleClientId = configurationSection["MyProjectName_ConsoleTestApp:ClientId"]; + var consoleClientId = configurationSection["MyProjectName_App:ClientId"]; if (!consoleClientId.IsNullOrWhiteSpace()) { await CreateClientAsync( - consoleClientId, - commonScopes, - new[] { "password", "client_credentials" }, - commonSecret + name: consoleClientId, + scopes: commonScopes, + grantTypes: new[] {"password", "client_credentials"}, + secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256() ); } } @@ -140,6 +161,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer string secret, string redirectUri = null, string postLogoutRedirectUri = null, + string frontChannelLogoutUri = null, IEnumerable permissions = null) { var client = await _clientRepository.FindByCliendIdAsync(name); @@ -160,7 +182,9 @@ namespace MyCompanyName.MyProjectName.IdentityServer AccessTokenLifetime = 31536000, //365 days AuthorizationCodeLifetime = 300, IdentityTokenLifetime = 300, - RequireConsent = false + RequireConsent = false, + RequirePkce = false, + FrontChannelLogoutUri = frontChannelLogoutUri }, autoSave: true ); From cf75e6cdb3f5d92edf911fc5c879a553f9cfd19a Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 13:09:56 +0800 Subject: [PATCH 12/55] Update app template migrations. --- ....cs => 20200707050900_Initial.Designer.cs} | 67 +++++++++++++------ ...8_Initial.cs => 20200707050900_Initial.cs} | 56 ++++++++++++---- ...ectNameMigrationsDbContextModelSnapshot.cs | 65 +++++++++++++----- 3 files changed, 138 insertions(+), 50 deletions(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200706091528_Initial.Designer.cs => 20200707050900_Initial.Designer.cs} (97%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200706091528_Initial.cs => 20200707050900_Initial.cs} (96%) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs similarity index 97% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs index e3441488a9..ee4de4f358 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200706091528_Initial")] + [Migration("20200707050900_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -863,6 +863,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => { b.Property("Id") @@ -928,14 +947,14 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerApiResources"); }); @@ -981,8 +1000,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1076,15 +1095,11 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - b.Property("Type") .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.HasKey("ApiScopeId", "Name", "Type"); + b.HasKey("ApiScopeId", "Type"); b.ToTable("IdentityServerApiScopeClaims"); }); @@ -1426,8 +1441,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1468,7 +1483,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(50000); b.Property("Description") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); b.Property("DeviceCode") .IsRequired() @@ -1484,7 +1500,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)"); b.Property("SessionId") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("SubjectId") .HasColumnType("nvarchar(200)") @@ -1502,8 +1519,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("Expiration"); - b.HasIndex("UserCode") - .IsUnique(); + b.HasIndex("UserCode"); b.ToTable("IdentityServerDeviceFlowCodes"); }); @@ -1537,7 +1553,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(50000); b.Property("Description") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1550,7 +1567,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("SessionId") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("SubjectId") .HasColumnType("nvarchar(200)") @@ -1567,6 +1585,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("SubjectId", "ClientId", "Type"); + b.HasIndex("SubjectId", "SessionId", "Type"); + b.ToTable("IdentityServerPersistedGrants"); }); @@ -1937,6 +1957,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => { b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs similarity index 96% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs index 36c8079aa1..48726d777b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200706091528_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs @@ -250,8 +250,7 @@ namespace MyCompanyName.MyProjectName.Migrations Description = table.Column(maxLength: 1000, nullable: true), Enabled = table.Column(nullable: false), AllowedAccessTokenSigningAlgorithms = table.Column(nullable: true), - ShowInDiscoveryDocument = table.Column(nullable: false), - Properties = table.Column(nullable: true) + ShowInDiscoveryDocument = table.Column(nullable: false) }, constraints: table => { @@ -356,9 +355,9 @@ namespace MyCompanyName.MyProjectName.Migrations DeviceCode = table.Column(maxLength: 200, nullable: false), UserCode = table.Column(maxLength: 200, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), - SessionId = table.Column(nullable: true), + SessionId = table.Column(maxLength: 100, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), - Description = table.Column(nullable: true), + Description = table.Column(maxLength: 200, nullable: true), Expiration = table.Column(nullable: false), Data = table.Column(maxLength: 50000, nullable: false) }, @@ -404,9 +403,9 @@ namespace MyCompanyName.MyProjectName.Migrations ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Type = table.Column(maxLength: 50, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), - SessionId = table.Column(nullable: true), + SessionId = table.Column(maxLength: 100, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), - Description = table.Column(nullable: true), + Description = table.Column(maxLength: 200, nullable: true), CreationTime = table.Column(nullable: false), Expiration = table.Column(nullable: true), ConsumedTime = table.Column(nullable: true), @@ -667,6 +666,25 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceProperties", + columns: table => new + { + ApiResourceId = table.Column(nullable: false), + Key = table.Column(maxLength: 250, nullable: false), + Value = table.Column(maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceProperties", x => new { x.ApiResourceId, x.Key }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceProperties_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "IdentityServerApiResourceScopes", columns: table => new @@ -692,7 +710,7 @@ namespace MyCompanyName.MyProjectName.Migrations Type = table.Column(maxLength: 250, nullable: false), Value = table.Column(maxLength: 4000, nullable: false), ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), Expiration = table.Column(nullable: true) }, constraints: table => @@ -711,12 +729,11 @@ namespace MyCompanyName.MyProjectName.Migrations columns: table => new { Type = table.Column(maxLength: 200, nullable: false), - ApiScopeId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false) + ApiScopeId = table.Column(nullable: false) }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiScopeId, x.Name, x.Type }); + table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiScopeId, x.Type }); table.ForeignKey( name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiScopeId", column: x => x.ApiScopeId, @@ -897,7 +914,7 @@ namespace MyCompanyName.MyProjectName.Migrations Type = table.Column(maxLength: 250, nullable: false), Value = table.Column(maxLength: 4000, nullable: false), ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), Expiration = table.Column(nullable: true) }, constraints: table => @@ -1096,6 +1113,12 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpUsers", column: "UserName"); + migrationBuilder.CreateIndex( + name: "IX_IdentityServerApiResources_Name", + table: "IdentityServerApiResources", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_IdentityServerApiScopes_Name", table: "IdentityServerApiScopes", @@ -1121,8 +1144,7 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.CreateIndex( name: "IX_IdentityServerDeviceFlowCodes_UserCode", table: "IdentityServerDeviceFlowCodes", - column: "UserCode", - unique: true); + column: "UserCode"); migrationBuilder.CreateIndex( name: "IX_IdentityServerIdentityResources_Name", @@ -1139,6 +1161,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", table: "IdentityServerPersistedGrants", columns: new[] { "SubjectId", "ClientId", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_SubjectId_SessionId_Type", + table: "IdentityServerPersistedGrants", + columns: new[] { "SubjectId", "SessionId", "Type" }); } protected override void Down(MigrationBuilder migrationBuilder) @@ -1191,6 +1218,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "IdentityServerApiResourceClaims"); + migrationBuilder.DropTable( + name: "IdentityServerApiResourceProperties"); + migrationBuilder.DropTable( name: "IdentityServerApiResourceScopes"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index 3e52c652ed..bfcb19749d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -861,6 +861,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => { b.Property("Id") @@ -926,14 +945,14 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerApiResources"); }); @@ -979,8 +998,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1074,15 +1093,11 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - b.Property("Type") .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.HasKey("ApiScopeId", "Name", "Type"); + b.HasKey("ApiScopeId", "Type"); b.ToTable("IdentityServerApiScopeClaims"); }); @@ -1424,8 +1439,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1466,7 +1481,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(50000); b.Property("Description") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); b.Property("DeviceCode") .IsRequired() @@ -1482,7 +1498,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)"); b.Property("SessionId") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("SubjectId") .HasColumnType("nvarchar(200)") @@ -1500,8 +1517,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("Expiration"); - b.HasIndex("UserCode") - .IsUnique(); + b.HasIndex("UserCode"); b.ToTable("IdentityServerDeviceFlowCodes"); }); @@ -1535,7 +1551,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(50000); b.Property("Description") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1548,7 +1565,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("SessionId") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("SubjectId") .HasColumnType("nvarchar(200)") @@ -1565,6 +1583,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("SubjectId", "ClientId", "Type"); + b.HasIndex("SubjectId", "SessionId", "Type"); + b.ToTable("IdentityServerPersistedGrants"); }); @@ -1935,6 +1955,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => { b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) From 7a885cfe9abec492bb2483ed01076ace8e1b83dd Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 14:31:30 +0800 Subject: [PATCH 13/55] Update Consent page. --- .../ConsentOptions.cs | 17 -- .../Pages/Consent.cshtml | 74 +++--- .../Pages/Consent.cshtml.cs | 243 ++++++++---------- .../Pages/Account/LoggedOut.cshtml | 6 +- 4 files changed, 142 insertions(+), 198 deletions(-) delete mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs deleted file mode 100644 index 3aaafd5d11..0000000000 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/ConsentOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Volo.Abp.Account.Web -{ - public class ConsentOptions - { - public static bool EnableOfflineAccess = true; - - public static string OfflineAccessDisplayName = "Offline Access"; - - public static string OfflineAccessDescription = "Access to your applications and resources, even when you are offline"; - - //TODO: How to handle this - public static readonly string MustChooseOneErrorMessage = "You must pick at least one permission"; - - //TODO: How to handle this - public static readonly string InvalidSelectionErrorMessage = "Invalid selection"; - } -} diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml index 5060e55a99..8fb7e918e1 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml @@ -1,17 +1,18 @@ @page @using Volo.Abp.Account.Web.Pages +@using Volo.Abp.Account.Web.Pages.Account @model ConsentModel

- @if (Model.Consent.ClientLogoUrl != null) + @if (Model.ClientInfo.ClientLogoUrl != null) { - + } - @Model.Consent.ClientName + @Model.ClientInfo.ClientName is requesting your permission

@@ -24,62 +25,59 @@
Uncheck the permissions you do not wish to grant.
- @if (!Model.Consent.IdentityScopes.IsNullOrEmpty()) + @if (!Model.ConsentInput.IdentityScopes.IsNullOrEmpty()) {

Personal Information

    - - @for (var i = 0; i < Model.Consent.IdentityScopes.Count; i++) + @for (var i = 0; i < Model.ConsentInput.IdentityScopes.Count; i++) {
  • -
    - @* TODO: Use attributes on the view model instead of using hidden here *@ - @if (Model.Consent.IdentityScopes[i].Description != null) + @* TODO: Use attributes on the view model instead of using hidden here *@ + @if (Model.ConsentInput.IdentityScopes[i].Description != null) { }
  • } -
} - @if (!Model.Consent.ApiScopes.IsNullOrEmpty()) + @if (!Model.ConsentInput.ApiScopes.IsNullOrEmpty()) {

Application Access

    - - @for (var i = 0; i < Model.Consent.ApiScopes.Count; i++) + @for (var i = 0; i < Model.ConsentInput.ApiScopes.Count; i++) {
  • -
    - @* TODO: Use attributes on the view model instead of using hidden here *@ - @if (Model.Consent.ApiScopes[i].Description != null) + @* TODO: Use attributes on the view model instead of using hidden here *@ + @if (Model.ConsentInput.ApiScopes[i].Description != null) { }
  • @@ -87,35 +85,23 @@
} -
-
-
- - Description -
-
- -
-
-
- - @if (Model.Consent.AllowRememberConsent) + @if (Model.ClientInfo.AllowRememberConsent) {
-
}
diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs index d957e3b84a..a1faba16a7 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Consent.cshtml.cs @@ -3,13 +3,13 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; -using IdentityServer4.Extensions; using IdentityServer4.Models; using IdentityServer4.Services; using IdentityServer4.Stores; using IdentityServer4.Validation; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.UI; namespace Volo.Abp.Account.Web.Pages { @@ -25,7 +25,9 @@ namespace Volo.Abp.Account.Web.Pages public string ReturnUrlHash { get; set; } [BindProperty] - public ConsentViewModel Consent { get; set; } + public ConsentModel.ConsentInputModel ConsentInput { get; set; } + + public ClientInfoModel ClientInfo { get; set; } private readonly IIdentityServerInteractionService _interaction; private readonly IClientStore _clientStore; @@ -43,7 +45,49 @@ namespace Volo.Abp.Account.Web.Pages public virtual async Task OnGet() { - Consent = await BuildViewModelAsync(ReturnUrl); + var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); + if (request == null) + { + throw new ApplicationException($"No consent request matching request: {ReturnUrl}"); + } + + var client = await _clientStore.FindEnabledClientByIdAsync(request.Client.ClientId); + if (client == null) + { + throw new ApplicationException($"Invalid client id: {request.Client.ClientId}"); + } + + var resources = await _resourceStore.FindEnabledResourcesByScopeAsync(request.ValidatedResources.RawScopeValues); + if (resources == null || (!resources.IdentityResources.Any() && !resources.ApiResources.Any())) + { + throw new ApplicationException($"No scopes matching: {request.ValidatedResources.RawScopeValues.Aggregate((x, y) => x + ", " + y)}"); + } + + ClientInfo = new ClientInfoModel(client); + ConsentInput = new ConsentInputModel + { + RememberConsent = true, + IdentityScopes = resources.IdentityResources.Select(x => CreateScopeViewModel(x, true)).ToList(), + }; + + var apiScopes = new List(); + foreach(var parsedScope in request.ValidatedResources.ParsedScopes) + { + var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName); + if (apiScope != null) + { + var scopeVm = CreateScopeViewModel(parsedScope, apiScope, true); + apiScopes.Add(scopeVm); + } + } + + if (resources.OfflineAccess) + { + apiScopes.Add(GetOfflineAccessScope(true)); + } + + ConsentInput.ApiScopes = apiScopes; + return Page(); } @@ -65,137 +109,56 @@ namespace Volo.Abp.Account.Web.Pages throw new ApplicationException("Unknown Error!"); } - protected virtual async Task ProcessConsentAsync() + protected virtual async Task ProcessConsentAsync() { - var result = new ProcessConsentResult(); + var result = new ConsentModel.ProcessConsentResult(); - // validate return url is still valid - var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); - if (request == null) - { - return result; - } - - ConsentResponse grantedConsent = null; + ConsentResponse grantedConsent; - // user clicked 'no' - send back the standard 'access_denied' response - if (Consent?.Button == "no") + if (ConsentInput.UserDecision == "no") { - grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied }; - // emit event - //await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); + grantedConsent = new ConsentResponse + { + Error = AuthorizationError.AccessDenied + }; } - // user clicked 'yes' - validate the data - else if (Consent?.Button == "yes") + else { - Consent.ScopesConsented = - Consent.ApiScopes.Union(Consent.IdentityScopes).Distinct().Select(x => x.Value).ToList(); - // if the user consented to some scope, build the response model - if (!Consent.ScopesConsented.IsNullOrEmpty()) + if (!ConsentInput.IdentityScopes.IsNullOrEmpty() || !ConsentInput.ApiScopes.IsNullOrEmpty()) { - var scopes = Consent.ScopesConsented; - if (ConsentOptions.EnableOfflineAccess == false) - { - scopes = scopes.Where(x => x != IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess).ToList(); - } - grantedConsent = new ConsentResponse { - RememberConsent = Consent.RememberConsent, - ScopesValuesConsented = scopes.ToArray(), - Description = Consent.Description + RememberConsent = ConsentInput.RememberConsent, + ScopesValuesConsented = ConsentInput.GetAllowedScopeNames() }; - - // emit event - //await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); } else { - //throw new UserFriendlyException("You must pick at least one permission"); //TODO: How to handle this - result.ValidationError = ConsentOptions.MustChooseOneErrorMessage; + throw new UserFriendlyException("You must pick at least one permission"); //TODO: How to handle this } } - else - { - result.ValidationError = ConsentOptions.InvalidSelectionErrorMessage; - } if (grantedConsent != null) { - // communicate outcome of consent back to identityserver - await _interaction.GrantConsentAsync(request, grantedConsent); - - // indicate that's it ok to redirect back to authorization endpoint - result.RedirectUri = ReturnUrl; //TODO: ReturnUrlHash? - result.Client = request.Client; - } - else - { - // we need to redisplay the consent UI - - result.ViewModel = await BuildViewModelAsync(ReturnUrl, Consent); - } - - return result; - } - - private async Task BuildViewModelAsync(string returnUrl, ConsentInputModel model = null) - { - var request = await _interaction.GetAuthorizationContextAsync(returnUrl); - if (request != null) - { - return CreateConsentViewModel(model, returnUrl, request); - } - - throw new ApplicationException($"No consent request matching request: {returnUrl}"); - } - - private ConsentViewModel CreateConsentViewModel(ConsentInputModel model, string returnUrl, AuthorizationRequest request) - { - var consentViewModel = new ConsentViewModel - { - RememberConsent = model?.RememberConsent ?? true, - ScopesConsented = model?.ScopesConsented ?? new List(), - Description = model?.Description, - - ClientName = request.Client.ClientName ?? request.Client.ClientId, - ClientUrl = request.Client.ClientUri, - ClientLogoUrl = request.Client.LogoUri, - AllowRememberConsent = request.Client.AllowRememberConsent - }; - - consentViewModel.IdentityScopes = request.ValidatedResources.Resources.IdentityResources.Select(x => - CreateScopeViewModel(x, consentViewModel.ScopesConsented.Contains(x.Name) || model == null)) - .ToList(); - - var apiScopes = new List(); - foreach(var parsedScope in request.ValidatedResources.ParsedScopes) - { - var apiScope = request.ValidatedResources.Resources.FindApiScope(parsedScope.ParsedName); - if (apiScope != null) + var request = await _interaction.GetAuthorizationContextAsync(ReturnUrl); + if (request == null) { - var scopeVm = CreateScopeViewModel(parsedScope, apiScope, - consentViewModel.ScopesConsented.Contains(parsedScope.RawValue) || model == null); - apiScopes.Add(scopeVm); + return result; } - } - if (ConsentOptions.EnableOfflineAccess && request.ValidatedResources.Resources.OfflineAccess) - { - apiScopes.Add(GetOfflineAccessScope(consentViewModel.ScopesConsented.Contains(IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess) || model == null)); - } + await _interaction.GrantConsentAsync(request, grantedConsent); - consentViewModel.ApiScopes = apiScopes; + result.RedirectUri = ReturnUrl; //TODO: ReturnUrlHash? + } - return consentViewModel; + return result; } - - protected virtual ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) + protected virtual ConsentModel.ScopeViewModel CreateScopeViewModel(IdentityResource identity, bool check) { - return new ScopeViewModel + return new ConsentModel.ScopeViewModel { - Value = identity.Name, + Name = identity.Name, DisplayName = identity.DisplayName, Description = identity.Description, Emphasize = identity.Emphasize, @@ -204,7 +167,7 @@ namespace Volo.Abp.Account.Web.Pages }; } - protected virtual ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check) + protected virtual ConsentModel.ScopeViewModel CreateScopeViewModel(ParsedScopeValue parsedScopeValue, ApiScope apiScope, bool check) { var displayName = apiScope.DisplayName ?? apiScope.Name; if (!string.IsNullOrWhiteSpace(parsedScopeValue.ParsedParameter)) @@ -214,7 +177,7 @@ namespace Volo.Abp.Account.Web.Pages return new ScopeViewModel { - Value = parsedScopeValue.RawValue, + Name = parsedScopeValue.RawValue, DisplayName = displayName, Description = apiScope.Description, Emphasize = apiScope.Emphasize, @@ -223,11 +186,11 @@ namespace Volo.Abp.Account.Web.Pages }; } - protected virtual ScopeViewModel GetOfflineAccessScope(bool check) + protected virtual ConsentModel.ScopeViewModel GetOfflineAccessScope(bool check) { - return new ScopeViewModel + return new ConsentModel.ScopeViewModel { - Value = IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess, + Name = IdentityServer4.IdentityServerConstants.StandardScopes.OfflineAccess, DisplayName = "Offline Access", //TODO: Localize Description = "Access to your applications and resources, even when you are offline", Emphasize = true, @@ -237,36 +200,28 @@ namespace Volo.Abp.Account.Web.Pages public class ConsentInputModel { - [Required] - public string Button { get; set; } + public List IdentityScopes { get; set; } - public List ScopesConsented { get; set; } + public List ApiScopes { get; set; } - public bool RememberConsent { get; set; } - - public string Description { get; set; } - } - - - public class ConsentViewModel : ConsentInputModel - { - public string ClientName { get; set; } - public string ClientUrl { get; set; } - - public string ClientLogoUrl { get; set; } - - public bool AllowRememberConsent { get; set; } + [Required] + public string UserDecision { get; set; } - public List IdentityScopes { get; set; } + public bool RememberConsent { get; set; } - public List ApiScopes { get; set; } + public List GetAllowedScopeNames() + { + var identityScopes = IdentityScopes ?? new List(); + var apiScopes = ApiScopes ?? new List(); + return identityScopes.Union(apiScopes).Where(s => s.Checked).Select(s => s.Name).ToList(); + } } public class ScopeViewModel { [Required] [HiddenInput] - public string Value { get; set; } + public string Name { get; set; } public bool Checked { get; set; } @@ -283,13 +238,29 @@ namespace Volo.Abp.Account.Web.Pages { public bool IsRedirect => RedirectUri != null; public string RedirectUri { get; set; } - public Client Client { get; set; } - - public bool ShowView => ViewModel != null; - public ConsentViewModel ViewModel { get; set; } public bool HasValidationError => ValidationError != null; public string ValidationError { get; set; } } + + public class ClientInfoModel + { + public string ClientName { get; set; } + + public string ClientUrl { get; set; } + + public string ClientLogoUrl { get; set; } + + public bool AllowRememberConsent { get; set; } + + public ClientInfoModel(Client client) + { + //TODO: Automap + ClientName = client.ClientId; + ClientUrl = client.ClientUri; + ClientLogoUrl = client.LogoUri; + AllowRememberConsent = client.AllowRememberConsent; + } + } } } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml index 0e7b14236a..fdea548c76 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml @@ -3,8 +3,12 @@ @using Volo.Abp.Account.Localization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.Account.Web.Pages.Account +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@inject IThemeManager ThemeManager @inject IHtmlLocalizer L - +@{ + Layout = ThemeManager.CurrentTheme.GetApplicationLayout(); +} @section scripts { From 1fa69f0c9f69c20b736c28ec2c2e6b9c10e18da0 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 14:47:16 +0800 Subject: [PATCH 14/55] Update IdentityServerDbContext. --- ...piResourceSecretConsts.cs => SecretConsts.cs} | 6 ++---- .../IIdentityServerDbContext.cs | 3 +++ .../IdentityServerDbContext.cs | 3 +++ ...tityServerDbContextModelCreatingExtensions.cs | 16 ++++++++-------- 4 files changed, 16 insertions(+), 12 deletions(-) rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/{ApiResources/ApiResourceSecretConsts.cs => SecretConsts.cs} (72%) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs similarity index 72% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs index f2692d1653..f3b7f2c5df 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs @@ -1,6 +1,6 @@ -namespace Volo.Abp.IdentityServer.ApiResources +namespace Volo.Abp.IdentityServer { - public class ApiResourceSecretConsts + public class SecretConsts { /// /// Default value: 250 @@ -12,8 +12,6 @@ /// public static int ValueMaxLength { get; set; } = 4000; - public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; - /// /// Default value: 1000 /// diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs index 3178fa02f2..75343419a8 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IIdentityServerDbContext.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; @@ -22,6 +23,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore DbSet ApiResourceScopes { get; set; } + DbSet ApiResourceProperties { get; set; } + #endregion #region ApiScope diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs index c8dc32b183..9bff7f13a1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContext.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; @@ -22,6 +23,8 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore public DbSet ApiResourceScopes { get; set; } + public DbSet ApiResourceProperties { get; set; } + #endregion #region ApiScope diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index b2dba48e15..25a0d7605f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -128,16 +128,16 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ClientId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - ApiResourceSecretConsts.ValueMaxLengthValue = 300; + SecretConsts.ValueMaxLengthValue = 300; } - b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); - b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); + b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); }); builder.Entity(b => @@ -263,15 +263,15 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiResourceId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - ApiResourceSecretConsts.ValueMaxLengthValue = 300; + SecretConsts.ValueMaxLengthValue = 300; } - b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); - b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); + b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); }); builder.Entity(b => From 43181eef5748929b7502642606b725b539793169 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 14:48:10 +0800 Subject: [PATCH 15/55] Update IdentityServerDbContextModelCreatingExtensions. --- .../IdentityServerDbContextModelCreatingExtensions.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 25a0d7605f..e78ac0bc95 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -132,10 +132,10 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLengthValue = 300; + SecretConsts.ValueMaxLength = 300; } - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLength).IsRequired(); b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); }); @@ -267,9 +267,9 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLengthValue = 300; + SecretConsts.ValueMaxLength = 300; } - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLengthValue).IsRequired(); + b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLength).IsRequired(); b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); }); From cee969f7bb80f61a3f85b7a51a347ca951635677 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 16:07:20 +0800 Subject: [PATCH 16/55] Recreate Template projects migrations. --- .../ApiResources/ApiResourceConsts.cs | 6 +- .../ApiResourceSecretConsts.cs} | 4 +- .../IdentityServer/Clients/ClientConsts.cs | 2 + .../Clients/ClientSecretConsts.cs | 20 ++ .../IdentityServer/Clients/ClientProperty.cs | 4 +- ...yServerDbContextModelCreatingExtensions.cs | 29 +- ....cs => 20200707075540_Initial.Designer.cs} | 24 +- ...0_Initial.cs => 20200707075540_Initial.cs} | 14 +- ...ectNameMigrationsDbContextModelSnapshot.cs | 22 +- ....cs => 20200707075532_Initial.Designer.cs} | 294 ++++++++++++++---- ...1_Initial.cs => 20200707075532_Initial.cs} | 217 ++++++++++--- ...verHostMigrationsDbContextModelSnapshot.cs | 292 +++++++++++++---- ....cs => 20200707075539_Initial.Designer.cs} | 2 +- ...0_Initial.cs => 20200707075539_Initial.cs} | 0 14 files changed, 706 insertions(+), 224 deletions(-) rename modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/{SecretConsts.cs => ApiResources/ApiResourceSecretConsts.cs} (82%) create mode 100644 modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientSecretConsts.cs rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200707050900_Initial.Designer.cs => 20200707075540_Initial.Designer.cs} (99%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200707050900_Initial.cs => 20200707075540_Initial.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20200624023331_Initial.Designer.cs => 20200707075532_Initial.Designer.cs} (89%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20200624023331_Initial.cs => 20200707075532_Initial.cs} (87%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200624023340_Initial.Designer.cs => 20200707075539_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200624023340_Initial.cs => 20200707075539_Initial.cs} (100%) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs index 9a023c435b..05719fbc8f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceConsts.cs @@ -4,8 +4,10 @@ { public static int NameMaxLength { get; set; } = 200; - public static int DisplayNameMaxLength { get; set; } = 200; + public static int DisplayNameMaxLength { get; set; } = 200; - public static int DescriptionMaxLength { get; set; } = 1000; + public static int DescriptionMaxLength { get; set; } = 1000; + + public static int AllowedAccessTokenSigningAlgorithmsMaxLength { get; set; } = 100; } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs similarity index 82% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs index f3b7f2c5df..523bc147b1 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecretConsts.cs @@ -1,6 +1,6 @@ -namespace Volo.Abp.IdentityServer +namespace Volo.Abp.IdentityServer.ApiResources { - public class SecretConsts + public class ApiResourceSecretConsts { /// /// Default value: 250 diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs index 4331ab7064..e76411d0ed 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs @@ -23,5 +23,7 @@ public static int PairWiseSubjectSaltMaxLength { get; set; } = 200; public static int UserCodeTypeMaxLength { get; set; } = 100; + + public static int AllowedIdentityTokenSigningAlgorithms { get; set; } = 100; } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientSecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientSecretConsts.cs new file mode 100644 index 0000000000..60eb0807d1 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientSecretConsts.cs @@ -0,0 +1,20 @@ +namespace Volo.Abp.IdentityServer.Clients +{ + public class ClientSecretConsts + { + /// + /// Default value: 250 + /// + public static int TypeMaxLength { get; set; } = 250; + + /// + /// Default value: 4000 + /// + public static int ValueMaxLength { get; set; } = 4000; + + /// + /// Default value: 2000 + /// + public static int DescriptionMaxLength { get; set; } = 2000; + } +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientProperty.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientProperty.cs index daddd94e83..7347f1cc7c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientProperty.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientProperty.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.IdentityServer.Clients } - public virtual bool Equals(Guid clientId, [NotNull] string key, string value) + public virtual bool Equals(Guid clientId, [NotNull] string key, [NotNull] string value) { return ClientId == clientId && Key == key && Value == value; } @@ -36,4 +36,4 @@ namespace Volo.Abp.IdentityServer.Clients return new object[] { ClientId, Key }; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index e78ac0bc95..20a99c082e 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -50,6 +50,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.ClientClaimsPrefix).HasMaxLength(ClientConsts.ClientClaimsPrefixMaxLength); b.Property(x => x.PairWiseSubjectSalt).HasMaxLength(ClientConsts.PairWiseSubjectSaltMaxLength); b.Property(x => x.UserCodeType).HasMaxLength(ClientConsts.UserCodeTypeMaxLength); + b.Property(x => x.AllowedIdentityTokenSigningAlgorithms).HasMaxLength(ClientConsts.AllowedIdentityTokenSigningAlgorithms); b.HasMany(x => x.AllowedScopes).WithOne().HasForeignKey(x => x.ClientId).IsRequired(); b.HasMany(x => x.ClientSecrets).WithOne().HasForeignKey(x => x.ClientId).IsRequired(); @@ -128,16 +129,13 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ClientId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); - + b.Property(x => x.Type).HasMaxLength(ClientSecretConsts.TypeMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLength = 300; + ClientSecretConsts.ValueMaxLength = 300; } - - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLength).IsRequired(); - - b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); + b.Property(x => x.Value).HasMaxLength(ClientSecretConsts.ValueMaxLength).IsRequired(); + b.Property(x => x.Description).HasMaxLength(ClientSecretConsts.DescriptionMaxLength); }); builder.Entity(b => @@ -180,7 +178,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.ClientId, x.Key}); + b.HasKey(x => new {x.ClientId, x.Key, x.Value}); b.Property(x => x.Key).HasMaxLength(ClientPropertyConsts.KeyMaxLength).IsRequired(); b.Property(x => x.Value).HasMaxLength(ClientPropertyConsts.ValueMaxLength).IsRequired(); @@ -223,7 +221,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.IdentityResourceId, x.Key}); + b.HasKey(x => new {x.IdentityResourceId, x.Key, x.Value}); b.Property(x => x.Key).HasMaxLength(IdentityResourcePropertyConsts.KeyMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) @@ -248,6 +246,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.Property(x => x.Name).HasMaxLength(ApiResourceConsts.NameMaxLength).IsRequired(); b.Property(x => x.DisplayName).HasMaxLength(ApiResourceConsts.DisplayNameMaxLength); b.Property(x => x.Description).HasMaxLength(ApiResourceConsts.DescriptionMaxLength); + b.Property(x => x.AllowedAccessTokenSigningAlgorithms).HasMaxLength(ApiResourceConsts.AllowedAccessTokenSigningAlgorithmsMaxLength); b.HasMany(x => x.Secrets).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); b.HasMany(x => x.Scopes).WithOne().HasForeignKey(x => x.ApiResourceId).IsRequired(); @@ -263,15 +262,15 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.HasKey(x => new {x.ApiResourceId, x.Type, x.Value}); - b.Property(x => x.Type).HasMaxLength(SecretConsts.TypeMaxLength).IsRequired(); + b.Property(x => x.Type).HasMaxLength(ApiResourceSecretConsts.TypeMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) { - SecretConsts.ValueMaxLength = 300; + ApiResourceSecretConsts.ValueMaxLength = 300; } - b.Property(x => x.Value).HasMaxLength(SecretConsts.ValueMaxLength).IsRequired(); + b.Property(x => x.Value).HasMaxLength(ApiResourceSecretConsts.ValueMaxLength).IsRequired(); - b.Property(x => x.Description).HasMaxLength(SecretConsts.DescriptionMaxLength); + b.Property(x => x.Description).HasMaxLength(ApiResourceSecretConsts.DescriptionMaxLength); }); builder.Entity(b => @@ -302,7 +301,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.ApiResourceId, x.Key}); + b.HasKey(x => new {x.ApiResourceId, x.Key, x.Value}); b.Property(x => x.Key).HasMaxLength(ApiResourcePropertyConsts.KeyMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) @@ -349,7 +348,7 @@ namespace Volo.Abp.IdentityServer.EntityFrameworkCore b.ConfigureByConvention(); - b.HasKey(x => new {x.ApiScopeId, x.Key}); + b.HasKey(x => new {x.ApiScopeId, x.Key, x.Value}); b.Property(x => x.Key).HasMaxLength(ApiScopePropertyConsts.KeyMaxLength).IsRequired(); if (IsDatabaseProvider(builder, options, EfCoreDatabaseProvider.MySql, EfCoreDatabaseProvider.Oracle)) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs index ee4de4f358..fadec16eaf 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200707050900_Initial")] + [Migration("20200707075540_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -873,11 +873,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ApiResourceId", "Key"); + b.HasKey("ApiResourceId", "Key", "Value"); b.ToTable("IdentityServerApiResourceProperties"); }); @@ -889,7 +888,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AllowedAccessTokenSigningAlgorithms") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("ConcurrencyStamp") .IsConcurrencyToken() @@ -1114,11 +1114,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ApiScopeId", "Key"); + b.HasKey("ApiScopeId", "Key", "Value"); b.ToTable("IdentityServerApiScopeProperties"); }); @@ -1151,7 +1150,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("AllowedIdentityTokenSigningAlgorithms") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1390,11 +1390,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ClientId", "Key"); + b.HasKey("ClientId", "Key", "Value"); b.ToTable("IdentityServerClientProperties"); }); @@ -1441,8 +1440,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1693,11 +1692,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("IdentityResourceId", "Key"); + b.HasKey("IdentityResourceId", "Key", "Value"); b.ToTable("IdentityServerIdentityResourceProperties"); }); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs similarity index 99% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs index 48726d777b..669982f451 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707050900_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs @@ -249,7 +249,7 @@ namespace MyCompanyName.MyProjectName.Migrations DisplayName = table.Column(maxLength: 200, nullable: true), Description = table.Column(maxLength: 1000, nullable: true), Enabled = table.Column(nullable: false), - AllowedAccessTokenSigningAlgorithms = table.Column(nullable: true), + AllowedAccessTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), ShowInDiscoveryDocument = table.Column(nullable: false) }, constraints: table => @@ -319,7 +319,7 @@ namespace MyCompanyName.MyProjectName.Migrations BackChannelLogoutSessionRequired = table.Column(nullable: false), AllowOfflineAccess = table.Column(nullable: false), IdentityTokenLifetime = table.Column(nullable: false), - AllowedIdentityTokenSigningAlgorithms = table.Column(nullable: true), + AllowedIdentityTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), AccessTokenLifetime = table.Column(nullable: false), AuthorizationCodeLifetime = table.Column(nullable: false), ConsentLifetime = table.Column(nullable: true), @@ -676,7 +676,7 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiResourceProperties", x => new { x.ApiResourceId, x.Key }); + table.PrimaryKey("PK_IdentityServerApiResourceProperties", x => new { x.ApiResourceId, x.Key, x.Value }); table.ForeignKey( name: "FK_IdentityServerApiResourceProperties_IdentityServerApiResources_ApiResourceId", column: x => x.ApiResourceId, @@ -752,7 +752,7 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiScopeProperties", x => new { x.ApiScopeId, x.Key }); + table.PrimaryKey("PK_IdentityServerApiScopeProperties", x => new { x.ApiScopeId, x.Key, x.Value }); table.ForeignKey( name: "FK_IdentityServerApiScopeProperties_IdentityServerApiScopes_ApiScopeId", column: x => x.ApiScopeId, @@ -862,7 +862,7 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); + table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key, x.Value }); table.ForeignKey( name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", column: x => x.ClientId, @@ -914,7 +914,7 @@ namespace MyCompanyName.MyProjectName.Migrations Type = table.Column(maxLength: 250, nullable: false), Value = table.Column(maxLength: 4000, nullable: false), ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 1000, nullable: true), + Description = table.Column(maxLength: 2000, nullable: true), Expiration = table.Column(nullable: true) }, constraints: table => @@ -956,7 +956,7 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerIdentityResourceProperties", x => new { x.IdentityResourceId, x.Key }); + table.PrimaryKey("PK_IdentityServerIdentityResourceProperties", x => new { x.IdentityResourceId, x.Key, x.Value }); table.ForeignKey( name: "FK_IdentityServerIdentityResourceProperties_IdentityServerIdentityResources_IdentityResourceId", column: x => x.IdentityResourceId, diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index bfcb19749d..e3bb89da7d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -871,11 +871,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ApiResourceId", "Key"); + b.HasKey("ApiResourceId", "Key", "Value"); b.ToTable("IdentityServerApiResourceProperties"); }); @@ -887,7 +886,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AllowedAccessTokenSigningAlgorithms") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("ConcurrencyStamp") .IsConcurrencyToken() @@ -1112,11 +1112,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ApiScopeId", "Key"); + b.HasKey("ApiScopeId", "Key", "Value"); b.ToTable("IdentityServerApiScopeProperties"); }); @@ -1149,7 +1148,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("AllowedIdentityTokenSigningAlgorithms") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1388,11 +1388,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ClientId", "Key"); + b.HasKey("ClientId", "Key", "Value"); b.ToTable("IdentityServerClientProperties"); }); @@ -1439,8 +1438,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(4000); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1691,11 +1690,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("IdentityResourceId", "Key"); + b.HasKey("IdentityResourceId", "Key", "Value"); b.ToTable("IdentityServerIdentityResourceProperties"); }); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs similarity index 89% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs index 23c25b58cd..59e4e386ff 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20200624023331_Initial")] + [Migration("20200707075532_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -774,12 +774,34 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") @@ -836,15 +858,18 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -855,18 +880,76 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("ApiResourceId", "Type"); - b.ToTable("IdentityServerApiClaims"); + b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); - b.Property("Name") + b.Property("Scope") .HasColumnType("nvarchar(200)") .HasMaxLength(200); + b.HasKey("ApiResourceId", "Scope"); + + b.ToTable("IdentityServerApiResourceScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(4000)") + .HasMaxLength(4000); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiResourceSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + b.Property("Description") .HasColumnType("nvarchar(1000)") .HasMaxLength(1000); @@ -878,58 +961,76 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Emphasize") .HasColumnType("bit"); + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("Required") .HasColumnType("bit"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); - b.HasKey("ApiResourceId", "Name"); + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); b.ToTable("IdentityServerApiScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - b.Property("Type") .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.HasKey("ApiResourceId", "Name", "Type"); + b.HasKey("ApiScopeId", "Type"); b.ToTable("IdentityServerApiScopeClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Type") + b.Property("Key") .HasColumnType("nvarchar(250)") .HasMaxLength(250); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.Property("Expiration") - .HasColumnType("datetime2"); + b.HasKey("ApiScopeId", "Key", "Value"); - b.HasKey("ApiResourceId", "Type", "Value"); - - b.ToTable("IdentityServerApiSecrets"); + b.ToTable("IdentityServerApiScopeProperties"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => @@ -959,6 +1060,10 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AllowRememberConsent") .HasColumnType("bit"); + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1089,6 +1194,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("RequirePkce") .HasColumnType("bit"); + b.Property("RequireRequestObject") + .HasColumnType("bit"); + b.Property("SlidingRefreshTokenLifetime") .HasColumnType("int"); @@ -1193,11 +1301,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ClientId", "Key"); + b.HasKey("ClientId", "Key", "Value"); b.ToTable("IdentityServerClientProperties"); }); @@ -1285,6 +1392,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)") .HasMaxLength(50000); + b.Property("Description") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("DeviceCode") .IsRequired() .HasColumnType("nvarchar(200)") @@ -1298,6 +1409,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ExtraProperties") .HasColumnType("nvarchar(max)"); + b.Property("SessionId") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("SubjectId") .HasColumnType("nvarchar(200)") .HasMaxLength(200); @@ -1314,8 +1429,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("Expiration"); - b.HasIndex("UserCode") - .IsUnique(); + b.HasIndex("UserCode"); b.ToTable("IdentityServerDeviceFlowCodes"); }); @@ -1337,6 +1451,9 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(40)") .HasMaxLength(40); + b.Property("ConsumedTime") + .HasColumnType("datetime2"); + b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1345,6 +1462,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)") .HasMaxLength(50000); + b.Property("Description") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("Expiration") .HasColumnType("datetime2"); @@ -1355,6 +1476,10 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("SessionId") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("SubjectId") .HasColumnType("nvarchar(200)") .HasMaxLength(200); @@ -1370,21 +1495,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("SubjectId", "ClientId", "Type"); - b.ToTable("IdentityServerPersistedGrants"); - }); + b.HasIndex("SubjectId", "SessionId", "Type"); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.Property("IdentityResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("IdentityResourceId", "Type"); - - b.ToTable("IdentityServerIdentityClaims"); + b.ToTable("IdentityServerPersistedGrants"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => @@ -1452,9 +1565,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - b.Property("Required") .HasColumnType("bit"); @@ -1463,9 +1573,44 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerIdentityResources"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityResourceClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("IdentityResourceId", "Key", "Value"); + + b.ToTable("IdentityServerIdentityResourceProperties"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1721,38 +1866,56 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) .WithMany("UserClaims") - .HasForeignKey("ApiResourceId", "Name") + .HasForeignKey("ApiScopeId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Secrets") - .HasForeignKey("ApiResourceId") + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("Properties") + .HasForeignKey("ApiScopeId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); @@ -1838,7 +2001,7 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => { b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) .WithMany("UserClaims") @@ -1847,6 +2010,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant", null) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs similarity index 87% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs index 9287186f86..2ee3b628fb 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs @@ -213,13 +213,41 @@ namespace MyCompanyName.MyProjectName.Migrations DisplayName = table.Column(maxLength: 200, nullable: true), Description = table.Column(maxLength: 1000, nullable: true), Enabled = table.Column(nullable: false), - Properties = table.Column(nullable: true) + AllowedAccessTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), + ShowInDiscoveryDocument = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiScopes", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), + Enabled = table.Column(nullable: false), + Name = table.Column(maxLength: 200, nullable: false), + DisplayName = table.Column(maxLength: 200, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), + Required = table.Column(nullable: false), + Emphasize = table.Column(nullable: false), + ShowInDiscoveryDocument = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopes", x => x.Id); + }); + migrationBuilder.CreateTable( name: "IdentityServerClients", columns: table => new @@ -247,6 +275,7 @@ namespace MyCompanyName.MyProjectName.Migrations AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), RequirePkce = table.Column(nullable: false), AllowPlainTextPkce = table.Column(nullable: false), + RequireRequestObject = table.Column(nullable: false), AllowAccessTokensViaBrowser = table.Column(nullable: false), FrontChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), FrontChannelLogoutSessionRequired = table.Column(nullable: false), @@ -254,6 +283,7 @@ namespace MyCompanyName.MyProjectName.Migrations BackChannelLogoutSessionRequired = table.Column(nullable: false), AllowOfflineAccess = table.Column(nullable: false), IdentityTokenLifetime = table.Column(nullable: false), + AllowedIdentityTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), AccessTokenLifetime = table.Column(nullable: false), AuthorizationCodeLifetime = table.Column(nullable: false), ConsentLifetime = table.Column(nullable: true), @@ -289,7 +319,9 @@ namespace MyCompanyName.MyProjectName.Migrations DeviceCode = table.Column(maxLength: 200, nullable: false), UserCode = table.Column(maxLength: 200, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), + SessionId = table.Column(maxLength: 100, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), + Description = table.Column(maxLength: 200, nullable: true), Expiration = table.Column(nullable: false), Data = table.Column(maxLength: 50000, nullable: false) }, @@ -318,8 +350,7 @@ namespace MyCompanyName.MyProjectName.Migrations Enabled = table.Column(nullable: false), Required = table.Column(nullable: false), Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false), - Properties = table.Column(nullable: true) + ShowInDiscoveryDocument = table.Column(nullable: false) }, constraints: table => { @@ -336,9 +367,12 @@ namespace MyCompanyName.MyProjectName.Migrations ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Type = table.Column(maxLength: 50, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), + SessionId = table.Column(maxLength: 100, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), + Description = table.Column(maxLength: 200, nullable: true), CreationTime = table.Column(nullable: false), Expiration = table.Column(nullable: true), + ConsumedTime = table.Column(nullable: true), Data = table.Column(maxLength: 50000, nullable: false) }, constraints: table => @@ -579,7 +613,7 @@ namespace MyCompanyName.MyProjectName.Migrations }); migrationBuilder.CreateTable( - name: "IdentityServerApiClaims", + name: "IdentityServerApiResourceClaims", columns: table => new { Type = table.Column(maxLength: 200, nullable: false), @@ -587,9 +621,9 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiClaims", x => new { x.ApiResourceId, x.Type }); + table.PrimaryKey("PK_IdentityServerApiResourceClaims", x => new { x.ApiResourceId, x.Type }); table.ForeignKey( - name: "FK_IdentityServerApiClaims_IdentityServerApiResources_ApiResourceId", + name: "FK_IdentityServerApiResourceClaims_IdentityServerApiResources_ApiResourceId", column: x => x.ApiResourceId, principalTable: "IdentityServerApiResources", principalColumn: "Id", @@ -597,22 +631,36 @@ namespace MyCompanyName.MyProjectName.Migrations }); migrationBuilder.CreateTable( - name: "IdentityServerApiScopes", + name: "IdentityServerApiResourceProperties", columns: table => new { ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) + Key = table.Column(maxLength: 250, nullable: false), + Value = table.Column(maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceProperties", x => new { x.ApiResourceId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceProperties_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceScopes", + columns: table => new + { + ApiResourceId = table.Column(nullable: false), + Scope = table.Column(maxLength: 200, nullable: false) }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiScopes", x => new { x.ApiResourceId, x.Name }); + table.PrimaryKey("PK_IdentityServerApiResourceScopes", x => new { x.ApiResourceId, x.Scope }); table.ForeignKey( - name: "FK_IdentityServerApiScopes_IdentityServerApiResources_ApiResourceId", + name: "FK_IdentityServerApiResourceScopes_IdentityServerApiResources_ApiResourceId", column: x => x.ApiResourceId, principalTable: "IdentityServerApiResources", principalColumn: "Id", @@ -620,26 +668,63 @@ namespace MyCompanyName.MyProjectName.Migrations }); migrationBuilder.CreateTable( - name: "IdentityServerApiSecrets", + name: "IdentityServerApiResourceSecrets", columns: table => new { Type = table.Column(maxLength: 250, nullable: false), Value = table.Column(maxLength: 4000, nullable: false), ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), + Description = table.Column(maxLength: 1000, nullable: true), Expiration = table.Column(nullable: true) }, constraints: table => { - table.PrimaryKey("PK_IdentityServerApiSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); + table.PrimaryKey("PK_IdentityServerApiResourceSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); table.ForeignKey( - name: "FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResourceId", + name: "FK_IdentityServerApiResourceSecrets_IdentityServerApiResources_ApiResourceId", column: x => x.ApiResourceId, principalTable: "IdentityServerApiResources", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "IdentityServerApiScopeClaims", + columns: table => new + { + Type = table.Column(maxLength: 200, nullable: false), + ApiScopeId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiScopeId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiScopeId", + column: x => x.ApiScopeId, + principalTable: "IdentityServerApiScopes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiScopeProperties", + columns: table => new + { + ApiScopeId = table.Column(nullable: false), + Key = table.Column(maxLength: 250, nullable: false), + Value = table.Column(maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopeProperties", x => new { x.ApiScopeId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiScopeProperties_IdentityServerApiScopes_ApiScopeId", + column: x => x.ApiScopeId, + principalTable: "IdentityServerApiScopes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "IdentityServerClientClaims", columns: table => new @@ -741,7 +826,7 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); + table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key, x.Value }); table.ForeignKey( name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", column: x => x.ClientId, @@ -808,7 +893,7 @@ namespace MyCompanyName.MyProjectName.Migrations }); migrationBuilder.CreateTable( - name: "IdentityServerIdentityClaims", + name: "IdentityServerIdentityResourceClaims", columns: table => new { Type = table.Column(maxLength: 200, nullable: false), @@ -816,9 +901,28 @@ namespace MyCompanyName.MyProjectName.Migrations }, constraints: table => { - table.PrimaryKey("PK_IdentityServerIdentityClaims", x => new { x.IdentityResourceId, x.Type }); + table.PrimaryKey("PK_IdentityServerIdentityResourceClaims", x => new { x.IdentityResourceId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerIdentityResourceClaims_IdentityServerIdentityResources_IdentityResourceId", + column: x => x.IdentityResourceId, + principalTable: "IdentityServerIdentityResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityResourceProperties", + columns: table => new + { + IdentityResourceId = table.Column(nullable: false), + Key = table.Column(maxLength: 250, nullable: false), + Value = table.Column(maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityResourceProperties", x => new { x.IdentityResourceId, x.Key, x.Value }); table.ForeignKey( - name: "FK_IdentityServerIdentityClaims_IdentityServerIdentityResources_IdentityResourceId", + name: "FK_IdentityServerIdentityResourceProperties_IdentityServerIdentityResources_IdentityResourceId", column: x => x.IdentityResourceId, principalTable: "IdentityServerIdentityResources", principalColumn: "Id", @@ -848,25 +952,6 @@ namespace MyCompanyName.MyProjectName.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "IdentityServerApiScopeClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiResourceId, x.Name, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiResourceId_Name", - columns: x => new { x.ApiResourceId, x.Name }, - principalTable: "IdentityServerApiScopes", - principalColumns: new[] { "ApiResourceId", "Name" }, - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateIndex( name: "IX_AbpAuditLogActions_AuditLogId", table: "AbpAuditLogActions", @@ -982,6 +1067,18 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpUsers", column: "UserName"); + migrationBuilder.CreateIndex( + name: "IX_IdentityServerApiResources_Name", + table: "IdentityServerApiResources", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerApiScopes_Name", + table: "IdentityServerApiScopes", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_IdentityServerClients_ClientId", table: "IdentityServerClients", @@ -1001,7 +1098,12 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.CreateIndex( name: "IX_IdentityServerDeviceFlowCodes_UserCode", table: "IdentityServerDeviceFlowCodes", - column: "UserCode", + column: "UserCode"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerIdentityResources_Name", + table: "IdentityServerIdentityResources", + column: "Name", unique: true); migrationBuilder.CreateIndex( @@ -1013,6 +1115,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", table: "IdentityServerPersistedGrants", columns: new[] { "SubjectId", "ClientId", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_SubjectId_SessionId_Type", + table: "IdentityServerPersistedGrants", + columns: new[] { "SubjectId", "SessionId", "Type" }); } protected override void Down(MigrationBuilder migrationBuilder) @@ -1057,13 +1164,22 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserTokens"); migrationBuilder.DropTable( - name: "IdentityServerApiClaims"); + name: "IdentityServerApiResourceClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceSecrets"); migrationBuilder.DropTable( name: "IdentityServerApiScopeClaims"); migrationBuilder.DropTable( - name: "IdentityServerApiSecrets"); + name: "IdentityServerApiScopeProperties"); migrationBuilder.DropTable( name: "IdentityServerClientClaims"); @@ -1096,7 +1212,10 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerDeviceFlowCodes"); migrationBuilder.DropTable( - name: "IdentityServerIdentityClaims"); + name: "IdentityServerIdentityResourceClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityResourceProperties"); migrationBuilder.DropTable( name: "IdentityServerPersistedGrants"); @@ -1116,6 +1235,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUsers"); + migrationBuilder.DropTable( + name: "IdentityServerApiResources"); + migrationBuilder.DropTable( name: "IdentityServerApiScopes"); @@ -1127,9 +1249,6 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "IdentityServerApiResources"); } } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs index 44c00e04d4..c2aac52e7c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs @@ -772,12 +772,34 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") @@ -834,15 +856,18 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -853,18 +878,76 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("ApiResourceId", "Type"); - b.ToTable("IdentityServerApiClaims"); + b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); - b.Property("Name") + b.Property("Scope") .HasColumnType("nvarchar(200)") .HasMaxLength(200); + b.HasKey("ApiResourceId", "Scope"); + + b.ToTable("IdentityServerApiResourceScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(4000)") + .HasMaxLength(4000); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiResourceSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + b.Property("Description") .HasColumnType("nvarchar(1000)") .HasMaxLength(1000); @@ -876,58 +959,76 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Emphasize") .HasColumnType("bit"); + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("Required") .HasColumnType("bit"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); - b.HasKey("ApiResourceId", "Name"); + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); b.ToTable("IdentityServerApiScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - b.Property("Type") .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.HasKey("ApiResourceId", "Name", "Type"); + b.HasKey("ApiScopeId", "Type"); b.ToTable("IdentityServerApiScopeClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Type") + b.Property("Key") .HasColumnType("nvarchar(250)") .HasMaxLength(250); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.Property("Expiration") - .HasColumnType("datetime2"); + b.HasKey("ApiScopeId", "Key", "Value"); - b.HasKey("ApiResourceId", "Type", "Value"); - - b.ToTable("IdentityServerApiSecrets"); + b.ToTable("IdentityServerApiScopeProperties"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => @@ -957,6 +1058,10 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AllowRememberConsent") .HasColumnType("bit"); + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1087,6 +1192,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("RequirePkce") .HasColumnType("bit"); + b.Property("RequireRequestObject") + .HasColumnType("bit"); + b.Property("SlidingRefreshTokenLifetime") .HasColumnType("int"); @@ -1191,11 +1299,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasMaxLength(250); b.Property("Value") - .IsRequired() .HasColumnType("nvarchar(2000)") .HasMaxLength(2000); - b.HasKey("ClientId", "Key"); + b.HasKey("ClientId", "Key", "Value"); b.ToTable("IdentityServerClientProperties"); }); @@ -1283,6 +1390,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)") .HasMaxLength(50000); + b.Property("Description") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("DeviceCode") .IsRequired() .HasColumnType("nvarchar(200)") @@ -1296,6 +1407,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnName("ExtraProperties") .HasColumnType("nvarchar(max)"); + b.Property("SessionId") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("SubjectId") .HasColumnType("nvarchar(200)") .HasMaxLength(200); @@ -1312,8 +1427,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("Expiration"); - b.HasIndex("UserCode") - .IsUnique(); + b.HasIndex("UserCode"); b.ToTable("IdentityServerDeviceFlowCodes"); }); @@ -1335,6 +1449,9 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(40)") .HasMaxLength(40); + b.Property("ConsumedTime") + .HasColumnType("datetime2"); + b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1343,6 +1460,10 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(max)") .HasMaxLength(50000); + b.Property("Description") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + b.Property("Expiration") .HasColumnType("datetime2"); @@ -1353,6 +1474,10 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("SessionId") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + b.Property("SubjectId") .HasColumnType("nvarchar(200)") .HasMaxLength(200); @@ -1368,21 +1493,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("SubjectId", "ClientId", "Type"); - b.ToTable("IdentityServerPersistedGrants"); - }); + b.HasIndex("SubjectId", "SessionId", "Type"); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.Property("IdentityResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("IdentityResourceId", "Type"); - - b.ToTable("IdentityServerIdentityClaims"); + b.ToTable("IdentityServerPersistedGrants"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => @@ -1450,9 +1563,6 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("nvarchar(200)") .HasMaxLength(200); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - b.Property("Required") .HasColumnType("bit"); @@ -1461,9 +1571,44 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerIdentityResources"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityResourceClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("IdentityResourceId", "Key", "Value"); + + b.ToTable("IdentityServerIdentityResourceProperties"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1719,38 +1864,56 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) .WithMany("UserClaims") - .HasForeignKey("ApiResourceId", "Name") + .HasForeignKey("ApiScopeId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Secrets") - .HasForeignKey("ApiResourceId") + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("Properties") + .HasForeignKey("ApiScopeId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); @@ -1836,7 +1999,7 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => { b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) .WithMany("UserClaims") @@ -1845,6 +2008,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant", null) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs index d93e2804a6..ee1b9c6c25 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20200624023340_Initial")] + [Migration("20200707075539_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.cs From 87e5dc425980000af692235d1930abe7bb518d0d Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 7 Jul 2020 16:58:54 +0800 Subject: [PATCH 17/55] Refactor. --- .../ApiResources/ApiResource.cs | 3 +- .../ApiResources/ApiResourceClaim.cs | 4 +- .../ApiResources/ApiResourceScope.cs | 2 +- .../ApiResources/ApiResourceSecret.cs | 2 +- .../ApiResources/IApiResourceRepository.cs | 2 +- .../Volo/Abp/IdentityServer/ResourceStore.cs | 7 +- ...IdentityServerEfCoreQueryableExtensions.cs | 1 + .../ApiResources/ApiResourceRepository.cs | 5 +- ...IdentityServerEntityFrameworkCoreModule.cs | 1 + ...yServerDbContextModelCreatingExtensions.cs | 5 -- .../AbpIdentityServerMongoDbContext.cs | 1 + ...pIdentityServerMongoDbContextExtensions.cs | 1 + .../MongoDB/AbpIdentityServerMongoDbModule.cs | 1 + .../IAbpIdentityServerMongoDbContext.cs | 2 +- .../MongoDB/MongoApiResourceRepository.cs | 1 + .../Clients/ClientStore_Tests.cs | 2 +- .../AbpIdentityServerTestDataBuilder.cs | 87 +++++++++++-------- .../AbpIdentityServerTestDataBuilder.cs | 1 + .../ApiResourceRepository_Tests.cs | 1 + .../IdentityServerDataSeedContributor.cs | 3 +- .../IdentityServerDataSeedContributor.cs | 7 +- 21 files changed, 79 insertions(+), 60 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs index e6fe3b9318..90725c3f6a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResource.cs @@ -4,9 +4,8 @@ using System.Linq; using IdentityServer4; using JetBrains.Annotations; using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.IdentityServer.ApiResources; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public class ApiResource : FullAuditedAggregateRoot { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs index e3e92d0721..772f6dcde7 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceClaim.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public class ApiResourceClaim : UserClaim { @@ -28,4 +28,4 @@ namespace Volo.Abp.IdentityServer.ApiScopes return new object[] {ApiResourceId, Type}; } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs index ecdff780e9..4da2beaa3f 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceScope.cs @@ -2,7 +2,7 @@ using JetBrains.Annotations; using Volo.Abp.Domain.Entities; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public class ApiResourceScope : Entity { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs index ccf63b8a3c..dcc6b04768 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResourceSecret.cs @@ -2,7 +2,7 @@ using IdentityServer4; using JetBrains.Annotations; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public class ApiResourceSecret : Secret { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs index f2feff8917..5d99666183 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public interface IApiResourceRepository : IBasicRepository { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs index a2d13c72fd..5afaaf4400 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ResourceStore.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using IdentityServer4.Models; using IdentityServer4.Stores; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.ObjectMapping; @@ -52,7 +53,7 @@ namespace Volo.Abp.IdentityServer public virtual async Task> FindApiResourcesByScopeNameAsync(IEnumerable scopeNames) { var resources = await ApiResourceRepository.GetListByScopesAsync(scopeNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(resources); + return ObjectMapper.Map, List>(resources); } /// @@ -61,7 +62,7 @@ namespace Volo.Abp.IdentityServer public virtual async Task> FindApiResourcesByNameAsync(IEnumerable apiResourceNames) { var resources = await ApiResourceRepository.FindByNameAsync(apiResourceNames.ToArray(), includeDetails: true); - return ObjectMapper.Map, List>(resources); + return ObjectMapper.Map, List>(resources); } /// @@ -75,7 +76,7 @@ namespace Volo.Abp.IdentityServer return new Resources( ObjectMapper.Map, List>(identityResources), - ObjectMapper.Map, List>(apiResources), + ObjectMapper.Map, List>(apiResources), ObjectMapper.Map, List>(apiScopes)); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs index d830da07e0..58cb6cc7ac 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/AbpIdentityServerEfCoreQueryableExtensions.cs @@ -1,5 +1,6 @@ using System.Linq; using Microsoft.EntityFrameworkCore; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 53644a1e1c..4824696108 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.IdentityServer.EntityFrameworkCore; -using System.Linq.Dynamic.Core; -using System.Runtime.InteropServices.ComTypes; -namespace Volo.Abp.IdentityServer.ApiScopes +namespace Volo.Abp.IdentityServer.ApiResources { public class ApiResourceRepository : EfCoreRepository, IApiResourceRepository { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs index fd22e97fe4..adc51cd500 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/AbpIdentityServerEntityFrameworkCoreModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs index 20a99c082e..eb6d424c16 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/EntityFrameworkCore/IdentityServerDbContextModelCreatingExtensions.cs @@ -8,11 +8,6 @@ using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; -using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; -using Client = Volo.Abp.IdentityServer.Clients.Client; -using ClientClaim = Volo.Abp.IdentityServer.Clients.ClientClaim; -using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; -using PersistedGrant = Volo.Abp.IdentityServer.Grants.PersistedGrant; namespace Volo.Abp.IdentityServer.EntityFrameworkCore { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs index 760505e75f..eddf19cd29 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContext.cs @@ -1,5 +1,6 @@ using MongoDB.Driver; using Volo.Abp.Data; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs index 026312312a..6abfc0618d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbContextExtensions.cs @@ -1,4 +1,5 @@ using System; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs index 1924ad3a68..6cd13aac37 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/AbpIdentityServerMongoDbModule.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs index ad1cfbfcf5..5b521f2600 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/IAbpIdentityServerMongoDbContext.cs @@ -1,12 +1,12 @@ using MongoDB.Driver; using Volo.Abp.Data; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.MongoDB; -using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; namespace Volo.Abp.IdentityServer.MongoDB { diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index c7a93cdb60..55a0cece76 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -8,6 +8,7 @@ using MongoDB.Driver.Linq; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.IdentityServer.ApiScopes; using System.Linq.Dynamic.Core; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.MongoDB; namespace Volo.Abp.IdentityServer.MongoDB diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs index e89f385b57..326edfd4ac 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs @@ -33,7 +33,7 @@ namespace Volo.Abp.IdentityServer.Clients client.ClientId.ShouldBe("42"); client.ProtocolType.ShouldBe("TestProtocol-42"); client.AllowedCorsOrigins.ShouldContain("Origin1"); - client.AllowedScopes.ShouldContain("api1"); + client.AllowedScopes.ShouldContain("Test-ApiScope-Name-1"); } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index 52fbc0513a..4b16d7de65 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -2,11 +2,13 @@ using IdentityServer4.Models; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Grants; using Volo.Abp.IdentityServer.IdentityResources; -using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; +using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; using Client = Volo.Abp.IdentityServer.Clients.Client; using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource; using PersistedGrant = Volo.Abp.IdentityServer.Grants.PersistedGrant; @@ -21,6 +23,7 @@ namespace Volo.Abp.IdentityServer private readonly IClientRepository _clientRepository; private readonly IPersistentGrantRepository _persistentGrantRepository; private readonly IApiResourceRepository _apiResourceRepository; + private readonly IApiScopeRepository _apiScopeRepository; private readonly IIdentityResourceRepository _identityResourceRepository; public AbpIdentityServerTestDataBuilder( @@ -28,21 +31,64 @@ namespace Volo.Abp.IdentityServer IGuidGenerator guidGenerator, IPersistentGrantRepository persistentGrantRepository, IApiResourceRepository apiResourceRepository, - IIdentityResourceRepository identityResourceRepository) + IIdentityResourceRepository identityResourceRepository, + IApiScopeRepository apiScopeRepository) { _clientRepository = clientRepository; _guidGenerator = guidGenerator; _persistentGrantRepository = persistentGrantRepository; _apiResourceRepository = apiResourceRepository; _identityResourceRepository = identityResourceRepository; + _apiScopeRepository = apiScopeRepository; } public async Task BuildAsync() { - await AddClients(); - await AddPersistentGrants(); await AddApiResources(); + await AddApiScopes(); await AddIdentityResources(); + await AddClients(); + await AddPersistentGrants(); + } + + private async Task AddApiResources() + { + var apiResource = new ApiResource(_guidGenerator.Create(), "Test-ApiResource-Name-1") + { + Enabled = true, + Description = "Test-ApiResource-Description-1", + DisplayName = "Test-ApiResource-DisplayName-1" + }; + + apiResource.AddSecret("secret".Sha256()); + apiResource.AddScope("Test-ApiResource-ApiScope-Name-1"); + apiResource.AddScope("Test-ApiResource-ApiScope-DisplayName-1"); + apiResource.AddUserClaim("Test-ApiResource-Claim-Type-1"); + + await _apiResourceRepository.InsertAsync(apiResource); + } + + private async Task AddApiScopes() + { + var apiScope = new ApiScope(_guidGenerator.Create(), "Test-ApiScope-Name-1"); + + apiScope.AddUserClaim("Test-ApiScope-Claim-Type-1"); + await _apiScopeRepository.InsertAsync(apiScope); + } + + private async Task AddIdentityResources() + { + var identityResource = new IdentityResource(_guidGenerator.Create(), "Test-Identity-Resource-Name-1") + { + Description = "Test-Identity-Resource-Description-1", + DisplayName = "Test-Identity-Resource-DisplayName-1", + Required = true, + Emphasize = true + }; + + identityResource.AddUserClaim("Test-Identity-Resource-1-IdentityClaim-Type-1"); + + await _identityResourceRepository.InsertAsync(identityResource); } private async Task AddClients() @@ -54,7 +100,7 @@ namespace Volo.Abp.IdentityServer client42.AddCorsOrigin("Origin1"); - client42.AddScope("api1"); + client42.AddScope("Test-ApiScope-Name-1"); await _clientRepository.InsertAsync(client42); } @@ -98,36 +144,5 @@ namespace Volo.Abp.IdentityServer }); } - private async Task AddApiResources() - { - var apiResource = new ApiResource(_guidGenerator.Create(), "Test-ApiResource-Name-1") - { - Enabled = true, - Description = "Test-ApiResource-Description-1", - DisplayName = "Test-ApiResource-DisplayName-1" - }; - - apiResource.AddSecret("secret".Sha256()); - apiResource.AddScope("Test-ApiResource-ApiScope-Name-1"); - apiResource.AddScope("Test-ApiResource-ApiScope-DisplayName-1"); - apiResource.AddUserClaim("Test-ApiResource-Claim-Type-1"); - - await _apiResourceRepository.InsertAsync(apiResource); - } - - private async Task AddIdentityResources() - { - var identityResource = new IdentityResource(_guidGenerator.Create(), "Test-Identity-Resource-Name-1") - { - Description = "Test-Identity-Resource-Description-1", - DisplayName = "Test-Identity-Resource-DisplayName-1", - Required = true, - Emphasize = true - }; - - identityResource.AddUserClaim("Test-Identity-Resource-1-IdentityClaim-Type-1"); - - await _identityResourceRepository.InsertAsync(identityResource); - } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index a2cf0f428c..436bef1246 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.Identity; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Devices; diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs index d3350ab59f..08c900947a 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ApiResourceRepository_Tests.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.ApiScopes; using Volo.Abp.Modularity; using Xunit; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 0662482b65..3aa7af4691 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -8,11 +8,12 @@ using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.PermissionManagement; using Volo.Abp.Uow; -using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; using Client = Volo.Abp.IdentityServer.Clients.Client; diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs index 7937265409..c3213311a1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs @@ -8,11 +8,12 @@ using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.IdentityResources; using Volo.Abp.PermissionManagement; using Volo.Abp.Uow; -using ApiResource = Volo.Abp.IdentityServer.ApiScopes.ApiResource; +using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; using Client = Volo.Abp.IdentityServer.Clients.Client; @@ -142,14 +143,14 @@ namespace MyCompanyName.MyProjectName.IdentityServer } //Console Test Client - var consoleClientId = configurationSection["MyProjectName_App:ClientId"]; + var consoleClientId = configurationSection["MyProjectName_ConsoleTestApp:ClientId"]; if (!consoleClientId.IsNullOrWhiteSpace()) { await CreateClientAsync( name: consoleClientId, scopes: commonScopes, grantTypes: new[] {"password", "client_credentials"}, - secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256() + secret: (configurationSection["MyProjectName_ConsoleTestApp:ClientSecret"] ?? "1q2w3e*").Sha256() ); } } From b6676dc54c9c482582faff73a6e5dc2fe5fb85d4 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 14 Jul 2020 15:01:11 +0800 Subject: [PATCH 18/55] Add some methods. --- .../Localization/Resources/en.json | 3 +- .../Localization/Resources/zh-Hans.json | 3 +- .../ApiScopes/IApiScopeeRepository.cs | 20 ++++++++- .../IdentityResources/IdentityResource.cs | 20 +++++++++ .../ApiResources/ApiResourceRepository.cs | 14 +++++- .../ApiScopes/ApiScopeRepository.cs | 45 ++++++++++++++++++- .../MongoDB/MongoApiResourceRepository.cs | 2 +- .../MongoDB/MongoApiScopeRepository.cs | 22 ++++++++- 8 files changed, 120 insertions(+), 9 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json index f974297b06..22b5f13474 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/en.json @@ -3,10 +3,11 @@ "texts": { "Volo.IdentityServer:DuplicateIdentityResourceName": "Identity Resource name already exist: {Name}", "Volo.IdentityServer:DuplicateApiResourceName": "Api Resource name already exist: {Name}", + "Volo.IdentityServer:DuplicateApiScopeName": "Api Scope name already exist: {Name}", "Volo.IdentityServer:DuplicateClientId": "ClientId already exist: {ClientId}", "UserLockedOut": "The user account has been locked out due to invalid login attempts. Please wait a while and try again.", "InvalidUserNameOrPassword": "Invalid username or password!", "LoginIsNotAllowed": "You are not allowed to login! You need to confirm your email/phone number.", "InvalidUsername": "Invalid username or password!" } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json index ac175e574d..1d40aa16b3 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json @@ -3,10 +3,11 @@ "texts": { "Volo.IdentityServer:DuplicateIdentityResourceName": "Identity资源名称已存在: {Name}", "Volo.IdentityServer:DuplicateApiResourceName": "Api资源名称已存在: {Name}", + "Volo.IdentityServer:DuplicateApiScopeName": "Api Scope已存在: {Name}", "Volo.IdentityServer:DuplicateClientId": "ClientId已经存在: {ClientId}", "UserLockedOut": "登录失败,用户账户已被锁定.请稍后再试.", "InvalidUserNameOrPassword": "用户名或密码错误!", "LoginIsNotAllowed": "无法登录!你需要验证邮箱地址/手机号.", "InvalidUsername": "用户名或密码错误!" } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs index c6ebcc26e5..a0aba8fe2a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; namespace Volo.Abp.IdentityServer.ApiScopes { - public interface IApiScopeRepository : IBasicRepository + public interface IApiScopeRepository : IBasicRepository { Task GetByNameAsync( string scopeName, @@ -18,5 +19,20 @@ namespace Volo.Abp.IdentityServer.ApiScopes bool includeDetails = false, CancellationToken cancellationToken = default ); + + Task> GetListAsync( + string sorting, + int skipCount, + int maxResultCount, + string filter = null, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + + Task CheckNameExistAsync( + string name, + Guid? expectedId = null, + CancellationToken cancellationToken = default + ); } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs index 246e1ddf98..b5812da7e2 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResource.cs @@ -89,5 +89,25 @@ namespace Volo.Abp.IdentityServer.IdentityResources { return UserClaims.FirstOrDefault(c => c.Type == type); } + + public virtual void AddProperty([NotNull] string key, string value) + { + Properties.Add(new IdentityResourceProperty(Id, key, value)); + } + + public virtual void RemoveAllProperties() + { + Properties.Clear(); + } + + public virtual void RemoveProperty(string key) + { + Properties.RemoveAll(r => r.Key == key); + } + + public virtual IdentityResourceProperty FindProperty(string key) + { + return Properties.FirstOrDefault(r => r.Key == key); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs index 4824696108..6718b20fb8 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs @@ -68,7 +68,7 @@ namespace Volo.Abp.IdentityServer.ApiResources public virtual async Task CheckNameExistAsync(string name, Guid? expectedId = null, CancellationToken cancellationToken = default) { - return await DbSet.AnyAsync(ar => ar.Id != expectedId && ar.Name == name, cancellationToken: cancellationToken); + return await DbSet.AnyAsync(ar => ar.Id != expectedId && ar.Name == name, GetCancellationToken(cancellationToken)); } public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default) @@ -85,6 +85,18 @@ namespace Volo.Abp.IdentityServer.ApiResources DbContext.Set().Remove(scope); } + var resourceSecrets = DbContext.Set().Where(s => s.ApiResourceId == id); + foreach (var secret in resourceSecrets) + { + DbContext.Set().Remove(secret); + } + + var apiResourceProperties = DbContext.Set().Where(s => s.ApiResourceId == id); + foreach (var property in apiResourceProperties) + { + DbContext.Set().Remove(property); + } + await base.DeleteAsync(id, autoSave, cancellationToken); } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs index b4674aad37..88772bfab7 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiScopes/ApiScopeRepository.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; @@ -9,7 +11,7 @@ using Volo.Abp.IdentityServer.EntityFrameworkCore; namespace Volo.Abp.IdentityServer.ApiScopes { - public class ApiScopeRepository : EfCoreRepository, IApiScopeRepository + public class ApiScopeRepository : EfCoreRepository, IApiScopeRepository { public ApiScopeRepository(IDbContextProvider dbContextProvider) : base( dbContextProvider) @@ -30,5 +32,44 @@ namespace Volo.Abp.IdentityServer.ApiScopes return await query.ToListAsync(GetCancellationToken(cancellationToken)); } + + public async Task> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default) + { + return await DbSet + .IncludeDetails(includeDetails) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter) || + x.Description.Contains(filter) || + x.DisplayName.Contains(filter)) + .OrderBy(sorting ?? "name desc") + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async Task CheckNameExistAsync(string name, Guid? expectedId = null, CancellationToken cancellationToken = default) + { + return await DbSet.AnyAsync(x => x.Id != expectedId && x.Name == name, GetCancellationToken(cancellationToken)); + } + + public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = new CancellationToken()) + { + var scopeClaims = DbContext.Set().Where(sc => sc.ApiScopeId == id); + foreach (var claim in scopeClaims) + { + DbContext.Set().Remove(claim); + } + + var scopeProperties = DbContext.Set().Where(s => s.ApiScopeId == id); + foreach (var property in scopeProperties) + { + DbContext.Set().Remove(property); + } + + await base.DeleteAsync(id, autoSave, cancellationToken); + } + + public override IQueryable WithDetails() + { + return GetQueryable().IncludeDetails(); + } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs index 55a0cece76..0f4337b895 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiResourceRepository.cs @@ -63,7 +63,7 @@ namespace Volo.Abp.IdentityServer.MongoDB public virtual async Task CheckNameExistAsync(string name, Guid? expectedId = null, CancellationToken cancellationToken = default) { - return await GetMongoQueryable().AnyAsync(ar => ar.Id != expectedId && ar.Name == name, cancellationToken: cancellationToken); + return await GetMongoQueryable().AnyAsync(ar => ar.Id != expectedId && ar.Name == name, GetCancellationToken(cancellationToken)); } } } diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs index 8a20b8ae2b..a446e772e8 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoApiScopeRepository.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; -using System.Linq; using MongoDB.Driver; using MongoDB.Driver.Linq; using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.IdentityServer.ApiScopes; +using System.Linq.Dynamic.Core; using Volo.Abp.MongoDB; namespace Volo.Abp.IdentityServer.MongoDB @@ -33,5 +34,24 @@ namespace Volo.Abp.IdentityServer.MongoDB return await query.ToListAsync(GetCancellationToken(cancellationToken)); } + + public async Task> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null, bool includeDetails = false, + CancellationToken cancellationToken = default) + { + return await GetMongoQueryable() + .WhereIf(!filter.IsNullOrWhiteSpace(), + x => x.Name.Contains(filter) || + x.Description.Contains(filter) || + x.DisplayName.Contains(filter)) + .OrderBy(sorting ?? nameof(ApiScope.Name)) + .As>() + .PageBy>(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async Task CheckNameExistAsync(string name, Guid? expectedId = null, CancellationToken cancellationToken = default) + { + return await GetMongoQueryable().AnyAsync(x => x.Id != expectedId && x.Name == name, GetCancellationToken(cancellationToken)); + } } } From 2fd086ea0cd60022e1cf857136d8d135b7685533 Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:14:46 +0800 Subject: [PATCH 19/55] Update ClientRepository.cs --- .../Volo/Abp/IdentityServer/Clients/ClientRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs index 5b350d0365..6151d3fe03 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.IdentityServer.Clients } - public virtual async Task FindByCliendIdAsync( + public virtual async Task FindByClientIdAsync( string clientId, bool includeDetails = true, CancellationToken cancellationToken = default) From 9a3f363d3b6bb2f40bdb1f254f4afcf3d51b234e Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:16:30 +0800 Subject: [PATCH 20/55] Update MongoClientRepository.cs --- .../Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs index 5855c42513..3f747e963d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs @@ -21,7 +21,7 @@ namespace Volo.Abp.IdentityServer.MongoDB { } - public virtual async Task FindByCliendIdAsync( + public virtual async Task FindByClientIdAsync( string clientId, bool includeDetails = true, CancellationToken cancellationToken = default) From 2423481c93182c6015c91f36e3b2a9409435ccb5 Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:18:54 +0800 Subject: [PATCH 21/55] Update CorsPolicyService_Tests.cs --- .../Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs index af701cfc69..9f15cf56c1 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs @@ -35,7 +35,7 @@ namespace Volo.Abp.IdentityServer using (var uow = _unitOfWorkManager.Begin()) { - var client1 = await _clientRepository.FindByCliendIdAsync("ClientId1"); + var client1 = await _clientRepository.FindByClientIdAsync("ClientId1"); client1.AddCorsOrigin("https://new-origin.com"); await _clientRepository.UpdateAsync(client1); From 08368c91d5b619f40b10dd9b99ca891c3f75bd11 Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:20:42 +0800 Subject: [PATCH 22/55] Update ClientRepository_Tests.cs --- .../Volo/Abp/IdentityServer/ClientRepository_Tests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs index 86f69610f5..8705a142ab 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs @@ -19,9 +19,9 @@ namespace Volo.Abp.IdentityServer } [Fact] - public async Task FindByCliendIdAsync() + public async Task FindByClientIdAsync() { - (await clientRepository.FindByCliendIdAsync("ClientId2")).ShouldNotBeNull(); + (await clientRepository.FindByClientIdAsync("ClientId2")).ShouldNotBeNull(); } [Fact] From 3be92953c8c42b7d54437b7bed44cc155958fd18 Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:28:39 +0800 Subject: [PATCH 23/55] Update ClientStore.cs --- .../Volo/Abp/IdentityServer/Clients/ClientStore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientStore.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientStore.cs index 2486bb0413..100d0e4184 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientStore.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/ClientStore.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.IdentityServer.Clients public virtual async Task FindClientByIdAsync(string clientId) { - var client = await ClientRepository.FindByCliendIdAsync(clientId); + var client = await ClientRepository.FindByClientIdAsync(clientId); return ObjectMapper.Map(client); } } From 3b43b8d17ca8484c879a60339f8c33c04433b029 Mon Sep 17 00:00:00 2001 From: "lyon.han" Date: Thu, 30 Jul 2020 17:30:45 +0800 Subject: [PATCH 24/55] Update IClientRepository.cs Spelling mistakes --- .../Volo/Abp/IdentityServer/Clients/IClientRepository.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs index 606b0086bd..059882eb47 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.IdentityServer.Clients { public interface IClientRepository : IBasicRepository { - Task FindByCliendIdAsync( + Task FindByClientIdAsync( [NotNull] string clientId, bool includeDetails = true, CancellationToken cancellationToken = default @@ -32,4 +32,4 @@ namespace Volo.Abp.IdentityServer.Clients CancellationToken cancellationToken = default ); } -} \ No newline at end of file +} From 31f7ea37ef44281945a601547b232f33a7466298 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 30 Jul 2020 18:28:28 +0800 Subject: [PATCH 25/55] Update template projects migration. --- .../20200710064926_Initial.Designer.cs | 2025 ----------------- .../Migrations/20200710064926_Initial.cs | 1235 ---------- .../20200730102617_Initial.Designer.cs} | 232 +- .../Migrations/20200730102617_Initial.cs} | 100 + ...ectNameMigrationsDbContextModelSnapshot.cs | 64 +- .../20200710065039_Initial.Designer.cs | 1936 ---------------- .../Migrations/20200710065039_Initial.cs | 1183 ---------- .../20200730102718_Initial.Designer.cs} | 232 +- .../Migrations/20200730102718_Initial.cs} | 100 +- ...verHostMigrationsDbContextModelSnapshot.cs | 64 +- .../20200707075539_Initial.Designer.cs | 1043 --------- ....cs => 20200730102724_Initial.Designer.cs} | 2 +- ...2_Initial.cs => 20200730102724_Initial.cs} | 0 13 files changed, 520 insertions(+), 7696 deletions(-) delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.Designer.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.cs rename templates/{module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs => app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.Designer.cs} (91%) rename templates/{module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs => app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.cs} (92%) delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.Designer.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.cs rename templates/{app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.Designer.cs} (95%) rename templates/{app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.cs} (97%) delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200710065052_Initial.Designer.cs => 20200730102724_Initial.Designer.cs} (99%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200710065052_Initial.cs => 20200730102724_Initial.cs} (100%) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.Designer.cs deleted file mode 100644 index e2ca97db45..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.Designer.cs +++ /dev/null @@ -1,2025 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyCompanyName.MyProjectName.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace MyCompanyName.MyProjectName.Migrations -{ - [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200710064926_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.5") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationName") - .HasColumnName("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("ClientId") - .HasColumnName("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientName") - .HasColumnName("ClientName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Comments") - .HasColumnName("Comments") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CorrelationId") - .HasColumnName("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Exceptions") - .HasColumnName("Exceptions") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("HttpMethod") - .HasColumnName("HttpMethod") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); - - b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantName") - .HasColumnType("nvarchar(max)"); - - b.Property("Url") - .HasColumnName("Url") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ExecutionTime"); - - b.HasIndex("TenantId", "UserId", "ExecutionTime"); - - b.ToTable("AbpAuditLogs"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("MethodName") - .HasColumnName("MethodName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Parameters") - .HasColumnName("Parameters") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ServiceName") - .HasColumnName("ServiceName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); - - b.ToTable("AbpAuditLogActions"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); - - b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); - - b.Property("EntityId") - .IsRequired() - .HasColumnName("EntityId") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("EntityTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityTypeFullName") - .IsRequired() - .HasColumnName("EntityTypeFullName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); - - b.ToTable("AbpEntityChanges"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EntityChangeId") - .HasColumnType("uniqueidentifier"); - - b.Property("NewValue") - .HasColumnName("NewValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("OriginalValue") - .HasColumnName("OriginalValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("PropertyName") - .IsRequired() - .HasColumnName("PropertyName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("PropertyTypeFullName") - .IsRequired() - .HasColumnName("PropertyTypeFullName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("EntityChangeId"); - - b.ToTable("AbpEntityPropertyChanges"); - }); - - modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsAbandoned") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("JobArgs") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(1048576); - - b.Property("JobName") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("LastTryTime") - .HasColumnType("datetime2"); - - b.Property("NextTryTime") - .HasColumnType("datetime2"); - - b.Property("Priority") - .ValueGeneratedOnAdd() - .HasColumnType("tinyint") - .HasDefaultValue((byte)15); - - b.Property("TryCount") - .ValueGeneratedOnAdd() - .HasColumnType("smallint") - .HasDefaultValue((short)0); - - b.HasKey("Id"); - - b.HasIndex("IsAbandoned", "NextTryTime"); - - b.ToTable("AbpBackgroundJobs"); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpFeatureValues"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ValueType") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); - - b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); - - b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Action"); - - b.HasIndex("TenantId", "ApplicationName"); - - b.HasIndex("TenantId", "Identity"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSecurityLogs"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasColumnType("int") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnName("Email") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("Name") - .HasColumnName("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .IsRequired() - .HasColumnName("NormalizedEmail") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "UserId"); - - b.HasIndex("UserId", "OrganizationUnitId"); - - b.ToTable("AbpUserOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Code") - .IsRequired() - .HasColumnName("Code") - .HasColumnType("nvarchar(95)") - .HasMaxLength(95); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnName("DisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("ParentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Code"); - - b.HasIndex("ParentId"); - - b.ToTable("AbpOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "RoleId"); - - b.HasIndex("RoleId", "OrganizationUnitId"); - - b.ToTable("AbpOrganizationUnitRoles"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("IdentityServerApiResources"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ApiResourceId", "Type"); - - b.ToTable("IdentityServerApiClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Emphasize") - .HasColumnType("bit"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ShowInDiscoveryDocument") - .HasColumnType("bit"); - - b.HasKey("ApiResourceId", "Name"); - - b.ToTable("IdentityServerApiScopes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ApiResourceId", "Name", "Type"); - - b.ToTable("IdentityServerApiScopeClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.HasKey("ApiResourceId", "Type", "Value"); - - b.ToTable("IdentityServerApiSecrets"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AbsoluteRefreshTokenLifetime") - .HasColumnType("int"); - - b.Property("AccessTokenLifetime") - .HasColumnType("int"); - - b.Property("AccessTokenType") - .HasColumnType("int"); - - b.Property("AllowAccessTokensViaBrowser") - .HasColumnType("bit"); - - b.Property("AllowOfflineAccess") - .HasColumnType("bit"); - - b.Property("AllowPlainTextPkce") - .HasColumnType("bit"); - - b.Property("AllowRememberConsent") - .HasColumnType("bit"); - - b.Property("AlwaysIncludeUserClaimsInIdToken") - .HasColumnType("bit"); - - b.Property("AlwaysSendClientClaims") - .HasColumnType("bit"); - - b.Property("AuthorizationCodeLifetime") - .HasColumnType("int"); - - b.Property("BackChannelLogoutSessionRequired") - .HasColumnType("bit"); - - b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("ConsentLifetime") - .HasColumnType("int"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DeviceCodeLifetime") - .HasColumnType("int"); - - b.Property("EnableLocalLogin") - .HasColumnType("bit"); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("FrontChannelLogoutSessionRequired") - .HasColumnType("bit"); - - b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("IdentityTokenLifetime") - .HasColumnType("int"); - - b.Property("IncludeJwtId") - .HasColumnType("bit"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ProtocolType") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("RefreshTokenExpiration") - .HasColumnType("int"); - - b.Property("RefreshTokenUsage") - .HasColumnType("int"); - - b.Property("RequireClientSecret") - .HasColumnType("bit"); - - b.Property("RequireConsent") - .HasColumnType("bit"); - - b.Property("RequirePkce") - .HasColumnType("bit"); - - b.Property("SlidingRefreshTokenLifetime") - .HasColumnType("int"); - - b.Property("UpdateAccessTokenClaimsOnRefresh") - .HasColumnType("bit"); - - b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); - - b.Property("UserSsoLifetime") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.ToTable("IdentityServerClients"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.HasKey("ClientId", "Type", "Value"); - - b.ToTable("IdentityServerClientClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); - - b.HasKey("ClientId", "Origin"); - - b.ToTable("IdentityServerClientCorsOrigins"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.HasKey("ClientId", "GrantType"); - - b.ToTable("IdentityServerClientGrantTypes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ClientId", "Provider"); - - b.ToTable("IdentityServerClientIdPRestrictions"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "PostLogoutRedirectUri"); - - b.ToTable("IdentityServerClientPostLogoutRedirectUris"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "Key"); - - b.ToTable("IdentityServerClientProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "RedirectUri"); - - b.ToTable("IdentityServerClientRedirectUris"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ClientId", "Scope"); - - b.ToTable("IdentityServerClientScopes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.HasKey("ClientId", "Type", "Value"); - - b.ToTable("IdentityServerClientSecrets"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Devices.DeviceFlowCodes", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("Data") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); - - b.Property("DeviceCode") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Expiration") - .IsRequired() - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("UserCode") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("Id"); - - b.HasIndex("DeviceCode") - .IsUnique(); - - b.HasIndex("Expiration"); - - b.HasIndex("UserCode") - .IsUnique(); - - b.ToTable("IdentityServerDeviceFlowCodes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => - { - b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("Data") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Type") - .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); - - b.HasKey("Key"); - - b.HasIndex("Expiration"); - - b.HasIndex("SubjectId", "ClientId", "Type"); - - b.ToTable("IdentityServerPersistedGrants"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.Property("IdentityResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("IdentityResourceId", "Type"); - - b.ToTable("IdentityServerIdentityClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Emphasize") - .HasColumnType("bit"); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ShowInDiscoveryDocument") - .HasColumnType("bit"); - - b.HasKey("Id"); - - b.ToTable("IdentityServerIdentityResources"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("AbpTenants"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.Property("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.HasKey("TenantId", "Name"); - - b.ToTable("AbpTenantConnectionStrings"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("UserClaims") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Scopes") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) - .WithMany("UserClaims") - .HasForeignKey("ApiResourceId", "Name") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Secrets") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("Claims") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedCorsOrigins") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedGrantTypes") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("IdentityProviderRestrictions") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("PostLogoutRedirectUris") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("Properties") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("RedirectUris") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedScopes") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("ClientSecrets") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) - .WithMany("UserClaims") - .HasForeignKey("IdentityResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.cs deleted file mode 100644 index 2c82babc5b..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200710064926_Initial.cs +++ /dev/null @@ -1,1235 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace MyCompanyName.MyProjectName.Migrations -{ - public partial class Initial : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpBackgroundJobs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - JobName = table.Column(maxLength: 128, nullable: false), - JobArgs = table.Column(maxLength: 1048576, nullable: false), - TryCount = table.Column(nullable: false, defaultValue: (short)0), - CreationTime = table.Column(nullable: false), - NextTryTime = table.Column(nullable: false), - LastTryTime = table.Column(nullable: true), - IsAbandoned = table.Column(nullable: false, defaultValue: false), - Priority = table.Column(nullable: false, defaultValue: (byte)15) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - Required = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - Regex = table.Column(maxLength: 512, nullable: true), - RegexDescription = table.Column(maxLength: 128, nullable: true), - Description = table.Column(maxLength: 256, nullable: true), - ValueType = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureValues", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Code = table.Column(maxLength: 95, nullable: false), - DisplayName = table.Column(maxLength: 128, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - NormalizedName = table.Column(maxLength: 256, nullable: false), - IsDefault = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - IsPublic = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSecurityLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - Identity = table.Column(maxLength: 96, nullable: true), - Action = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantName = table.Column(maxLength: 64, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - NormalizedUserName = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - Email = table.Column(maxLength: 256, nullable: false), - NormalizedEmail = table.Column(maxLength: 256, nullable: false), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PasswordHash = table.Column(maxLength: 256, nullable: true), - SecurityStamp = table.Column(maxLength: 256, nullable: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), - TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClients", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - ClientName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - ClientUri = table.Column(maxLength: 2000, nullable: true), - LogoUri = table.Column(maxLength: 2000, nullable: true), - Enabled = table.Column(nullable: false), - ProtocolType = table.Column(maxLength: 200, nullable: false), - RequireClientSecret = table.Column(nullable: false), - RequireConsent = table.Column(nullable: false), - AllowRememberConsent = table.Column(nullable: false), - AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), - RequirePkce = table.Column(nullable: false), - AllowPlainTextPkce = table.Column(nullable: false), - AllowAccessTokensViaBrowser = table.Column(nullable: false), - FrontChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - FrontChannelLogoutSessionRequired = table.Column(nullable: false), - BackChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - BackChannelLogoutSessionRequired = table.Column(nullable: false), - AllowOfflineAccess = table.Column(nullable: false), - IdentityTokenLifetime = table.Column(nullable: false), - AccessTokenLifetime = table.Column(nullable: false), - AuthorizationCodeLifetime = table.Column(nullable: false), - ConsentLifetime = table.Column(nullable: true), - AbsoluteRefreshTokenLifetime = table.Column(nullable: false), - SlidingRefreshTokenLifetime = table.Column(nullable: false), - RefreshTokenUsage = table.Column(nullable: false), - UpdateAccessTokenClaimsOnRefresh = table.Column(nullable: false), - RefreshTokenExpiration = table.Column(nullable: false), - AccessTokenType = table.Column(nullable: false), - EnableLocalLogin = table.Column(nullable: false), - IncludeJwtId = table.Column(nullable: false), - AlwaysSendClientClaims = table.Column(nullable: false), - ClientClaimsPrefix = table.Column(maxLength: 200, nullable: true), - PairWiseSubjectSalt = table.Column(maxLength: 200, nullable: true), - UserSsoLifetime = table.Column(nullable: true), - UserCodeType = table.Column(maxLength: 100, nullable: true), - DeviceCodeLifetime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClients", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerDeviceFlowCodes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - DeviceCode = table.Column(maxLength: 200, nullable: false), - UserCode = table.Column(maxLength: 200, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - Expiration = table.Column(nullable: false), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerDeviceFlowCodes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerPersistedGrants", - columns: table => new - { - Key = table.Column(maxLength: 200, nullable: false), - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Type = table.Column(maxLength: 50, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - CreationTime = table.Column(nullable: false), - Expiration = table.Column(nullable: true), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerPersistedGrants", x => x.Key); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - RoleId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(nullable: false), - Name = table.Column(maxLength: 64, nullable: false), - Value = table.Column(maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - TenantId = table.Column(nullable: true), - ProviderKey = table.Column(maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - TenantId = table.Column(nullable: true), - Value = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiClaims", x => new { x.ApiResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiClaims_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopes", - columns: table => new - { - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopes", x => new { x.ApiResourceId, x.Name }); - table.ForeignKey( - name: "FK_IdentityServerApiScopes_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientClaims", - columns: table => new - { - ClientId = table.Column(nullable: false), - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientClaims", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientClaims_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientCorsOrigins", - columns: table => new - { - ClientId = table.Column(nullable: false), - Origin = table.Column(maxLength: 150, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientCorsOrigins", x => new { x.ClientId, x.Origin }); - table.ForeignKey( - name: "FK_IdentityServerClientCorsOrigins_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientGrantTypes", - columns: table => new - { - ClientId = table.Column(nullable: false), - GrantType = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientGrantTypes", x => new { x.ClientId, x.GrantType }); - table.ForeignKey( - name: "FK_IdentityServerClientGrantTypes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientIdPRestrictions", - columns: table => new - { - ClientId = table.Column(nullable: false), - Provider = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientIdPRestrictions", x => new { x.ClientId, x.Provider }); - table.ForeignKey( - name: "FK_IdentityServerClientIdPRestrictions_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientPostLogoutRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - PostLogoutRedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientPostLogoutRedirectUris", x => new { x.ClientId, x.PostLogoutRedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientPostLogoutRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientProperties", - columns: table => new - { - ClientId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); - table.ForeignKey( - name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - RedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientRedirectUris", x => new { x.ClientId, x.RedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientScopes", - columns: table => new - { - ClientId = table.Column(nullable: false), - Scope = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientScopes", x => new { x.ClientId, x.Scope }); - table.ForeignKey( - name: "FK_IdentityServerClientScopes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientSecrets", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientSecrets_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - IdentityResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityClaims", x => new { x.IdentityResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerIdentityClaims_IdentityServerIdentityResources_IdentityResourceId", - column: x => x.IdentityResourceId, - principalTable: "IdentityServerIdentityResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopeClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiResourceId, x.Name, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiResourceId_Name", - columns: x => new { x.ApiResourceId, x.Name }, - principalTable: "IdentityServerApiScopes", - principalColumns: new[] { "ApiResourceId", "Name" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", - table: "AbpBackgroundJobs", - columns: new[] { "IsAbandoned", "NextTryTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", - table: "AbpFeatureValues", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Action", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Action" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_ApplicationName", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "ApplicationName" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Identity", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Identity" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_UserId", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerClients_ClientId", - table: "IdentityServerClients", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_DeviceCode", - table: "IdentityServerDeviceFlowCodes", - column: "DeviceCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_Expiration", - table: "IdentityServerDeviceFlowCodes", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_UserCode", - table: "IdentityServerDeviceFlowCodes", - column: "UserCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_Expiration", - table: "IdentityServerPersistedGrants", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", - table: "IdentityServerPersistedGrants", - columns: new[] { "SubjectId", "ClientId", "Type" }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpBackgroundJobs"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpFeatureValues"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSecurityLogs"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "IdentityServerApiClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopeClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerClientClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerClientCorsOrigins"); - - migrationBuilder.DropTable( - name: "IdentityServerClientGrantTypes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientIdPRestrictions"); - - migrationBuilder.DropTable( - name: "IdentityServerClientPostLogoutRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientProperties"); - - migrationBuilder.DropTable( - name: "IdentityServerClientRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerDeviceFlowCodes"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerPersistedGrants"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClients"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityResources"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "IdentityServerApiResources"); - } - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.Designer.cs similarity index 91% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.Designer.cs index 59e4e386ff..780d19f859 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.Designer.cs @@ -10,8 +10,8 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { - [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20200707075532_Initial")] + [DbContext(typeof(MyProjectNameMigrationsDbContext))] + [Migration("20200730102617_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -275,6 +275,95 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpEntityPropertyChanges"); }); + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasMaxLength(1048576); + + b.Property("JobName") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs"); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -399,6 +488,81 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpRoleClaims"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("ApplicationName") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CorrelationId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Identity") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => { b.Property("Id") @@ -774,25 +938,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ApiResourceId", "Key", "Value"); - - b.ToTable("IdentityServerApiResourceProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -869,7 +1015,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -883,7 +1029,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -897,7 +1061,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -1866,36 +2030,36 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("Properties") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("UserClaims") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Secrets") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.cs similarity index 92% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.cs index 2ee3b628fb..690275f181 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200707075532_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200730102617_Initial.cs @@ -39,6 +39,27 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), + JobName = table.Column(maxLength: 128, nullable: false), + JobArgs = table.Column(maxLength: 1048576, nullable: false), + TryCount = table.Column(nullable: false, defaultValue: (short)0), + CreationTime = table.Column(nullable: false), + NextTryTime = table.Column(nullable: false), + LastTryTime = table.Column(nullable: true), + IsAbandoned = table.Column(nullable: false, defaultValue: false), + Priority = table.Column(nullable: false, defaultValue: (byte)15) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpClaimTypes", columns: table => new @@ -59,6 +80,21 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(nullable: false), + Name = table.Column(maxLength: 128, nullable: false), + Value = table.Column(maxLength: 128, nullable: false), + ProviderName = table.Column(maxLength: 64, nullable: true), + ProviderKey = table.Column(maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpOrganizationUnits", columns: table => new @@ -123,6 +159,31 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpRoles", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), + TenantId = table.Column(nullable: true), + ApplicationName = table.Column(maxLength: 96, nullable: true), + Identity = table.Column(maxLength: 96, nullable: true), + Action = table.Column(maxLength: 96, nullable: true), + UserId = table.Column(nullable: true), + UserName = table.Column(maxLength: 256, nullable: true), + TenantName = table.Column(maxLength: 64, nullable: true), + ClientId = table.Column(maxLength: 64, nullable: true), + CorrelationId = table.Column(maxLength: 64, nullable: true), + ClientIpAddress = table.Column(maxLength: 64, nullable: true), + BrowserInfo = table.Column(maxLength: 512, nullable: true), + CreationTime = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpSettings", columns: table => new @@ -972,6 +1033,11 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpAuditLogs", columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "IsAbandoned", "NextTryTime" }); + migrationBuilder.CreateIndex( name: "IX_AbpEntityChanges_AuditLogId", table: "AbpEntityChanges", @@ -987,6 +1053,11 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpEntityPropertyChanges", column: "EntityChangeId"); + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + migrationBuilder.CreateIndex( name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", table: "AbpOrganizationUnitRoles", @@ -1017,6 +1088,26 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpRoles", column: "NormalizedName"); + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + migrationBuilder.CreateIndex( name: "IX_AbpSettings_Name_ProviderName_ProviderKey", table: "AbpSettings", @@ -1127,12 +1218,18 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpAuditLogActions"); + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + migrationBuilder.DropTable( name: "AbpClaimTypes"); migrationBuilder.DropTable( name: "AbpEntityPropertyChanges"); + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + migrationBuilder.DropTable( name: "AbpOrganizationUnitRoles"); @@ -1142,6 +1239,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpRoleClaims"); + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + migrationBuilder.DropTable( name: "AbpSettings"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index 26286c9be6..34c4149b92 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -936,25 +936,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ApiResourceId", "Key", "Value"); - - b.ToTable("IdentityServerApiResourceProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -1031,7 +1013,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -1045,7 +1027,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -1059,7 +1059,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -2028,36 +2028,36 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("Properties") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("UserClaims") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Secrets") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.Designer.cs deleted file mode 100644 index 00033c31b9..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.Designer.cs +++ /dev/null @@ -1,1936 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyCompanyName.MyProjectName.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace MyCompanyName.MyProjectName.Migrations -{ - [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20200710065039_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.5") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationName") - .HasColumnName("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("ClientId") - .HasColumnName("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientName") - .HasColumnName("ClientName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Comments") - .HasColumnName("Comments") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CorrelationId") - .HasColumnName("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Exceptions") - .HasColumnName("Exceptions") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("HttpMethod") - .HasColumnName("HttpMethod") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); - - b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantName") - .HasColumnType("nvarchar(max)"); - - b.Property("Url") - .HasColumnName("Url") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ExecutionTime"); - - b.HasIndex("TenantId", "UserId", "ExecutionTime"); - - b.ToTable("AbpAuditLogs"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("MethodName") - .HasColumnName("MethodName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Parameters") - .HasColumnName("Parameters") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ServiceName") - .HasColumnName("ServiceName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); - - b.ToTable("AbpAuditLogActions"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); - - b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); - - b.Property("EntityId") - .IsRequired() - .HasColumnName("EntityId") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("EntityTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityTypeFullName") - .IsRequired() - .HasColumnName("EntityTypeFullName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); - - b.ToTable("AbpEntityChanges"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EntityChangeId") - .HasColumnType("uniqueidentifier"); - - b.Property("NewValue") - .HasColumnName("NewValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("OriginalValue") - .HasColumnName("OriginalValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("PropertyName") - .IsRequired() - .HasColumnName("PropertyName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("PropertyTypeFullName") - .IsRequired() - .HasColumnName("PropertyTypeFullName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("EntityChangeId"); - - b.ToTable("AbpEntityPropertyChanges"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ValueType") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); - - b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); - - b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Action"); - - b.HasIndex("TenantId", "ApplicationName"); - - b.HasIndex("TenantId", "Identity"); - - b.HasIndex("TenantId", "UserId"); - - b.ToTable("AbpSecurityLogs"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasColumnType("int") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnName("Email") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("Name") - .HasColumnName("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .IsRequired() - .HasColumnName("NormalizedEmail") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "UserId"); - - b.HasIndex("UserId", "OrganizationUnitId"); - - b.ToTable("AbpUserOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Code") - .IsRequired() - .HasColumnName("Code") - .HasColumnType("nvarchar(95)") - .HasMaxLength(95); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnName("DisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("ParentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Code"); - - b.HasIndex("ParentId"); - - b.ToTable("AbpOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "RoleId"); - - b.HasIndex("RoleId", "OrganizationUnitId"); - - b.ToTable("AbpOrganizationUnitRoles"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("IdentityServerApiResources"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ApiResourceId", "Type"); - - b.ToTable("IdentityServerApiClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Emphasize") - .HasColumnType("bit"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ShowInDiscoveryDocument") - .HasColumnType("bit"); - - b.HasKey("ApiResourceId", "Name"); - - b.ToTable("IdentityServerApiScopes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ApiResourceId", "Name", "Type"); - - b.ToTable("IdentityServerApiScopeClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.HasKey("ApiResourceId", "Type", "Value"); - - b.ToTable("IdentityServerApiSecrets"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AbsoluteRefreshTokenLifetime") - .HasColumnType("int"); - - b.Property("AccessTokenLifetime") - .HasColumnType("int"); - - b.Property("AccessTokenType") - .HasColumnType("int"); - - b.Property("AllowAccessTokensViaBrowser") - .HasColumnType("bit"); - - b.Property("AllowOfflineAccess") - .HasColumnType("bit"); - - b.Property("AllowPlainTextPkce") - .HasColumnType("bit"); - - b.Property("AllowRememberConsent") - .HasColumnType("bit"); - - b.Property("AlwaysIncludeUserClaimsInIdToken") - .HasColumnType("bit"); - - b.Property("AlwaysSendClientClaims") - .HasColumnType("bit"); - - b.Property("AuthorizationCodeLifetime") - .HasColumnType("int"); - - b.Property("BackChannelLogoutSessionRequired") - .HasColumnType("bit"); - - b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("ConsentLifetime") - .HasColumnType("int"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DeviceCodeLifetime") - .HasColumnType("int"); - - b.Property("EnableLocalLogin") - .HasColumnType("bit"); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("FrontChannelLogoutSessionRequired") - .HasColumnType("bit"); - - b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("IdentityTokenLifetime") - .HasColumnType("int"); - - b.Property("IncludeJwtId") - .HasColumnType("bit"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ProtocolType") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("RefreshTokenExpiration") - .HasColumnType("int"); - - b.Property("RefreshTokenUsage") - .HasColumnType("int"); - - b.Property("RequireClientSecret") - .HasColumnType("bit"); - - b.Property("RequireConsent") - .HasColumnType("bit"); - - b.Property("RequirePkce") - .HasColumnType("bit"); - - b.Property("SlidingRefreshTokenLifetime") - .HasColumnType("int"); - - b.Property("UpdateAccessTokenClaimsOnRefresh") - .HasColumnType("bit"); - - b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); - - b.Property("UserSsoLifetime") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.ToTable("IdentityServerClients"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.HasKey("ClientId", "Type", "Value"); - - b.ToTable("IdentityServerClientClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); - - b.HasKey("ClientId", "Origin"); - - b.ToTable("IdentityServerClientCorsOrigins"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.HasKey("ClientId", "GrantType"); - - b.ToTable("IdentityServerClientGrantTypes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ClientId", "Provider"); - - b.ToTable("IdentityServerClientIdPRestrictions"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "PostLogoutRedirectUri"); - - b.ToTable("IdentityServerClientPostLogoutRedirectUris"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "Key"); - - b.ToTable("IdentityServerClientProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ClientId", "RedirectUri"); - - b.ToTable("IdentityServerClientRedirectUris"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("ClientId", "Scope"); - - b.ToTable("IdentityServerClientScopes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => - { - b.Property("ClientId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.HasKey("ClientId", "Type", "Value"); - - b.ToTable("IdentityServerClientSecrets"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Devices.DeviceFlowCodes", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("Data") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); - - b.Property("DeviceCode") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Expiration") - .IsRequired() - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("UserCode") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("Id"); - - b.HasIndex("DeviceCode") - .IsUnique(); - - b.HasIndex("Expiration"); - - b.HasIndex("UserCode") - .IsUnique(); - - b.ToTable("IdentityServerDeviceFlowCodes"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => - { - b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ClientId") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnType("datetime2"); - - b.Property("Data") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); - - b.Property("Expiration") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Type") - .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); - - b.HasKey("Key"); - - b.HasIndex("Expiration"); - - b.HasIndex("SubjectId", "ClientId", "Type"); - - b.ToTable("IdentityServerPersistedGrants"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.Property("IdentityResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("IdentityResourceId", "Type"); - - b.ToTable("IdentityServerIdentityClaims"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); - - b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Emphasize") - .HasColumnType("bit"); - - b.Property("Enabled") - .HasColumnType("bit"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ShowInDiscoveryDocument") - .HasColumnType("bit"); - - b.HasKey("Id"); - - b.ToTable("IdentityServerIdentityResources"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("AbpTenants"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.Property("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.HasKey("TenantId", "Name"); - - b.ToTable("AbpTenantConnectionStrings"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("UserClaims") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Scopes") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) - .WithMany("UserClaims") - .HasForeignKey("ApiResourceId", "Name") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => - { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Secrets") - .HasForeignKey("ApiResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("Claims") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedCorsOrigins") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedGrantTypes") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("IdentityProviderRestrictions") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("PostLogoutRedirectUris") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("Properties") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("RedirectUris") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("AllowedScopes") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => - { - b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) - .WithMany("ClientSecrets") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) - .WithMany("UserClaims") - .HasForeignKey("IdentityResourceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.cs deleted file mode 100644 index f80a5d9936..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200710065039_Initial.cs +++ /dev/null @@ -1,1183 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace MyCompanyName.MyProjectName.Migrations -{ - public partial class Initial : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - Required = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - Regex = table.Column(maxLength: 512, nullable: true), - RegexDescription = table.Column(maxLength: 128, nullable: true), - Description = table.Column(maxLength: 256, nullable: true), - ValueType = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Code = table.Column(maxLength: 95, nullable: false), - DisplayName = table.Column(maxLength: 128, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - NormalizedName = table.Column(maxLength: 256, nullable: false), - IsDefault = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - IsPublic = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSecurityLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - Identity = table.Column(maxLength: 96, nullable: true), - Action = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantName = table.Column(maxLength: 64, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - NormalizedUserName = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - Email = table.Column(maxLength: 256, nullable: false), - NormalizedEmail = table.Column(maxLength: 256, nullable: false), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PasswordHash = table.Column(maxLength: 256, nullable: true), - SecurityStamp = table.Column(maxLength: 256, nullable: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), - TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClients", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - ClientName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - ClientUri = table.Column(maxLength: 2000, nullable: true), - LogoUri = table.Column(maxLength: 2000, nullable: true), - Enabled = table.Column(nullable: false), - ProtocolType = table.Column(maxLength: 200, nullable: false), - RequireClientSecret = table.Column(nullable: false), - RequireConsent = table.Column(nullable: false), - AllowRememberConsent = table.Column(nullable: false), - AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), - RequirePkce = table.Column(nullable: false), - AllowPlainTextPkce = table.Column(nullable: false), - AllowAccessTokensViaBrowser = table.Column(nullable: false), - FrontChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - FrontChannelLogoutSessionRequired = table.Column(nullable: false), - BackChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - BackChannelLogoutSessionRequired = table.Column(nullable: false), - AllowOfflineAccess = table.Column(nullable: false), - IdentityTokenLifetime = table.Column(nullable: false), - AccessTokenLifetime = table.Column(nullable: false), - AuthorizationCodeLifetime = table.Column(nullable: false), - ConsentLifetime = table.Column(nullable: true), - AbsoluteRefreshTokenLifetime = table.Column(nullable: false), - SlidingRefreshTokenLifetime = table.Column(nullable: false), - RefreshTokenUsage = table.Column(nullable: false), - UpdateAccessTokenClaimsOnRefresh = table.Column(nullable: false), - RefreshTokenExpiration = table.Column(nullable: false), - AccessTokenType = table.Column(nullable: false), - EnableLocalLogin = table.Column(nullable: false), - IncludeJwtId = table.Column(nullable: false), - AlwaysSendClientClaims = table.Column(nullable: false), - ClientClaimsPrefix = table.Column(maxLength: 200, nullable: true), - PairWiseSubjectSalt = table.Column(maxLength: 200, nullable: true), - UserSsoLifetime = table.Column(nullable: true), - UserCodeType = table.Column(maxLength: 100, nullable: true), - DeviceCodeLifetime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClients", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerDeviceFlowCodes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - DeviceCode = table.Column(maxLength: 200, nullable: false), - UserCode = table.Column(maxLength: 200, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - Expiration = table.Column(nullable: false), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerDeviceFlowCodes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerPersistedGrants", - columns: table => new - { - Key = table.Column(maxLength: 200, nullable: false), - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Type = table.Column(maxLength: 50, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - CreationTime = table.Column(nullable: false), - Expiration = table.Column(nullable: true), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerPersistedGrants", x => x.Key); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - RoleId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(nullable: false), - Name = table.Column(maxLength: 64, nullable: false), - Value = table.Column(maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - TenantId = table.Column(nullable: true), - ProviderKey = table.Column(maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - TenantId = table.Column(nullable: true), - Value = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiClaims", x => new { x.ApiResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiClaims_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopes", - columns: table => new - { - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopes", x => new { x.ApiResourceId, x.Name }); - table.ForeignKey( - name: "FK_IdentityServerApiScopes_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientClaims", - columns: table => new - { - ClientId = table.Column(nullable: false), - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientClaims", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientClaims_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientCorsOrigins", - columns: table => new - { - ClientId = table.Column(nullable: false), - Origin = table.Column(maxLength: 150, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientCorsOrigins", x => new { x.ClientId, x.Origin }); - table.ForeignKey( - name: "FK_IdentityServerClientCorsOrigins_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientGrantTypes", - columns: table => new - { - ClientId = table.Column(nullable: false), - GrantType = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientGrantTypes", x => new { x.ClientId, x.GrantType }); - table.ForeignKey( - name: "FK_IdentityServerClientGrantTypes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientIdPRestrictions", - columns: table => new - { - ClientId = table.Column(nullable: false), - Provider = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientIdPRestrictions", x => new { x.ClientId, x.Provider }); - table.ForeignKey( - name: "FK_IdentityServerClientIdPRestrictions_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientPostLogoutRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - PostLogoutRedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientPostLogoutRedirectUris", x => new { x.ClientId, x.PostLogoutRedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientPostLogoutRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientProperties", - columns: table => new - { - ClientId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); - table.ForeignKey( - name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - RedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientRedirectUris", x => new { x.ClientId, x.RedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientScopes", - columns: table => new - { - ClientId = table.Column(nullable: false), - Scope = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientScopes", x => new { x.ClientId, x.Scope }); - table.ForeignKey( - name: "FK_IdentityServerClientScopes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientSecrets", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientSecrets_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - IdentityResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityClaims", x => new { x.IdentityResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerIdentityClaims_IdentityServerIdentityResources_IdentityResourceId", - column: x => x.IdentityResourceId, - principalTable: "IdentityServerIdentityResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopeClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiResourceId, x.Name, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiResourceId_Name", - columns: x => new { x.ApiResourceId, x.Name }, - principalTable: "IdentityServerApiScopes", - principalColumns: new[] { "ApiResourceId", "Name" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Action", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Action" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_ApplicationName", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "ApplicationName" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Identity", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Identity" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_UserId", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerClients_ClientId", - table: "IdentityServerClients", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_DeviceCode", - table: "IdentityServerDeviceFlowCodes", - column: "DeviceCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_Expiration", - table: "IdentityServerDeviceFlowCodes", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_UserCode", - table: "IdentityServerDeviceFlowCodes", - column: "UserCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_Expiration", - table: "IdentityServerPersistedGrants", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", - table: "IdentityServerPersistedGrants", - columns: new[] { "SubjectId", "ClientId", "Type" }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSecurityLogs"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "IdentityServerApiClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopeClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerClientClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerClientCorsOrigins"); - - migrationBuilder.DropTable( - name: "IdentityServerClientGrantTypes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientIdPRestrictions"); - - migrationBuilder.DropTable( - name: "IdentityServerClientPostLogoutRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientProperties"); - - migrationBuilder.DropTable( - name: "IdentityServerClientRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerDeviceFlowCodes"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerPersistedGrants"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClients"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityResources"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "IdentityServerApiResources"); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.Designer.cs similarity index 95% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.Designer.cs index fadec16eaf..c43c17df8b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.Designer.cs @@ -10,8 +10,8 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { - [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200707075540_Initial")] + [DbContext(typeof(IdentityServerHostMigrationsDbContext))] + [Migration("20200730102718_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -275,95 +275,6 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpEntityPropertyChanges"); }); - modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsAbandoned") - .ValueGeneratedOnAdd() - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("JobArgs") - .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(1048576); - - b.Property("JobName") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("LastTryTime") - .HasColumnType("datetime2"); - - b.Property("NextTryTime") - .HasColumnType("datetime2"); - - b.Property("Priority") - .ValueGeneratedOnAdd() - .HasColumnType("tinyint") - .HasDefaultValue((byte)15); - - b.Property("TryCount") - .ValueGeneratedOnAdd() - .HasColumnType("smallint") - .HasDefaultValue((short)0); - - b.HasKey("Id"); - - b.HasIndex("IsAbandoned", "NextTryTime"); - - b.ToTable("AbpBackgroundJobs"); - }); - - modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpFeatureValues"); - }); - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -488,6 +399,81 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpRoleClaims"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("ApplicationName") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CorrelationId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Identity") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => { b.Property("Id") @@ -863,25 +849,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ApiResourceId", "Key", "Value"); - - b.ToTable("IdentityServerApiResourceProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -958,7 +926,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -972,7 +940,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -986,7 +972,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -1955,36 +1941,36 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("Properties") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("UserClaims") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Secrets") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.cs similarity index 97% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.cs index 669982f451..a7a3b9786b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200707075540_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200730102718_Initial.cs @@ -39,27 +39,6 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); }); - migrationBuilder.CreateTable( - name: "AbpBackgroundJobs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - JobName = table.Column(maxLength: 128, nullable: false), - JobArgs = table.Column(maxLength: 1048576, nullable: false), - TryCount = table.Column(nullable: false, defaultValue: (short)0), - CreationTime = table.Column(nullable: false), - NextTryTime = table.Column(nullable: false), - LastTryTime = table.Column(nullable: true), - IsAbandoned = table.Column(nullable: false, defaultValue: false), - Priority = table.Column(nullable: false, defaultValue: (byte)15) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); - }); - migrationBuilder.CreateTable( name: "AbpClaimTypes", columns: table => new @@ -80,21 +59,6 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); }); - migrationBuilder.CreateTable( - name: "AbpFeatureValues", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); - }); - migrationBuilder.CreateTable( name: "AbpOrganizationUnits", columns: table => new @@ -159,6 +123,31 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpRoles", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), + TenantId = table.Column(nullable: true), + ApplicationName = table.Column(maxLength: 96, nullable: true), + Identity = table.Column(maxLength: 96, nullable: true), + Action = table.Column(maxLength: 96, nullable: true), + UserId = table.Column(nullable: true), + UserName = table.Column(maxLength: 256, nullable: true), + TenantName = table.Column(maxLength: 64, nullable: true), + ClientId = table.Column(maxLength: 64, nullable: true), + CorrelationId = table.Column(maxLength: 64, nullable: true), + ClientIpAddress = table.Column(maxLength: 64, nullable: true), + BrowserInfo = table.Column(maxLength: 512, nullable: true), + CreationTime = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpSettings", columns: table => new @@ -1008,11 +997,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpAuditLogs", columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - migrationBuilder.CreateIndex( - name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", - table: "AbpBackgroundJobs", - columns: new[] { "IsAbandoned", "NextTryTime" }); - migrationBuilder.CreateIndex( name: "IX_AbpEntityChanges_AuditLogId", table: "AbpEntityChanges", @@ -1028,11 +1012,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpEntityPropertyChanges", column: "EntityChangeId"); - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", - table: "AbpFeatureValues", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - migrationBuilder.CreateIndex( name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", table: "AbpOrganizationUnitRoles", @@ -1063,6 +1042,26 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpRoles", column: "NormalizedName"); + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + migrationBuilder.CreateIndex( name: "IX_AbpSettings_Name_ProviderName_ProviderKey", table: "AbpSettings", @@ -1173,18 +1172,12 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpAuditLogActions"); - migrationBuilder.DropTable( - name: "AbpBackgroundJobs"); - migrationBuilder.DropTable( name: "AbpClaimTypes"); migrationBuilder.DropTable( name: "AbpEntityPropertyChanges"); - migrationBuilder.DropTable( - name: "AbpFeatureValues"); - migrationBuilder.DropTable( name: "AbpOrganizationUnitRoles"); @@ -1194,6 +1187,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpRoleClaims"); + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + migrationBuilder.DropTable( name: "AbpSettings"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs index 57cd4990f3..0f9ae2508f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs @@ -847,25 +847,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpOrganizationUnitRoles"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => - { - b.Property("ApiResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); - - b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.HasKey("ApiResourceId", "Key", "Value"); - - b.ToTable("IdentityServerApiResourceProperties"); - }); - - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResource", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -942,7 +924,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResources"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -956,7 +938,25 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -970,7 +970,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("IdentityServerApiResourceScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); @@ -1939,36 +1939,36 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("Properties") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) - .WithMany("UserClaims") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Scopes") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiResourceSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiResource", null) + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Secrets") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs deleted file mode 100644 index ee1b9c6c25..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200707075539_Initial.Designer.cs +++ /dev/null @@ -1,1043 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MyCompanyName.MyProjectName.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace MyCompanyName.MyProjectName.Migrations -{ - [DbContext(typeof(UnifiedDbContext))] - [Migration("20200707075539_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.5") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ApplicationName") - .HasColumnName("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); - - b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("ClientId") - .HasColumnName("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ClientName") - .HasColumnName("ClientName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Comments") - .HasColumnName("Comments") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CorrelationId") - .HasColumnName("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Exceptions") - .HasColumnName("Exceptions") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("HttpMethod") - .HasColumnName("HttpMethod") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); - - b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantName") - .HasColumnType("nvarchar(max)"); - - b.Property("Url") - .HasColumnName("Url") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ExecutionTime"); - - b.HasIndex("TenantId", "UserId", "ExecutionTime"); - - b.ToTable("AbpAuditLogs"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); - - b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("MethodName") - .HasColumnName("MethodName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Parameters") - .HasColumnName("Parameters") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("ServiceName") - .HasColumnName("ServiceName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); - - b.ToTable("AbpAuditLogActions"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); - - b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); - - b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); - - b.Property("EntityId") - .IsRequired() - .HasColumnName("EntityId") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("EntityTenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityTypeFullName") - .IsRequired() - .HasColumnName("EntityTypeFullName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("AuditLogId"); - - b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); - - b.ToTable("AbpEntityChanges"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("EntityChangeId") - .HasColumnType("uniqueidentifier"); - - b.Property("NewValue") - .HasColumnName("NewValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("OriginalValue") - .HasColumnName("OriginalValue") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("PropertyName") - .IsRequired() - .HasColumnName("PropertyName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("PropertyTypeFullName") - .IsRequired() - .HasColumnName("PropertyTypeFullName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("EntityChangeId"); - - b.ToTable("AbpEntityPropertyChanges"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("Required") - .HasColumnType("bit"); - - b.Property("ValueType") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); - - b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); - - b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasColumnType("int") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnName("Email") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("Name") - .HasColumnName("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .IsRequired() - .HasColumnName("NormalizedEmail") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .HasColumnType("uniqueidentifier"); - - b.Property("ClaimType") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "UserId"); - - b.HasIndex("UserId", "OrganizationUnitId"); - - b.ToTable("AbpUserOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Code") - .IsRequired() - .HasColumnName("Code") - .HasColumnType("nvarchar(95)") - .HasMaxLength(95); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnName("DisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("ParentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Code"); - - b.HasIndex("ParentId"); - - b.ToTable("AbpOrganizationUnits"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.Property("OrganizationUnitId") - .HasColumnType("uniqueidentifier"); - - b.Property("RoleId") - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("OrganizationUnitId", "RoleId"); - - b.HasIndex("RoleId", "OrganizationUnitId"); - - b.ToTable("AbpOrganizationUnitRoles"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); - - b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("IsDeleted") - .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); - - b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.HasKey("Id"); - - b.HasIndex("Name"); - - b.ToTable("AbpTenants"); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.Property("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); - - b.HasKey("TenantId", "Name"); - - b.ToTable("AbpTenantConnectionStrings"); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("Actions") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) - .WithMany("EntityChanges") - .HasForeignKey("AuditLogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => - { - b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) - .WithMany("PropertyChanges") - .HasForeignKey("EntityChangeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("OrganizationUnits") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser", null) - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany() - .HasForeignKey("ParentId"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => - { - b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) - .WithMany("Roles") - .HasForeignKey("OrganizationUnitId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Volo.Abp.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200710065052_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200730102724_Initial.Designer.cs similarity index 99% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200710065052_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200730102724_Initial.Designer.cs index 4afc02af46..063f61a32d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200710065052_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200730102724_Initial.Designer.cs @@ -11,7 +11,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20200710065052_Initial")] + [Migration("20200730102724_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200710065052_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200730102724_Initial.cs similarity index 100% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200710065052_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200730102724_Initial.cs From 19c704bccaed21c70a86ce7527ddc6fafb36da92 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 30 Jul 2020 20:12:27 +0800 Subject: [PATCH 26/55] Rename FindByCliendIdAsync to FindByClientIdAsync. --- .../IdentityServer/IdentityServerDataSeedContributor.cs | 2 +- .../IdentityServer/IdentityServerDataSeedContributor.cs | 2 +- .../IdentityServer/IdentityServerDataSeedContributor.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs index c245c663f8..da6f57f337 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs @@ -142,7 +142,7 @@ namespace Volo.CmsKit.IdentityServer string postLogoutRedirectUri = null, IEnumerable permissions = null) { - var client = await _clientRepository.FindByCliendIdAsync(name); + var client = await _clientRepository.FindByClientIdAsync(name); if (client == null) { client = await _clientRepository.InsertAsync( diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 3aa7af4691..6071635fe5 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -165,7 +165,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer string frontChannelLogoutUri = null, IEnumerable permissions = null) { - var client = await _clientRepository.FindByCliendIdAsync(name); + var client = await _clientRepository.FindByClientIdAsync(name); if (client == null) { client = await _clientRepository.InsertAsync( diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs index c3213311a1..d150a1454c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs @@ -165,7 +165,7 @@ namespace MyCompanyName.MyProjectName.IdentityServer string frontChannelLogoutUri = null, IEnumerable permissions = null) { - var client = await _clientRepository.FindByCliendIdAsync(name); + var client = await _clientRepository.FindByClientIdAsync(name); if (client == null) { client = await _clientRepository.InsertAsync( From 47858b21bc59c94f19e58b60d7919d39679b2fd0 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 13 Aug 2020 14:31:35 +0800 Subject: [PATCH 27/55] Use AddDeveloperSigningCredential. --- .../Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs | 4 +++- .../Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs index 81f4b8b629..9763ad35f0 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs @@ -55,7 +55,9 @@ namespace Volo.Abp.IdentityServer return builder; } - public static IIdentityServerBuilder AddAbpDeveloperSigningCredential( + //TODO: Use the latest Identity server code to optimize performance. + // https://github.com/IdentityServer/IdentityServer4/blob/main/src/IdentityServer4/src/Configuration/DependencyInjection/BuilderExtensions/Crypto.cs + private static IIdentityServerBuilder AddAbpDeveloperSigningCredential( this IIdentityServerBuilder builder, bool persistKey = true, string filename = null, diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index d07132e094..65d1dd2b42 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -68,7 +68,7 @@ namespace Volo.Abp.IdentityServer if (builderOptions.AddDeveloperSigningCredential) { - identityServerBuilder = identityServerBuilder.AddAbpDeveloperSigningCredential(); + identityServerBuilder = identityServerBuilder.AddDeveloperSigningCredential(); } identityServerBuilder.AddAbpIdentityServer(builderOptions); From c17aa8a1e655d0838610ab505f6b3f81fc8e9028 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Wed, 9 Sep 2020 11:08:28 +0800 Subject: [PATCH 28/55] Add MongoTestCollection to OrganizationUnitRepository_Tests class. --- .../Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs index d60611b2b6..e60b6f21d4 100644 --- a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs @@ -4,6 +4,7 @@ using System.Text; namespace Volo.Abp.Identity.MongoDB { + [Collection(MongoTestCollection.Name)] public class OrganizationUnitRepository_Tests : OrganizationUnitRepository_Tests { } From a5010abd140333b377fc751e1d53b9625ee8bd3f Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Wed, 9 Sep 2020 11:16:17 +0800 Subject: [PATCH 29/55] using Xunit. --- .../Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs index e60b6f21d4..dc134f9974 100644 --- a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/OrganizationUnitRepository_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using Xunit; namespace Volo.Abp.Identity.MongoDB { From 3dad81499793fd53faa43d457e3120acd8b98916 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 15 Sep 2020 11:54:15 +0800 Subject: [PATCH 30/55] Upgrade IdentityServer4 to 4.1.0 https://github.com/IdentityServer/IdentityServer4/releases/tag/4.1.0 --- .../Volo.Abp.IdentityServer.Domain.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj index 33c5c87bff..758a0c0a04 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj @@ -25,8 +25,8 @@ - - + + From f12ded4d613abcc82e4b256f936ed623683c9170 Mon Sep 17 00:00:00 2001 From: taujiong Date: Fri, 16 Oct 2020 15:35:23 +0800 Subject: [PATCH 31/55] Add "GetAll" method to ISettingDefinitionContext Its implementation class already has the implementation method for "GetAll" --- .../Volo/Abp/Settings/ISettingDefinitionContext.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs index 220e40fe59..0454bb0cae 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs @@ -3,7 +3,9 @@ public interface ISettingDefinitionContext { SettingDefinition GetOrNull(string name); + + IReadOnlyList GetAll(); void Add(params SettingDefinition[] definitions); } -} \ No newline at end of file +} From 1a341ad15dc3a4ced97196c911a7744a64bf4c11 Mon Sep 17 00:00:00 2001 From: taujiong Date: Fri, 16 Oct 2020 16:55:20 +0800 Subject: [PATCH 32/55] fix missing namespace --- .../Volo/Abp/Settings/ISettingDefinitionContext.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs index 0454bb0cae..59d7acda98 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingDefinitionContext.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Settings +using System.Collections.Generic; + +namespace Volo.Abp.Settings { public interface ISettingDefinitionContext { From 5ad3fa08dbc63317fbf91ae5e844325091a7886e Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 16 Oct 2020 17:06:45 +0800 Subject: [PATCH 33/55] Only store IdentityLinkUser on the Host side. --- .../Abp/Identity/IdentityUserLinkManager.cs | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs index a067b259f4..6f8c600daa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs @@ -32,16 +32,22 @@ namespace Volo.Abp.Identity return; } - var userLink = new IdentityLinkUser( - GuidGenerator.Create(), - sourceLinkUser, - targetLinkUser); - await IdentityLinkUserRepository.InsertAsync(userLink, true); + using (CurrentTenant.Change(null)) + { + var userLink = new IdentityLinkUser( + GuidGenerator.Create(), + sourceLinkUser, + targetLinkUser); + await IdentityLinkUserRepository.InsertAsync(userLink, true); + } } public virtual async Task IsLinkedAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser) { - return await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser) != null; + using (CurrentTenant.Change(null)) + { + return await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser) != null; + } } public virtual async Task UnlinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser) @@ -51,10 +57,13 @@ namespace Volo.Abp.Identity return; } - var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser); - if (linkedUser != null) + using (CurrentTenant.Change(null)) { - await IdentityLinkUserRepository.DeleteAsync(linkedUser); + var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser); + if (linkedUser != null) + { + await IdentityLinkUserRepository.DeleteAsync(linkedUser); + } } } From 356978ca59ea32536c7b0edd29248a1cdb8a5797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 16 Oct 2020 20:20:21 +0300 Subject: [PATCH 34/55] Completed the JS auth API. --- docs/en/UI/AspNetCore/JavaScript-API/Auth.md | 24 +++++++++++++++++++ docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- docs/en/docs-nav.json | 4 ++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/Auth.md diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Auth.md b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md new file mode 100644 index 0000000000..45af8c4b3e --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md @@ -0,0 +1,24 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript Auth API + +Auth API allows you to check permissions (policies) for the current user in the client side. In this way, you can conditionally show/hide UI parts or perform your client side logic based on the current permissions. + +> This document only explains the JavaScript API. See the [authorization document](../../../Authorization.md) to understand the ABP authorization & permission system. + +## Basic Usage + +`abp.auth.isGranted(...)` function is used to check if a permission/policy has granted or not: + +````js +if (abp.auth.isGranted('DeleteUsers')) { + //TODO: Delete the user +} else { + alert("You don't have permission to delete a user!"); +} +```` + +## Other Fields & Functions + +* ` abp.auth.isAnyGranted(...)`: Gets one or more permission/policy names and returns `true` if at least one of them has granted. +* `abp.auth.areAllGranted(...)`: Gets one or more permission/policy names and returns `true` if all of them of them have granted. +* `abp.auth.policies`: This is an object where its keys are the permission/policy names. You can find all permission/policy names here. +* `abp.auth.grantedPolicies`: This is an object where its keys are the permission/policy names. You can find the granted permission/policy names here. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index dc87739641..38cde6217e 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -5,7 +5,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica ## APIs * [abp.ajax](Ajax.md) -* abp.auth +* [abp.auth](Auth.md) * abp.currentUser * abp.dom * [abp.event](Events.md) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index c14349b4ac..1ef289851d 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -455,6 +455,10 @@ "text": "Localization", "path": "UI/AspNetCore/JavaScript-API/Localization.md" }, + { + "text": "Auth", + "path": "UI/AspNetCore/JavaScript-API/Auth.md" + }, { "text": "Settings", "path": "UI/AspNetCore/JavaScript-API/Settings.md" From bf0d629e55c87beae1d34db9133cfb9e2b724181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 16 Oct 2020 20:31:23 +0300 Subject: [PATCH 35/55] Created ASP.NET Core MVC / Razor Pages UI: JavaScript CurrentUser API document --- .../AspNetCore/JavaScript-API/CurrentUser.md | 49 +++++++++++++++++++ docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- docs/en/docs-nav.json | 4 ++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/CurrentUser.md diff --git a/docs/en/UI/AspNetCore/JavaScript-API/CurrentUser.md b/docs/en/UI/AspNetCore/JavaScript-API/CurrentUser.md new file mode 100644 index 0000000000..038bb9dff1 --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/CurrentUser.md @@ -0,0 +1,49 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript CurrentUser API + +`abp.currentUser` is an object that contains information about the current user of the application. + +> This document only explains the JavaScript API. See the [CurrentUser document](../../../CurrentUser.md) to get information about the current user in the server side. + +## Authenticated User + +If the user was authenticated, this object will be something like below: + +````js +{ + isAuthenticated: true, + id: "34f1f4a7-13cc-4b91-84d1-b91c87afa95f", + tenantId: null, + userName: "john", + name: "John", + surName: "Nash", + email: "john.nash@abp.io", + emailVerified: true, + phoneNumber: null, + phoneNumberVerified: false, + roles: ["moderator","supporter"] +} +```` + +So, `abp.currentUser.userName` returns `john` in this case. + +## Anonymous User + +If the user was not authenticated, this object will be something like below: + +````js +{ + isAuthenticated: false, + id: null, + tenantId: null, + userName: null, + name: null, + surName: null, + email: null, + emailVerified: false, + phoneNumber: null, + phoneNumberVerified: false, + roles: [] +} +```` + +You can check `abp.currentUser.isAuthenticated` to understand if the use was authenticated or not. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index 38cde6217e..769fe548b6 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -6,7 +6,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica * [abp.ajax](Ajax.md) * [abp.auth](Auth.md) -* abp.currentUser +* [abp.currentUser](CurrentUser.md) * abp.dom * [abp.event](Events.md) * abp.features diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 1ef289851d..955ab920b3 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -459,6 +459,10 @@ "text": "Auth", "path": "UI/AspNetCore/JavaScript-API/Auth.md" }, + { + "text": "Current User", + "path": "UI/AspNetCore/JavaScript-API/CurrentUser.md" + }, { "text": "Settings", "path": "UI/AspNetCore/JavaScript-API/Settings.md" From 6dfd50bf6a3a4d08718f4800f15cf1312616266d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 16 Oct 2020 21:41:40 +0300 Subject: [PATCH 36/55] Documented ASP.NET Core MVC / Razor Pages UI: JavaScript DOM API --- docs/en/UI/AspNetCore/JavaScript-API/DOM.md | 117 ++++++++++++++++++ docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- docs/en/docs-nav.json | 4 + 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/DOM.md diff --git a/docs/en/UI/AspNetCore/JavaScript-API/DOM.md b/docs/en/UI/AspNetCore/JavaScript-API/DOM.md new file mode 100644 index 0000000000..cdd4cef9db --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/DOM.md @@ -0,0 +1,117 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript DOM API + +`abp.dom` (Document Object Model) provides events that you can subscribe to get notified when elements dynamically added to and removed from the page (DOM). + +It is especially helpful if you want to initialize the new loaded elements. This is generally needed when you dynamically add elements to DOM (for example, get some HTML elements via AJAX) after page initialization. + +> ABP uses the [MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) to observe the changes made on the DOM. + +## Node Events + +### onNodeAdded + +This event is triggered when an element is added to the DOM. Example: + +````js +abp.dom.onNodeAdded(function(args){ + console.log(args.$el); +}); +```` + +`args` object has the following fields; + +* `$el`: The JQuery selection to get the new element inserted to the DOM. + +### onNodeRemoved + +This event is triggered when an element is removed from the DOM. Example: + +````js +abp.dom.onNodeRemoved(function(args){ + console.log(args.$el); +}); +```` + +`args` object has the following fields; + +* `$el`: The JQuery selection to get the element removed from the DOM. + +## Pre-Build Initializers + +ABP Framework is using the DOM events to initialize some kind of HTML elements when they are added to the DOM after than the page was already initialized. + +> Note that the same initializers also work if these elements were already included in the initial DOM. So, whether they are initially or lazy loaded, they work as expected. + +### Form Initializer + +The Form initializer (defined as `abp.dom.initializers.initializeForms`) initializes the lazy loaded forms; + +* Automatically enabled the `unobtrusive` validation on the form. +* Can automatically show a confirmation message when you submit the form. To enable this feature, just add `data-confirm` attribute with a message (like `data-confirm="Are you sure?"`) to the `form` element. +* If the `form` element has `data-ajaxForm="true"` attribute, then automatically calls the `.abpAjaxForm()` on the `form` element, to make the form posted via AJAX. + +See the [Forms & Validation](../Forms-Validation.md) document for more. + +### Script Initializer + +Script initializer (`abp.dom.initializers.initializeScript`) can execute a JavaScript code for a DOM element. + +**Example: Lazy load a component and execute some code when the element has loaded** + +Assume that you've a container to load the element inside: + +````html +
+```` + +And this is the component that will be loaded via AJAX from the server and inserted into the container: + +````html +
+

Sample message

+
+```` + +`data-script-class="MyCustomClass"` indicates the JavaScript class that will be used to perform some logic on this element: + +`MyCustomClass` is a global object defined as shown below: + +````js +MyCustomClass = function(){ + + function initDom($el){ + $el.css('color', 'red'); + } + + return { + initDom: initDom + } +}; +```` + +`initDom` is the function that is called by the ABP Framework. The `$el` argument is the loaded HTML element as a JQuery selection. + +Finally, you can load the component inside the container after an AJAX call: + +````js +$(function () { + setTimeout(function(){ + $.get('/get-my-element').then(function(response){ + $('#LazyComponent').html(response); + }); + }, 2000); +}); +```` + +Script Initialization system is especially helpful if you don't know how and when the component will be loaded into the DOM. This can be possible if you've developed a reusable UI component in a library and you want the application developer shouldn't care how to initialize the component in different use cases. + +> Script initialization doesn't work if the component was loaded in the initial DOM. In this case, you are responsible to initialize it. + +### Other Initializers + +The following Bootstrap components and libraries are automatically initialized when they are added to the DOM: + +* Tooltip +* Popover +* Timeage + diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index 769fe548b6..ac96f09eaf 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -7,7 +7,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica * [abp.ajax](Ajax.md) * [abp.auth](Auth.md) * [abp.currentUser](CurrentUser.md) -* abp.dom +* [abp.dom](DOM.md) * [abp.event](Events.md) * abp.features * [abp.localization](Localization.md) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 955ab920b3..944639cf33 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -482,6 +482,10 @@ { "text": "Events", "path": "UI/AspNetCore/JavaScript-API/Events.md" + }, + { + "text": "DOM", + "path": "UI/AspNetCore/JavaScript-API/DOM.md" } ] }, From 977db7889f3a4cc0b847161f59a5e28a3ffcbfeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 16 Oct 2020 22:56:38 +0300 Subject: [PATCH 37/55] documented ASP.NET Core MVC / Razor Pages UI: JavaScript Features API --- docs/en/UI/AspNetCore/JavaScript-API/Features.md | 15 +++++++++++++++ docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- docs/en/docs-nav.json | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/Features.md diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Features.md b/docs/en/UI/AspNetCore/JavaScript-API/Features.md new file mode 100644 index 0000000000..e3cd2be445 --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/Features.md @@ -0,0 +1,15 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript Features API + +`abp.features` API allows you to check features or get the values of the features on the client side. You can read the current value of a feature in the client side only if it is allowed by the feature definition (on the server side). + +> This document only explains the JavaScript API. See the [Features](../../../Features.md) document to understand the ABP Features system. + +## Basic Usage + +`abp.features.values` can be used to access to the all feature values. + +````js +var excelExportFeatureValue = abp.features.values["ExportingToExcel"]; +```` + +Then you can check the value of the feature to perform your logic. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index ac96f09eaf..2ce185c6e3 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -9,7 +9,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica * [abp.currentUser](CurrentUser.md) * [abp.dom](DOM.md) * [abp.event](Events.md) -* abp.features +* [abp.features](Features.md) * [abp.localization](Localization.md) * abp.log * [abp.message](Message.md) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 944639cf33..bdb99396e0 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -467,6 +467,10 @@ "text": "Settings", "path": "UI/AspNetCore/JavaScript-API/Settings.md" }, + { + "text": "Features", + "path": "UI/AspNetCore/JavaScript-API/Features.md" + }, { "text": "AJAX", "path": "UI/AspNetCore/JavaScript-API/Ajax.md" From 69b53982a83b466ba89bf94d66742dd473c84697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 16 Oct 2020 23:27:43 +0300 Subject: [PATCH 38/55] Documented ASP.NET Core MVC / Razor Pages UI: JavaScript Logging API --- docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- .../UI/AspNetCore/JavaScript-API/Logging.md | 49 ++++++++++++++++++- docs/en/docs-nav.json | 4 ++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index 2ce185c6e3..281fa4726c 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -11,7 +11,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica * [abp.event](Events.md) * [abp.features](Features.md) * [abp.localization](Localization.md) -* abp.log +* [abp.log](Logging.md) * [abp.message](Message.md) * [abp.notify](Notify.md) * abp.security diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Logging.md b/docs/en/UI/AspNetCore/JavaScript-API/Logging.md index 9fe48f22da..a46203b019 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Logging.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Logging.md @@ -1,3 +1,50 @@ # ASP.NET Core MVC / Razor Pages UI: JavaScript Logging API -TODO \ No newline at end of file +`abp.log` API is used to write simple logs in the client side. + +> The logs are written to console, using the `console.log`, by default. + +> This document is for simple client side logging. See the [Logging](../../../Logging.md) document for server side logging system. + +## Basic Usage + +Use one of the `abp.log.xxx(...)` methods based on the severity of your log message. + +````js +abp.log.debug("Some debug log here..."); //Logging a simple debug message +abp.log.info({ name: "john", age: 42 }); //Logging an object as an information log +abp.log.warn("A warning message"); //Logging a warning message +abp.log.error('An error happens...'); //Error message +abp.log.fatal('Network connection has gone away!'); //Fatal error +```` + +## Log Levels + +There are 5 levels for a log message: + +* DEBUG = 1 +* INFO = 2 +* WARN = 3 +* ERROR = 4 +* FATAL = 5 + +These are defined in the `abp.log.levels` object (like `abp.log.levels.WARN`). + +### Changing the Current Log Level + +You can control the log level as shown below: + +````js +abp.log.level = abp.log.levels.WARN; +```` + +Default log level is `DEBUG`. + +### Logging with Specifying the Level + +Instead of calling `abp.log.info(...)` function, you can use the `abp.log.log` by specifying the log level as a parameter: + +````js +abp.log.log("log message...", abp.log.levels.INFO); +```` + diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index bdb99396e0..459c6947fd 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -490,6 +490,10 @@ { "text": "DOM", "path": "UI/AspNetCore/JavaScript-API/DOM.md" + }, + { + "text": "Logging", + "path": "UI/AspNetCore/JavaScript-API/Logging.md" } ] }, From 3fa6756cd1dff2c4605a61c82a3607b03616c671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 14:25:47 +0300 Subject: [PATCH 39/55] Documented ASP.NET Core MVC / Razor Pages UI: JavaScript UI Block/Busy API --- .../AspNetCore/JavaScript-API/Block-Busy.md | 56 ++++++++++++++++++ docs/en/UI/AspNetCore/JavaScript-API/Index.md | 28 ++++----- docs/en/docs-nav.json | 4 ++ docs/en/images/ui-busy.png | Bin 0 -> 138628 bytes 4 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/Block-Busy.md create mode 100644 docs/en/images/ui-busy.png diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Block-Busy.md b/docs/en/UI/AspNetCore/JavaScript-API/Block-Busy.md new file mode 100644 index 0000000000..943a651432 --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/Block-Busy.md @@ -0,0 +1,56 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript UI Block/Busy API + +UI Block API disables (blocks) the page or a part of the page. + +## Basic Usage + +**Example: Block (disable) the complete page** + +````js +abp.ui.block(); +```` + +**Example: Block (disable) an HTML element** + +````js +abp.ui.block('#MyContainer'); +```` + +**Example: Enables the previously blocked element or page:** + +````js +abp.ui.unblock(); +```` + +## Options + +`abp.ui.block()` method can get an options object which may contain the following fields: + +* `elm`: An optional selector to find the element to be blocked (e.g. `#MyContainerId`). If not provided, the entire page is blocked. The selector can also be directly passed to the `block()` method as shown above. +* `busy`: Set to `true` to show a progress indicator on the blocked area. +* `promise`: A promise object with `always` or `finally` callbacks. This can be helpful if you want to automatically unblock the blocked area when a deferred operation completes. + +**Example: Block an element with busy indicator** + +````js +abp.ui.block({ + elm: '#MySection', + busy: true +}); +```` + +The resulting UI will look like below: + +![ui-busy](../../../images/ui-busy.png) + +## setBusy + +`abp.ui.setBusy(...)` and `abp.ui.clearBusy()` are shortcut functions if you want to use the block with `busy` option. + +**Example: Block with busy** + +````js +abp.ui.setBusy('#MySection'); +```` + +Then you can use `abp.ui.clearBusy();` to re-enable the busy area/page. \ No newline at end of file diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index 281fa4726c..a41b57c80e 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -4,18 +4,16 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica ## APIs -* [abp.ajax](Ajax.md) -* [abp.auth](Auth.md) -* [abp.currentUser](CurrentUser.md) -* [abp.dom](DOM.md) -* [abp.event](Events.md) -* [abp.features](Features.md) -* [abp.localization](Localization.md) -* [abp.log](Logging.md) -* [abp.message](Message.md) -* [abp.notify](Notify.md) -* abp.security -* [abp.setting](Settings.md) -* abp.ui -* abp.utils -* abp.ResourceLoader \ No newline at end of file +* [AJAX](Ajax.md) +* [Auth](Auth.md) +* [CurrentUser](CurrentUser.md) +* [DOM](DOM.md) +* [Events](Events.md) +* [Features](Features.md) +* [Localization](Localization.md) +* [Logging](Logging.md) +* ResourceLoader +* [Settings](Settings.md) +* [UI Block/Busy](Block-Busy.md) +* [UI Message](Message.md) +* [UI Notification](Notify.md) \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 459c6947fd..14eedc65e7 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -483,6 +483,10 @@ "text": "Notify", "path": "UI/AspNetCore/JavaScript-API/Notify.md" }, + { + "text": "Block/Busy", + "path": "UI/AspNetCore/JavaScript-API/Block-Busy.md" + }, { "text": "Events", "path": "UI/AspNetCore/JavaScript-API/Events.md" diff --git a/docs/en/images/ui-busy.png b/docs/en/images/ui-busy.png new file mode 100644 index 0000000000000000000000000000000000000000..63a1d7d74a5a0053d12d329ee4027012ef5da689 GIT binary patch literal 138628 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 Date: Sat, 17 Oct 2020 14:42:41 +0300 Subject: [PATCH 40/55] Documented ASP.NET Core MVC / Razor Pages UI: JavaScript Resource Loader API --- docs/en/UI/AspNetCore/JavaScript-API/Index.md | 2 +- .../JavaScript-API/ResourceLoader.md | 40 +++++++++++++++++++ docs/en/docs-nav.json | 4 ++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md index a41b57c80e..3473140392 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md @@ -12,7 +12,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica * [Features](Features.md) * [Localization](Localization.md) * [Logging](Logging.md) -* ResourceLoader +* [ResourceLoader](ResourceLoader.md) * [Settings](Settings.md) * [UI Block/Busy](Block-Busy.md) * [UI Message](Message.md) diff --git a/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md b/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md new file mode 100644 index 0000000000..1e1c2f9d6d --- /dev/null +++ b/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md @@ -0,0 +1,40 @@ +# ASP.NET Core MVC / Razor Pages UI: JavaScript Resource Loader API + +`abp.ResourceLoader` is a service that can load a JavaScript or CSS file on demand. It guarantees to load the file only once even if you request multiple times. + +## Loading Script Files + +`abp.ResourceLoader.loadScript(...)` function **loads** a JavaScript file from the server and **executes** it. + +**Example: Load a JavaScript file** + +````js +abp.ResourceLoader.loadScript('/Pages/my-script.js'); +```` + +### Parameters + +`loadScript` function can get three parameters; + +* `url` (required, `string`): The URL of the script file to be loaded. +* `loadCallback` (optional, `function`): A callback function that is called once the script is loaded & executed. In this callback you can safely use the code in the script file. This callback is called even if the file was loaded before. +* `failCallback` (optional, `function`): A callback function that is called if loading the script fails. + +**Example: Provide the `loadCallback` argument** + +```` +abp.ResourceLoader.loadScript('/Pages/my-script.js', function() { + console.log('successfully loaded :)'); +}); +```` + +## Loading Style Files + +`abp.ResourceLoader.loadStyle(...)` function adds a `link` element to the `head` of the document for the given URL, so the CSS file is automatically loaded by the browser. + +**Example: Load a CSS file** + +````js +abp.ResourceLoader.loadStyle('/Pages/my-styles.css'); +```` + diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 14eedc65e7..f51835a5f7 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -498,6 +498,10 @@ { "text": "Logging", "path": "UI/AspNetCore/JavaScript-API/Logging.md" + }, + { + "text": "Resource Loader", + "path": "UI/AspNetCore/JavaScript-API/ResourceLoader.md" } ] }, From 18807671d450e1801bc4dfeb6ad150e6d9921dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 14:46:13 +0300 Subject: [PATCH 41/55] Update ResourceLoader.md --- docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md b/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md index 1e1c2f9d6d..10b8c36f59 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/ResourceLoader.md @@ -22,7 +22,7 @@ abp.ResourceLoader.loadScript('/Pages/my-script.js'); **Example: Provide the `loadCallback` argument** -```` +````js abp.ResourceLoader.loadScript('/Pages/my-script.js', function() { console.log('successfully loaded :)'); }); From ebb36992f120f554b0a417b9644f46f2cbbba379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 18:03:10 +0300 Subject: [PATCH 42/55] Completed part 1,2,3. --- docs/en/Tutorials/Part-2.md | 10 +++++----- docs/en/Tutorials/Part-3.md | 20 +++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index e52fe7a46d..f4fcf61e25 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -583,7 +583,7 @@ When you click to the Books menu item under the Book Store parent, you are being We will use the [Blazorise library](https://blazorise.com/) as the UI component kit. It is a very powerful library that supports major HTML/CSS frameworks, including the Bootstrap. -ABP Framework provides a generic base class, `BlazoriseCrudPageBase<...>`, to create CRUD style pages. This base class is compatible to the `ICrudAppService` that was used to build the `IBookAppService`. So, we can inherit from the `BlazoriseCrudPageBase` to automate the standard CRUD stuff. +ABP Framework provides a generic base class, `AbpCrudPageBase<...>`, to create CRUD style pages. This base class is compatible to the `ICrudAppService` that was used to build the `IBookAppService`. So, we can inherit from the `AbpCrudPageBase` to automate the code behind for the standard CRUD stuff. Open the `Books.razor` and replace the content as the following: @@ -595,7 +595,7 @@ Open the `Books.razor` and replace the content as the following: @using Acme.BookStore.Localization @using Microsoft.Extensions.Localization @inject IStringLocalizer L -@inherits BlazoriseCrudPageBase +@inherits AbpCrudPageBase @@ -645,15 +645,15 @@ Open the `Books.razor` and replace the content as the following: > If you see some syntax errors, you can ignore them if your application properly built and run. Visual Studio still has some bugs with Blazor. -* Inherited from the `BlazoriseCrudPageBase` which implements all the CRUD details for us. +* Inherited from the `AbpCrudPageBase` which implements all the CRUD details for us. * `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync` are defined in the base blass. * Injected `IStringLocalizer` (as `L` object) and used for localization. While the code above pretty easy to understand, you can check the Blazorise [Card](https://blazorise.com/docs/components/card/) and [DataGrid](https://blazorise.com/docs/extensions/datagrid/) documents to understand them better. -#### About the BlazoriseCrudPageBase +#### About the AbpCrudPageBase -We will continue to benefit from the `BlazoriseCrudPageBase` for the books page. You could just inject the `IBookAppService` and perform all the server side calls yourself (thanks to the [Dynamic C# HTTP API Client Proxy](../API/Dynamic-CSharp-API-Clients.md) system of the ABP Framework). We will do it manually for the authors page to demonstrate how to call server side HTTP APIs in your Blazor applications. +We will continue to benefit from the `AbpCrudPageBase` for the books page. You could just inject the `IBookAppService` and perform all the server side calls yourself (thanks to the [Dynamic C# HTTP API Client Proxy](../API/Dynamic-CSharp-API-Clients.md) system of the ABP Framework). We will do it manually for the authors page to demonstrate how to call server side HTTP APIs in your Blazor applications. ## Run the Final Application diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index 079b9e7cf8..dae7e4bfdb 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -1163,7 +1163,7 @@ Clicking the "Delete" action calls the `delete` method which then shows a confir ## Creating a New Book -In this section, you will learn how to create a new modal dialog form to create a new book. Since we've inherited from the `BlazoriseCrudPage`, we only need to develop the view part. +In this section, you will learn how to create a new modal dialog form to create a new book. Since we've inherited from the `AbpCrudPageBase`, we only need to develop the view part. ### Add "New Button" Button @@ -1328,7 +1328,7 @@ We can now define a modal to edit the book. Add the following code to the end of ### AutoMapper Configuration -The base `BlazoriseCrudPage` uses the [object to object mapping](../Object-To-Object-Mapping.md) system to convert an incoming `BookDto` object to a `CreateUpdateBookDto` object. So, we need to define the mapping. +The base `AbpCrudPageBase` uses the [object to object mapping](../Object-To-Object-Mapping.md) system to convert an incoming `BookDto` object to a `CreateUpdateBookDto` object. So, we need to define the mapping. Open the `BookStoreBlazorAutoMapperProfile` inside the `Acme.BookStore.Blazor` project and change the content as the following: @@ -1382,7 +1382,7 @@ Here the complete code to create the book management CRUD page, that has been de @using Acme.BookStore.Localization @using Microsoft.Extensions.Localization @inject IStringLocalizer L -@inherits BlazoriseCrudPageBase +@inherits AbpCrudPageBase @@ -1392,8 +1392,10 @@ Here the complete code to create the book management CRUD page, that has been de - + @@ -1406,10 +1408,10 @@ Here the complete code to create the book management CRUD page, that has been de ShowPager="true" PageSize="PageSize"> - @@ -1434,7 +1436,7 @@ Here the complete code to create the book management CRUD page, that has been de Field="@nameof(BookDto.Type)" Caption="@L["Type"]"> - @L[$"Enum:BookType:{(int) context.Type}"] + @L[$"Enum:BookType:{(int)context.Type}"] Date: Sat, 17 Oct 2020 18:06:29 +0300 Subject: [PATCH 43/55] Update Part-4.md --- docs/en/Tutorials/Part-4.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/en/Tutorials/Part-4.md b/docs/en/Tutorials/Part-4.md index 9c31f4fd3c..d9c000be5c 100644 --- a/docs/en/Tutorials/Part-4.md +++ b/docs/en/Tutorials/Part-4.md @@ -75,9 +75,12 @@ If you had created a data seed contributor as described in the [first part](Part Add a new test class, named `BookAppService_Tests` in the `Books` namespace (folder) of the `Acme.BookStore.Application.Tests` project: ````csharp +using System; +using System.Linq; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; using Xunit; namespace Acme.BookStore.Books From 21dda26350458d49fcd3108d20869bd9bbce94d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 18:18:25 +0300 Subject: [PATCH 44/55] Update Part-5.md --- docs/en/Tutorials/Part-5.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/en/Tutorials/Part-5.md b/docs/en/Tutorials/Part-5.md index 815addd224..d083d18a2e 100644 --- a/docs/en/Tutorials/Part-5.md +++ b/docs/en/Tutorials/Part-5.md @@ -460,7 +460,7 @@ Open the `/src/app/book/book.component.html` file and replace the edit and delet ### Authorize the Razor Component -Open the `/Pages/Books.razor` file in the `Acme.BookStore.Blazor` project and add an `Authorize` attribute just after the `@page` directive, as shown below: +Open the `/Pages/Books.razor` file in the `Acme.BookStore.Blazor` project and add an `Authorize` attribute just after the `@page` directive and the following namespace imports (`@using` lines), as shown below: ````html @page "/books" @@ -518,7 +518,9 @@ Wrap the *New Book* button by an `if` block as shown below: @if (canCreateBook) { + Clicked="OpenCreateModalAsync"> + @L["NewBook"] + } ```` @@ -545,7 +547,7 @@ As similar to the *New Book* button, we can use `if` blocks to conditionally sho You can run and test the permissions. Remove a book related permission from the admin role to see the related button/action disappears from the UI. -However, ABP Framework caches the permissions of the current user in the client side. So, when you change a permission for yourself, you need to manually **refresh the page** to take the effect. If you don't refresh and try to use the prohibited action you get an HTTP 403 (forbidden) response from the server. +**ABP Framework caches the permissions** of the current user in the client side. So, when you change a permission for yourself, you need to manually **refresh the page** to take the effect. If you don't refresh and try to use the prohibited action you get an HTTP 403 (forbidden) response from the server. > Changing a permission for a role or user immediately available on the server side. So, this cache system doesn't cause any security problem. From 28a35433ff6554fa717ba52fccd2d25e53c53659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 19:12:11 +0300 Subject: [PATCH 45/55] Update Part-7.md --- docs/en/Tutorials/Part-7.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/Tutorials/Part-7.md b/docs/en/Tutorials/Part-7.md index 32c9f6b9a4..5cae52a4b1 100644 --- a/docs/en/Tutorials/Part-7.md +++ b/docs/en/Tutorials/Part-7.md @@ -74,6 +74,10 @@ Open the **Package Manager Console** on Visual Studio and ensure that the **Defa Run the following command to create a new database migration: +````bash +Add-Migration "Added_Authors" +```` + ![bookstore-add-migration-authors](images/bookstore-add-migration-authors.png) This will create a new migration class. Then run the `Update-Database` command to create the table on the database. From 12a7be8162c7830677c7d7763ab6197200e87f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 20:16:50 +0300 Subject: [PATCH 46/55] Added Run the Application section --- docs/en/Tutorials/Part-9.md | 14 ++++++++++++++ .../images/bookstore-authors-blazor-ui.png | Bin 0 -> 51931 bytes 2 files changed, 14 insertions(+) create mode 100644 docs/en/Tutorials/images/bookstore-authors-blazor-ui.png diff --git a/docs/en/Tutorials/Part-9.md b/docs/en/Tutorials/Part-9.md index 841d2fb3cb..374efff2b4 100644 --- a/docs/en/Tutorials/Part-9.md +++ b/docs/en/Tutorials/Part-9.md @@ -1177,6 +1177,20 @@ We should complete the localizations we've used above. Open the `en.json` file u "NewAuthor": "New author" ```` +### Run the Application + +Run and login to the application. **If you don't see the Authors menu item under the Book Store menu, that means you don't have the permission yet.** Go to the `identity/roles` page, click to the *Actions* button and select the *Permissions* action for the **admin role**: + +![bookstore-author-permissions](images/bookstore-author-permissions.png) + +As you see, the admin role has no *Author Management* permissions yet. Click to the checkboxes and save the modal to grant the necessary permissions. You will see the *Authors* menu item under the *Book Store* in the main menu, after **refreshing the page**: + +![bookstore-authors-page](images/bookstore-authors-blazor-ui.png) + +That's all! This is a fully working CRUD page, you can create, edit and delete the authors. + +> **Tip**: If you run the `.DbMigrator` console application after defining a new permission, it automatically grants these new permissions to the admin role and you don't need to manually grant the permissions yourself. + {{end}} ## The Next Part diff --git a/docs/en/Tutorials/images/bookstore-authors-blazor-ui.png b/docs/en/Tutorials/images/bookstore-authors-blazor-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9480957d6346982e4eac6518d1a3a36db0e502 GIT binary patch literal 51931 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%0DOXIfW@w~0u*{81| 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

MFQRu6Ij0c=S79xk|EXGCv60FT=Z?`f); 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 Date: Sat, 17 Oct 2020 20:28:09 +0300 Subject: [PATCH 47/55] Update Part-10.md --- docs/en/Tutorials/Part-10.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-10.md b/docs/en/Tutorials/Part-10.md index 2e0b1c4939..53f19d93dd 100644 --- a/docs/en/Tutorials/Part-10.md +++ b/docs/en/Tutorials/Part-10.md @@ -38,7 +38,7 @@ This tutorial has multiple versions based on your **UI** and **Database** prefer We have created `Book` and `Author` functionalities for the book store application. However, currently there is no relation between these entities. -In this tutorial, we will establish a **1 to N** relation between the `Book` and the `Author`. +In this tutorial, we will establish a **1 to N** relation between the `Author` and the `Book` entities. ## Add Relation to The Book Entity From ec5745bdc563a238b0df51ef6291edccba18cf59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 17 Oct 2020 20:39:23 +0300 Subject: [PATCH 48/55] Update Repositories.md --- docs/en/Repositories.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Repositories.md b/docs/en/Repositories.md index d674aac820..0fc80984e7 100644 --- a/docs/en/Repositories.md +++ b/docs/en/Repositories.md @@ -270,7 +270,7 @@ This method is suggested; For example, ABP Framework uses the `IAsyncQueryableExecuter` in the `CrudAppService` base class (see the [application services](Application-Services.md) document). -### Option-3: Custom Repository Methods +### Option-4: Custom Repository Methods You can always create custom repository methods and use the database provider specific APIs, like async extension methods here. See [EF Core](Entity-Framework-Core.md) or [MongoDb](MongoDB.md) document for more info about the custom repositories. From 011cf70c68fe2e3078dd245ed30363972dcf990b Mon Sep 17 00:00:00 2001 From: taujiong Date: Mon, 19 Oct 2020 00:44:01 +0800 Subject: [PATCH 49/55] correct exception message in PermissionAppService.CheckProviderPolicy change 'policyName' to 'providerName' in the exception message --- .../Volo/Abp/PermissionManagement/PermissionAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs index c358edf4a8..c0fbee97df 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Application/Volo/Abp/PermissionManagement/PermissionAppService.cs @@ -116,7 +116,7 @@ namespace Volo.Abp.PermissionManagement var policyName = Options.ProviderPolicies.GetOrDefault(providerName); if (policyName.IsNullOrEmpty()) { - throw new AbpException($"No policy defined to get/set permissions for the provider '{policyName}'. Use {nameof(PermissionManagementOptions)} to map the policy."); + throw new AbpException($"No policy defined to get/set permissions for the provider '{providerName}'. Use {nameof(PermissionManagementOptions)} to map the policy."); } await AuthorizationService.CheckAsync(policyName); From 19c6d2f95ad1cd9e7aa5db240978ec56b2f0c991 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 19 Oct 2020 09:10:56 +0800 Subject: [PATCH 50/55] Use providerName instead of policyName for exception message. https://github.com/abpframework/abp/pull/5847 --- .../Volo/Abp/FeatureManagement/FeatureAppService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs index bfb6e65ea8..ef5b059b0d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -114,7 +114,7 @@ namespace Volo.Abp.FeatureManagement policyName = Options.ProviderPolicies.GetOrDefault(providerName); if (policyName.IsNullOrEmpty()) { - throw new AbpException($"No policy defined to get/set permissions for the provider '{policyName}'. Use {nameof(FeatureManagementOptions)} to map the policy."); + throw new AbpException($"No policy defined to get/set permissions for the provider '{providerName}'. Use {nameof(FeatureManagementOptions)} to map the policy."); } } From 8f9d0bfdfb25275914aaad7291cda4d264105544 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 19 Oct 2020 10:12:17 +0800 Subject: [PATCH 51/55] Update template projects migrations. --- ....cs => 20201019020935_Initial.Designer.cs} | 1139 ++++++++------ .../Migrations/20201019020935_Initial.cs | 1380 +++++++++++++++++ ...ectNameMigrationsDbContextModelSnapshot.cs | 1110 +++++++------ ....cs => 20201019021119_Initial.Designer.cs} | 206 +-- ...1_Initial.cs => 20201019021119_Initial.cs} | 114 +- ...ApiHostMigrationsDbContextModelSnapshot.cs | 204 +-- .../Migrations/20201013055209_Initial.cs | 1232 --------------- ....cs => 20201019021120_Initial.Designer.cs} | 1276 +++++++++------ .../Migrations/20201019021120_Initial.cs} | 754 +++++---- ...verHostMigrationsDbContextModelSnapshot.cs | 1090 +++++++------ .../20201019021101_Initial.Designer.cs | 1222 +++++++++++++++ .../Migrations/20201019021101_Initial.cs | 726 +++++++++ .../UnifiedDbContextModelSnapshot.cs | 628 ++++---- 13 files changed, 6890 insertions(+), 4191 deletions(-) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200909022225_Initial.Designer.cs => 20201019020935_Initial.Designer.cs} (66%) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20200928072851_Initial.Designer.cs => 20201019021119_Initial.Designer.cs} (63%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/{20200928072851_Initial.cs => 20201019021119_Initial.cs} (50%) delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.cs rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20201013055209_Initial.Designer.cs => 20201019021120_Initial.Designer.cs} (61%) rename templates/{app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.cs => module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs} (53%) create mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs create mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs similarity index 66% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs index cebb89fe4c..7e948c753c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.Designer.cs @@ -11,17 +11,17 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200909022225_Initial")] + [Migration("20201019020935_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.6") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -30,99 +30,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -140,39 +140,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -190,39 +190,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -243,30 +243,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -283,17 +283,17 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsAbandoned") .ValueGeneratedOnAdd() @@ -302,13 +302,13 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("JobArgs") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(1048576); + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); b.Property("JobName") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("LastTryTime") .HasColumnType("datetime2"); @@ -341,21 +341,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.HasKey("Id"); @@ -372,33 +372,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -411,6 +411,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpClaimTypes"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => { b.Property("Id") @@ -419,39 +446,39 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -467,19 +494,19 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -495,60 +522,60 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("UserId") .HasColumnType("uniqueidentifier"); b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); @@ -571,136 +598,136 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("IsExternal") .ValueGeneratedOnAdd() - .HasColumnName("IsExternal") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -722,16 +749,16 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -749,21 +776,21 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -781,16 +808,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -808,8 +835,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -824,16 +851,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -851,62 +878,62 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -926,16 +953,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -951,64 +978,64 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AllowedAccessTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Enabled") .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); @@ -1027,8 +1054,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Type"); @@ -1041,12 +1068,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiResourceId", "Key", "Value"); @@ -1059,8 +1086,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Scope"); @@ -1073,16 +1100,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1100,33 +1127,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1135,27 +1162,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1177,8 +1204,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiScopeId", "Type"); @@ -1191,12 +1218,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiScopeId", "Key", "Value"); @@ -1231,8 +1258,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("AllowedIdentityTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1247,54 +1274,54 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsentLifetime") .HasColumnType("int"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DeviceCodeLifetime") .HasColumnType("int"); @@ -1306,15 +1333,15 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("FrontChannelLogoutSessionRequired") .HasColumnType("bit"); b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("IdentityTokenLifetime") .HasColumnType("int"); @@ -1324,30 +1351,30 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ProtocolType") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("RefreshTokenExpiration") .HasColumnType("int"); @@ -1374,8 +1401,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("UserSsoLifetime") .HasColumnType("int"); @@ -1393,12 +1420,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "Type", "Value"); @@ -1411,8 +1438,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); b.HasKey("ClientId", "Origin"); @@ -1425,8 +1452,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "GrantType"); @@ -1439,8 +1466,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Provider"); @@ -1453,8 +1480,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "PostLogoutRedirectUri"); @@ -1467,12 +1494,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "Key", "Value"); @@ -1485,8 +1512,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "RedirectUri"); @@ -1499,8 +1526,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Scope"); @@ -1513,16 +1540,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1540,57 +1567,57 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("DeviceCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .IsRequired() .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("UserCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("Id"); @@ -1607,19 +1634,19 @@ namespace MyCompanyName.MyProjectName.Migrations modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => { b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsumedTime") .HasColumnType("datetime2"); @@ -1629,35 +1656,35 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Id") .HasColumnType("uniqueidentifier"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Type") .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); b.HasKey("Key"); @@ -1678,33 +1705,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1713,27 +1740,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1755,8 +1782,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("IdentityResourceId", "Type"); @@ -1769,12 +1796,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("IdentityResourceId", "Key", "Value"); @@ -1789,22 +1816,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1821,21 +1848,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -1852,48 +1879,48 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -1908,13 +1935,13 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -2197,6 +2224,92 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs new file mode 100644 index 0000000000..dfa2b7fbd5 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20201019020935_Initial.cs @@ -0,0 +1,1380 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MyCompanyName.MyProjectName.Migrations +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(max)", nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + JobName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + JobArgs = table.Column(type: "nvarchar(max)", maxLength: 1048576, nullable: false), + TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), + CreationTime = table.Column(type: "datetime2", nullable: false), + NextTryTime = table.Column(type: "datetime2", nullable: false), + LastTryTime = table.Column(type: "datetime2", nullable: true), + IsAbandoned = table.Column(type: "bit", nullable: false, defaultValue: false), + Priority = table.Column(type: "tinyint", nullable: false, defaultValue: (byte)15), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResources", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + AllowedAccessTokenSigningAlgorithms = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiScopes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Required = table.Column(type: "bit", nullable: false), + Emphasize = table.Column(type: "bit", nullable: false), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClients", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ClientName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + ClientUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + LogoUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + ProtocolType = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + RequireClientSecret = table.Column(type: "bit", nullable: false), + RequireConsent = table.Column(type: "bit", nullable: false), + AllowRememberConsent = table.Column(type: "bit", nullable: false), + AlwaysIncludeUserClaimsInIdToken = table.Column(type: "bit", nullable: false), + RequirePkce = table.Column(type: "bit", nullable: false), + AllowPlainTextPkce = table.Column(type: "bit", nullable: false), + RequireRequestObject = table.Column(type: "bit", nullable: false), + AllowAccessTokensViaBrowser = table.Column(type: "bit", nullable: false), + FrontChannelLogoutUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + FrontChannelLogoutSessionRequired = table.Column(type: "bit", nullable: false), + BackChannelLogoutUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + BackChannelLogoutSessionRequired = table.Column(type: "bit", nullable: false), + AllowOfflineAccess = table.Column(type: "bit", nullable: false), + IdentityTokenLifetime = table.Column(type: "int", nullable: false), + AllowedIdentityTokenSigningAlgorithms = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + AccessTokenLifetime = table.Column(type: "int", nullable: false), + AuthorizationCodeLifetime = table.Column(type: "int", nullable: false), + ConsentLifetime = table.Column(type: "int", nullable: true), + AbsoluteRefreshTokenLifetime = table.Column(type: "int", nullable: false), + SlidingRefreshTokenLifetime = table.Column(type: "int", nullable: false), + RefreshTokenUsage = table.Column(type: "int", nullable: false), + UpdateAccessTokenClaimsOnRefresh = table.Column(type: "bit", nullable: false), + RefreshTokenExpiration = table.Column(type: "int", nullable: false), + AccessTokenType = table.Column(type: "int", nullable: false), + EnableLocalLogin = table.Column(type: "bit", nullable: false), + IncludeJwtId = table.Column(type: "bit", nullable: false), + AlwaysSendClientClaims = table.Column(type: "bit", nullable: false), + ClientClaimsPrefix = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + PairWiseSubjectSalt = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + UserSsoLifetime = table.Column(type: "int", nullable: true), + UserCodeType = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + DeviceCodeLifetime = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerDeviceFlowCodes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + DeviceCode = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + UserCode = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + SubjectId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + SessionId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Description = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: false), + Data = table.Column(type: "nvarchar(max)", maxLength: 50000, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerDeviceFlowCodes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityResources", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + Required = table.Column(type: "bit", nullable: false), + Emphasize = table.Column(type: "bit", nullable: false), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityResources", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerPersistedGrants", + columns: table => new + { + Key = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + SubjectId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + SessionId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Description = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + Expiration = table.Column(type: "datetime2", nullable: true), + ConsumedTime = table.Column(type: "datetime2", nullable: true), + Data = table.Column(type: "nvarchar(max)", maxLength: 50000, nullable: false), + Id = table.Column(type: "uniqueidentifier", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerPersistedGrants", x => x.Key); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceClaims", + columns: table => new + { + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceClaims", x => new { x.ApiResourceId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceClaims_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceProperties", + columns: table => new + { + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceProperties", x => new { x.ApiResourceId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceProperties_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceScopes", + columns: table => new + { + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Scope = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceScopes", x => new { x.ApiResourceId, x.Scope }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceScopes_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiResourceSecrets", + columns: table => new + { + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: false), + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiResourceSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiResourceSecrets_IdentityServerApiResources_ApiResourceId", + column: x => x.ApiResourceId, + principalTable: "IdentityServerApiResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiScopeClaims", + columns: table => new + { + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ApiScopeId = table.Column(type: "uniqueidentifier", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiScopeId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiScopeId", + column: x => x.ApiScopeId, + principalTable: "IdentityServerApiScopes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerApiScopeProperties", + columns: table => new + { + ApiScopeId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerApiScopeProperties", x => new { x.ApiScopeId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerApiScopeProperties_IdentityServerApiScopes_ApiScopeId", + column: x => x.ApiScopeId, + principalTable: "IdentityServerApiScopes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientClaims", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientClaims", x => new { x.ClientId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerClientClaims_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientCorsOrigins", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Origin = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientCorsOrigins", x => new { x.ClientId, x.Origin }); + table.ForeignKey( + name: "FK_IdentityServerClientCorsOrigins_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientGrantTypes", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + GrantType = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientGrantTypes", x => new { x.ClientId, x.GrantType }); + table.ForeignKey( + name: "FK_IdentityServerClientGrantTypes_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientIdPRestrictions", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Provider = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientIdPRestrictions", x => new { x.ClientId, x.Provider }); + table.ForeignKey( + name: "FK_IdentityServerClientIdPRestrictions_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientPostLogoutRedirectUris", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + PostLogoutRedirectUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientPostLogoutRedirectUris", x => new { x.ClientId, x.PostLogoutRedirectUri }); + table.ForeignKey( + name: "FK_IdentityServerClientPostLogoutRedirectUris_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientProperties", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientRedirectUris", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + RedirectUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientRedirectUris", x => new { x.ClientId, x.RedirectUri }); + table.ForeignKey( + name: "FK_IdentityServerClientRedirectUris_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientScopes", + columns: table => new + { + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Scope = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientScopes", x => new { x.ClientId, x.Scope }); + table.ForeignKey( + name: "FK_IdentityServerClientScopes_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerClientSecrets", + columns: table => new + { + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: false), + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerClientSecrets", x => new { x.ClientId, x.Type, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerClientSecrets_IdentityServerClients_ClientId", + column: x => x.ClientId, + principalTable: "IdentityServerClients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityResourceClaims", + columns: table => new + { + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + IdentityResourceId = table.Column(type: "uniqueidentifier", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityResourceClaims", x => new { x.IdentityResourceId, x.Type }); + table.ForeignKey( + name: "FK_IdentityServerIdentityResourceClaims_IdentityServerIdentityResources_IdentityResourceId", + column: x => x.IdentityResourceId, + principalTable: "IdentityServerIdentityResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "IdentityServerIdentityResourceProperties", + columns: table => new + { + IdentityResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_IdentityServerIdentityResourceProperties", x => new { x.IdentityResourceId, x.Key, x.Value }); + table.ForeignKey( + name: "FK_IdentityServerIdentityResourceProperties_IdentityServerIdentityResources_IdentityResourceId", + column: x => x.IdentityResourceId, + principalTable: "IdentityServerIdentityResources", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "IsAbandoned", "NextTryTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerApiResources_Name", + table: "IdentityServerApiResources", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerApiScopes_Name", + table: "IdentityServerApiScopes", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerClients_ClientId", + table: "IdentityServerClients", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerDeviceFlowCodes_DeviceCode", + table: "IdentityServerDeviceFlowCodes", + column: "DeviceCode", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerDeviceFlowCodes_Expiration", + table: "IdentityServerDeviceFlowCodes", + column: "Expiration"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerDeviceFlowCodes_UserCode", + table: "IdentityServerDeviceFlowCodes", + column: "UserCode"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerIdentityResources_Name", + table: "IdentityServerIdentityResources", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_Expiration", + table: "IdentityServerPersistedGrants", + column: "Expiration"); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", + table: "IdentityServerPersistedGrants", + columns: new[] { "SubjectId", "ClientId", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_IdentityServerPersistedGrants_SubjectId_SessionId_Type", + table: "IdentityServerPersistedGrants", + columns: new[] { "SubjectId", "SessionId", "Type" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResourceSecrets"); + + migrationBuilder.DropTable( + name: "IdentityServerApiScopeClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerApiScopeProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerClientClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerClientCorsOrigins"); + + migrationBuilder.DropTable( + name: "IdentityServerClientGrantTypes"); + + migrationBuilder.DropTable( + name: "IdentityServerClientIdPRestrictions"); + + migrationBuilder.DropTable( + name: "IdentityServerClientPostLogoutRedirectUris"); + + migrationBuilder.DropTable( + name: "IdentityServerClientProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerClientRedirectUris"); + + migrationBuilder.DropTable( + name: "IdentityServerClientScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerClientSecrets"); + + migrationBuilder.DropTable( + name: "IdentityServerDeviceFlowCodes"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityResourceClaims"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityResourceProperties"); + + migrationBuilder.DropTable( + name: "IdentityServerPersistedGrants"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "IdentityServerApiResources"); + + migrationBuilder.DropTable( + name: "IdentityServerApiScopes"); + + migrationBuilder.DropTable( + name: "IdentityServerClients"); + + migrationBuilder.DropTable( + name: "IdentityServerIdentityResources"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + } + } +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index 44036df56d..657232cff2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -16,10 +16,10 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -28,99 +28,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -138,39 +138,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -188,39 +188,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -241,30 +241,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -281,17 +281,17 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsAbandoned") .ValueGeneratedOnAdd() @@ -300,13 +300,13 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("JobArgs") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(1048576); + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); b.Property("JobName") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("LastTryTime") .HasColumnType("datetime2"); @@ -339,21 +339,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.HasKey("Id"); @@ -370,33 +370,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -444,39 +444,39 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -492,19 +492,19 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -520,60 +520,60 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("UserId") .HasColumnType("uniqueidentifier"); b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); @@ -596,136 +596,136 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("IsExternal") .ValueGeneratedOnAdd() - .HasColumnName("IsExternal") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -747,16 +747,16 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -774,21 +774,21 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -806,16 +806,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -833,8 +833,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -849,16 +849,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -876,62 +876,62 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -951,16 +951,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -976,64 +976,64 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AllowedAccessTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Enabled") .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); @@ -1052,8 +1052,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Type"); @@ -1066,12 +1066,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiResourceId", "Key", "Value"); @@ -1084,8 +1084,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Scope"); @@ -1098,16 +1098,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1125,33 +1125,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1160,27 +1160,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1202,8 +1202,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiScopeId", "Type"); @@ -1216,12 +1216,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiScopeId", "Key", "Value"); @@ -1256,8 +1256,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("AllowedIdentityTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1272,54 +1272,54 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsentLifetime") .HasColumnType("int"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DeviceCodeLifetime") .HasColumnType("int"); @@ -1331,15 +1331,15 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("FrontChannelLogoutSessionRequired") .HasColumnType("bit"); b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("IdentityTokenLifetime") .HasColumnType("int"); @@ -1349,30 +1349,30 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ProtocolType") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("RefreshTokenExpiration") .HasColumnType("int"); @@ -1399,8 +1399,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("UserSsoLifetime") .HasColumnType("int"); @@ -1418,12 +1418,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "Type", "Value"); @@ -1436,8 +1436,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); b.HasKey("ClientId", "Origin"); @@ -1450,8 +1450,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "GrantType"); @@ -1464,8 +1464,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Provider"); @@ -1478,8 +1478,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "PostLogoutRedirectUri"); @@ -1492,12 +1492,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "Key", "Value"); @@ -1510,8 +1510,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "RedirectUri"); @@ -1524,8 +1524,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Scope"); @@ -1538,16 +1538,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1565,57 +1565,57 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("DeviceCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .IsRequired() .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("UserCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("Id"); @@ -1632,19 +1632,19 @@ namespace MyCompanyName.MyProjectName.Migrations modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => { b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsumedTime") .HasColumnType("datetime2"); @@ -1654,35 +1654,35 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Id") .HasColumnType("uniqueidentifier"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Type") .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); b.HasKey("Key"); @@ -1703,33 +1703,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1738,27 +1738,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1780,8 +1780,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("IdentityResourceId", "Type"); @@ -1794,12 +1794,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("IdentityResourceId", "Key", "Value"); @@ -1814,22 +1814,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1846,21 +1846,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -1877,48 +1877,48 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -1933,13 +1933,13 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -2222,6 +2222,92 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.Designer.cs similarity index 63% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.Designer.cs index 2ad2035056..119214a82e 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.Designer.cs @@ -11,17 +11,17 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameHttpApiHostMigrationsDbContext))] - [Migration("20200928072851_Initial")] + [Migration("20201019021119_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.6") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -30,99 +30,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -140,39 +140,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -190,39 +190,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -243,30 +243,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -283,22 +283,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -315,21 +315,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -364,6 +364,18 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.cs similarity index 50% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.cs index 91345ac0a7..71b8ab569f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20200928072851_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/20201019021119_Initial.cs @@ -11,28 +11,28 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpAuditLogs", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(max)", nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { @@ -43,11 +43,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpPermissionGrants", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) }, constraints: table => { @@ -58,11 +58,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpSettings", columns: table => new { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) }, constraints: table => { @@ -73,15 +73,15 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpAuditLogActions", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, constraints: table => { @@ -98,15 +98,15 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpEntityChanges", columns: table => new { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, constraints: table => { @@ -123,13 +123,13 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpEntityPropertyChanges", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) }, constraints: table => { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs index 8a6bbe1a3c..5ede5096a0 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Migrations/MyProjectNameHttpApiHostMigrationsDbContextModelSnapshot.cs @@ -16,10 +16,10 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.6") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -28,99 +28,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -138,39 +138,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -188,39 +188,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -241,30 +241,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -281,22 +281,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -313,21 +313,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -362,6 +362,18 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.cs deleted file mode 100644 index d18a756fc0..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.cs +++ /dev/null @@ -1,1232 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace MyCompanyName.MyProjectName.Migrations -{ - public partial class Initial : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - Required = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - Regex = table.Column(maxLength: 512, nullable: true), - RegexDescription = table.Column(maxLength: 128, nullable: true), - Description = table.Column(maxLength: 256, nullable: true), - ValueType = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpFeatureValues", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpLinkUsers", - columns: table => new - { - Id = table.Column(nullable: false), - SourceUserId = table.Column(nullable: false), - SourceTenantId = table.Column(nullable: true), - TargetUserId = table.Column(nullable: false), - TargetTenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Code = table.Column(maxLength: 95, nullable: false), - DisplayName = table.Column(maxLength: 128, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - NormalizedName = table.Column(maxLength: 256, nullable: false), - IsDefault = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - IsPublic = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSecurityLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - Identity = table.Column(maxLength: 96, nullable: true), - Action = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantName = table.Column(maxLength: 64, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - NormalizedUserName = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - Email = table.Column(maxLength: 256, nullable: false), - NormalizedEmail = table.Column(maxLength: 256, nullable: false), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PasswordHash = table.Column(maxLength: 256, nullable: true), - SecurityStamp = table.Column(maxLength: 256, nullable: false), - IsExternal = table.Column(nullable: false, defaultValue: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), - TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClients", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - ClientName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - ClientUri = table.Column(maxLength: 2000, nullable: true), - LogoUri = table.Column(maxLength: 2000, nullable: true), - Enabled = table.Column(nullable: false), - ProtocolType = table.Column(maxLength: 200, nullable: false), - RequireClientSecret = table.Column(nullable: false), - RequireConsent = table.Column(nullable: false), - AllowRememberConsent = table.Column(nullable: false), - AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), - RequirePkce = table.Column(nullable: false), - AllowPlainTextPkce = table.Column(nullable: false), - AllowAccessTokensViaBrowser = table.Column(nullable: false), - FrontChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - FrontChannelLogoutSessionRequired = table.Column(nullable: false), - BackChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - BackChannelLogoutSessionRequired = table.Column(nullable: false), - AllowOfflineAccess = table.Column(nullable: false), - IdentityTokenLifetime = table.Column(nullable: false), - AccessTokenLifetime = table.Column(nullable: false), - AuthorizationCodeLifetime = table.Column(nullable: false), - ConsentLifetime = table.Column(nullable: true), - AbsoluteRefreshTokenLifetime = table.Column(nullable: false), - SlidingRefreshTokenLifetime = table.Column(nullable: false), - RefreshTokenUsage = table.Column(nullable: false), - UpdateAccessTokenClaimsOnRefresh = table.Column(nullable: false), - RefreshTokenExpiration = table.Column(nullable: false), - AccessTokenType = table.Column(nullable: false), - EnableLocalLogin = table.Column(nullable: false), - IncludeJwtId = table.Column(nullable: false), - AlwaysSendClientClaims = table.Column(nullable: false), - ClientClaimsPrefix = table.Column(maxLength: 200, nullable: true), - PairWiseSubjectSalt = table.Column(maxLength: 200, nullable: true), - UserSsoLifetime = table.Column(nullable: true), - UserCodeType = table.Column(maxLength: 100, nullable: true), - DeviceCodeLifetime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClients", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerDeviceFlowCodes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - DeviceCode = table.Column(maxLength: 200, nullable: false), - UserCode = table.Column(maxLength: 200, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - Expiration = table.Column(nullable: false), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerDeviceFlowCodes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityResources", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false), - Properties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityResources", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerPersistedGrants", - columns: table => new - { - Key = table.Column(maxLength: 200, nullable: false), - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Type = table.Column(maxLength: 50, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - CreationTime = table.Column(nullable: false), - Expiration = table.Column(nullable: true), - Data = table.Column(maxLength: 50000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerPersistedGrants", x => x.Key); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - RoleId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(nullable: false), - Name = table.Column(maxLength: 64, nullable: false), - Value = table.Column(maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - TenantId = table.Column(nullable: true), - ProviderKey = table.Column(maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - TenantId = table.Column(nullable: true), - Value = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiClaims", x => new { x.ApiResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiClaims_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopes", - columns: table => new - { - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopes", x => new { x.ApiResourceId, x.Name }); - table.ForeignKey( - name: "FK_IdentityServerApiScopes_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiSecrets", x => new { x.ApiResourceId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResourceId", - column: x => x.ApiResourceId, - principalTable: "IdentityServerApiResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientClaims", - columns: table => new - { - ClientId = table.Column(nullable: false), - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientClaims", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientClaims_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientCorsOrigins", - columns: table => new - { - ClientId = table.Column(nullable: false), - Origin = table.Column(maxLength: 150, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientCorsOrigins", x => new { x.ClientId, x.Origin }); - table.ForeignKey( - name: "FK_IdentityServerClientCorsOrigins_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientGrantTypes", - columns: table => new - { - ClientId = table.Column(nullable: false), - GrantType = table.Column(maxLength: 250, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientGrantTypes", x => new { x.ClientId, x.GrantType }); - table.ForeignKey( - name: "FK_IdentityServerClientGrantTypes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientIdPRestrictions", - columns: table => new - { - ClientId = table.Column(nullable: false), - Provider = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientIdPRestrictions", x => new { x.ClientId, x.Provider }); - table.ForeignKey( - name: "FK_IdentityServerClientIdPRestrictions_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientPostLogoutRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - PostLogoutRedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientPostLogoutRedirectUris", x => new { x.ClientId, x.PostLogoutRedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientPostLogoutRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientProperties", - columns: table => new - { - ClientId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientProperties", x => new { x.ClientId, x.Key }); - table.ForeignKey( - name: "FK_IdentityServerClientProperties_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientRedirectUris", - columns: table => new - { - ClientId = table.Column(nullable: false), - RedirectUri = table.Column(maxLength: 2000, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientRedirectUris", x => new { x.ClientId, x.RedirectUri }); - table.ForeignKey( - name: "FK_IdentityServerClientRedirectUris_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientScopes", - columns: table => new - { - ClientId = table.Column(nullable: false), - Scope = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientScopes", x => new { x.ClientId, x.Scope }); - table.ForeignKey( - name: "FK_IdentityServerClientScopes_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerClientSecrets", - columns: table => new - { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerClientSecrets", x => new { x.ClientId, x.Type, x.Value }); - table.ForeignKey( - name: "FK_IdentityServerClientSecrets_IdentityServerClients_ClientId", - column: x => x.ClientId, - principalTable: "IdentityServerClients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerIdentityClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - IdentityResourceId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerIdentityClaims", x => new { x.IdentityResourceId, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerIdentityClaims_IdentityServerIdentityResources_IdentityResourceId", - column: x => x.IdentityResourceId, - principalTable: "IdentityServerIdentityResources", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "IdentityServerApiScopeClaims", - columns: table => new - { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_IdentityServerApiScopeClaims", x => new { x.ApiResourceId, x.Name, x.Type }); - table.ForeignKey( - name: "FK_IdentityServerApiScopeClaims_IdentityServerApiScopes_ApiResourceId_Name", - columns: x => new { x.ApiResourceId, x.Name }, - principalTable: "IdentityServerApiScopes", - principalColumns: new[] { "ApiResourceId", "Name" }, - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", - table: "AbpFeatureValues", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", - table: "AbpLinkUsers", - columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, - unique: true, - filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Action", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Action" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_ApplicationName", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "ApplicationName" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_Identity", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "Identity" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSecurityLogs_TenantId_UserId", - table: "AbpSecurityLogs", - columns: new[] { "TenantId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerClients_ClientId", - table: "IdentityServerClients", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_DeviceCode", - table: "IdentityServerDeviceFlowCodes", - column: "DeviceCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_Expiration", - table: "IdentityServerDeviceFlowCodes", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerDeviceFlowCodes_UserCode", - table: "IdentityServerDeviceFlowCodes", - column: "UserCode", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_Expiration", - table: "IdentityServerPersistedGrants", - column: "Expiration"); - - migrationBuilder.CreateIndex( - name: "IX_IdentityServerPersistedGrants_SubjectId_ClientId_Type", - table: "IdentityServerPersistedGrants", - columns: new[] { "SubjectId", "ClientId", "Type" }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpFeatureValues"); - - migrationBuilder.DropTable( - name: "AbpLinkUsers"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSecurityLogs"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "IdentityServerApiClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopeClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerApiSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerClientClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerClientCorsOrigins"); - - migrationBuilder.DropTable( - name: "IdentityServerClientGrantTypes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientIdPRestrictions"); - - migrationBuilder.DropTable( - name: "IdentityServerClientPostLogoutRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientProperties"); - - migrationBuilder.DropTable( - name: "IdentityServerClientRedirectUris"); - - migrationBuilder.DropTable( - name: "IdentityServerClientScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClientSecrets"); - - migrationBuilder.DropTable( - name: "IdentityServerDeviceFlowCodes"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityClaims"); - - migrationBuilder.DropTable( - name: "IdentityServerPersistedGrants"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "IdentityServerApiScopes"); - - migrationBuilder.DropTable( - name: "IdentityServerClients"); - - migrationBuilder.DropTable( - name: "IdentityServerIdentityResources"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - - migrationBuilder.DropTable( - name: "IdentityServerApiResources"); - } - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs similarity index 61% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs index d8f36ad2ce..0f3b3b90b9 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201013055209_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.Designer.cs @@ -11,17 +11,17 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20201013055209_Initial")] + [Migration("20201019021120_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -30,99 +30,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -140,39 +140,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -190,39 +190,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -243,30 +243,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -283,21 +283,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.HasKey("Id"); @@ -314,33 +314,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -388,39 +388,39 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -436,19 +436,19 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -464,60 +464,60 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("UserId") .HasColumnType("uniqueidentifier"); b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); @@ -540,136 +540,136 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("IsExternal") .ValueGeneratedOnAdd() - .HasColumnName("IsExternal") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -691,16 +691,16 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -718,21 +718,21 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -750,16 +750,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -777,8 +777,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -793,16 +793,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -820,62 +820,62 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -895,16 +895,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -919,67 +919,74 @@ namespace MyCompanyName.MyProjectName.Migrations .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Enabled") .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.Property("Properties") - .HasColumnType("nvarchar(max)"); + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerApiResources"); }); @@ -989,86 +996,180 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Type"); - b.ToTable("IdentityServerApiClaims"); + b.ToTable("IdentityServerApiResourceClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { b.Property("ApiResourceId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Scope") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("ApiResourceId", "Scope"); + + b.ToTable("IdentityServerApiResourceScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiResourceSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + b.Property("Required") .HasColumnType("bit"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); - b.HasKey("ApiResourceId", "Name"); + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); b.ToTable("IdentityServerApiScopes"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Name") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); - b.HasKey("ApiResourceId", "Name", "Type"); + b.HasKey("ApiScopeId", "Type"); b.ToTable("IdentityServerApiScopeClaims"); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => { - b.Property("ApiResourceId") + b.Property("ApiScopeId") .HasColumnType("uniqueidentifier"); - b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); - b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); - - b.Property("Expiration") - .HasColumnType("datetime2"); + b.HasKey("ApiScopeId", "Key", "Value"); - b.HasKey("ApiResourceId", "Type", "Value"); - - b.ToTable("IdentityServerApiSecrets"); + b.ToTable("IdentityServerApiScopeProperties"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => @@ -1098,6 +1199,10 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AllowRememberConsent") .HasColumnType("bit"); + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1111,54 +1216,54 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsentLifetime") .HasColumnType("int"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DeviceCodeLifetime") .HasColumnType("int"); @@ -1170,15 +1275,15 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("FrontChannelLogoutSessionRequired") .HasColumnType("bit"); b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("IdentityTokenLifetime") .HasColumnType("int"); @@ -1188,30 +1293,30 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ProtocolType") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("RefreshTokenExpiration") .HasColumnType("int"); @@ -1228,6 +1333,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("RequirePkce") .HasColumnType("bit"); + b.Property("RequireRequestObject") + .HasColumnType("bit"); + b.Property("SlidingRefreshTokenLifetime") .HasColumnType("int"); @@ -1235,8 +1343,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("UserSsoLifetime") .HasColumnType("int"); @@ -1254,12 +1362,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "Type", "Value"); @@ -1272,8 +1380,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); b.HasKey("ClientId", "Origin"); @@ -1286,8 +1394,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "GrantType"); @@ -1300,8 +1408,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Provider"); @@ -1314,8 +1422,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "PostLogoutRedirectUri"); @@ -1328,15 +1436,14 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .IsRequired() - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); - b.HasKey("ClientId", "Key"); + b.HasKey("ClientId", "Key", "Value"); b.ToTable("IdentityServerClientProperties"); }); @@ -1347,8 +1454,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "RedirectUri"); @@ -1361,8 +1468,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Scope"); @@ -1375,16 +1482,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1402,49 +1509,57 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("DeviceCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .IsRequired() .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("UserCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("Id"); @@ -1453,8 +1568,7 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("Expiration"); - b.HasIndex("UserCode") - .IsUnique(); + b.HasIndex("UserCode"); b.ToTable("IdentityServerDeviceFlowCodes"); }); @@ -1462,46 +1576,57 @@ namespace MyCompanyName.MyProjectName.Migrations modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => { b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsumedTime") + .HasColumnType("datetime2"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Id") .HasColumnType("uniqueidentifier"); + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Type") .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); b.HasKey("Key"); @@ -1509,21 +1634,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasIndex("SubjectId", "ClientId", "Type"); - b.ToTable("IdentityServerPersistedGrants"); - }); + b.HasIndex("SubjectId", "SessionId", "Type"); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => - { - b.Property("IdentityResourceId") - .HasColumnType("uniqueidentifier"); - - b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.HasKey("IdentityResourceId", "Type"); - - b.ToTable("IdentityServerIdentityClaims"); + b.ToTable("IdentityServerPersistedGrants"); }); modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => @@ -1534,33 +1647,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1569,30 +1682,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); - - b.Property("Properties") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1602,9 +1712,44 @@ namespace MyCompanyName.MyProjectName.Migrations b.HasKey("Id"); + b.HasIndex("Name") + .IsUnique(); + b.ToTable("IdentityServerIdentityResources"); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityResourceClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Value") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.HasKey("IdentityResourceId", "Key", "Value"); + + b.ToTable("IdentityServerIdentityResourceProperties"); + }); + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => { b.Property("Id") @@ -1613,22 +1758,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1645,21 +1790,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -1676,48 +1821,48 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -1732,13 +1877,13 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -1869,25 +2014,25 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => { b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) - .WithMany("Scopes") + .WithMany("Properties") .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => { - b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) - .WithMany("UserClaims") - .HasForeignKey("ApiResourceId", "Name") + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => { b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) .WithMany("Secrets") @@ -1896,6 +2041,24 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("UserClaims") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("Properties") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => { b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) @@ -1977,7 +2140,7 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); - modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => { b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) .WithMany("UserClaims") @@ -1986,6 +2149,15 @@ namespace MyCompanyName.MyProjectName.Migrations .IsRequired(); }); + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => { b.HasOne("Volo.Abp.TenantManagement.Tenant", null) @@ -1994,6 +2166,92 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs similarity index 53% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs index 5677db545a..2296a18f25 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200909022225_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20201019021120_Initial.cs @@ -11,28 +11,28 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpAuditLogs", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(max)", nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { @@ -40,79 +40,73 @@ namespace MyCompanyName.MyProjectName.Migrations }); migrationBuilder.CreateTable( - name: "AbpBackgroundJobs", + name: "AbpClaimTypes", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - JobName = table.Column(maxLength: 128, nullable: false), - JobArgs = table.Column(maxLength: 1048576, nullable: false), - TryCount = table.Column(nullable: false, defaultValue: (short)0), - CreationTime = table.Column(nullable: false), - NextTryTime = table.Column(nullable: false), - LastTryTime = table.Column(nullable: true), - IsAbandoned = table.Column(nullable: false, defaultValue: false), - Priority = table.Column(nullable: false, defaultValue: (byte)15) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { - table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); }); migrationBuilder.CreateTable( - name: "AbpClaimTypes", + name: "AbpFeatureValues", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - Required = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - Regex = table.Column(maxLength: 512, nullable: true), - RegexDescription = table.Column(maxLength: 128, nullable: true), - Description = table.Column(maxLength: 256, nullable: true), - ValueType = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) }, constraints: table => { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); }); migrationBuilder.CreateTable( - name: "AbpFeatureValues", + name: "AbpLinkUsers", columns: table => new { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); }); migrationBuilder.CreateTable( name: "AbpOrganizationUnits", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Code = table.Column(maxLength: 95, nullable: false), - DisplayName = table.Column(maxLength: 128, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -129,11 +123,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpPermissionGrants", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) }, constraints: table => { @@ -144,15 +138,15 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpRoles", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - NormalizedName = table.Column(maxLength: 256, nullable: false), - IsDefault = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - IsPublic = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { @@ -163,21 +157,21 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpSecurityLogs", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - Identity = table.Column(maxLength: 96, nullable: true), - Action = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantName = table.Column(maxLength: 64, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - CreationTime = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { @@ -188,11 +182,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpSettings", columns: table => new { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) }, constraints: table => { @@ -203,17 +197,17 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpTenants", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 64, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -224,33 +218,33 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUsers", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - NormalizedUserName = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - Email = table.Column(maxLength: 256, nullable: false), - NormalizedEmail = table.Column(maxLength: 256, nullable: false), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PasswordHash = table.Column(maxLength: 256, nullable: true), - SecurityStamp = table.Column(maxLength: 256, nullable: false), - IsExternal = table.Column(nullable: false, defaultValue: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), - TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -261,22 +255,22 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiResources", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - AllowedAccessTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), - ShowInDiscoveryDocument = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + AllowedAccessTokenSigningAlgorithms = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -287,23 +281,23 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiScopes", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Enabled = table.Column(nullable: false), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Enabled = table.Column(type: "bit", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Required = table.Column(type: "bit", nullable: false), + Emphasize = table.Column(type: "bit", nullable: false), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -314,55 +308,55 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClients", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - ClientName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - ClientUri = table.Column(maxLength: 2000, nullable: true), - LogoUri = table.Column(maxLength: 2000, nullable: true), - Enabled = table.Column(nullable: false), - ProtocolType = table.Column(maxLength: 200, nullable: false), - RequireClientSecret = table.Column(nullable: false), - RequireConsent = table.Column(nullable: false), - AllowRememberConsent = table.Column(nullable: false), - AlwaysIncludeUserClaimsInIdToken = table.Column(nullable: false), - RequirePkce = table.Column(nullable: false), - AllowPlainTextPkce = table.Column(nullable: false), - RequireRequestObject = table.Column(nullable: false), - AllowAccessTokensViaBrowser = table.Column(nullable: false), - FrontChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - FrontChannelLogoutSessionRequired = table.Column(nullable: false), - BackChannelLogoutUri = table.Column(maxLength: 2000, nullable: true), - BackChannelLogoutSessionRequired = table.Column(nullable: false), - AllowOfflineAccess = table.Column(nullable: false), - IdentityTokenLifetime = table.Column(nullable: false), - AllowedIdentityTokenSigningAlgorithms = table.Column(maxLength: 100, nullable: true), - AccessTokenLifetime = table.Column(nullable: false), - AuthorizationCodeLifetime = table.Column(nullable: false), - ConsentLifetime = table.Column(nullable: true), - AbsoluteRefreshTokenLifetime = table.Column(nullable: false), - SlidingRefreshTokenLifetime = table.Column(nullable: false), - RefreshTokenUsage = table.Column(nullable: false), - UpdateAccessTokenClaimsOnRefresh = table.Column(nullable: false), - RefreshTokenExpiration = table.Column(nullable: false), - AccessTokenType = table.Column(nullable: false), - EnableLocalLogin = table.Column(nullable: false), - IncludeJwtId = table.Column(nullable: false), - AlwaysSendClientClaims = table.Column(nullable: false), - ClientClaimsPrefix = table.Column(maxLength: 200, nullable: true), - PairWiseSubjectSalt = table.Column(maxLength: 200, nullable: true), - UserSsoLifetime = table.Column(nullable: true), - UserCodeType = table.Column(maxLength: 100, nullable: true), - DeviceCodeLifetime = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ClientName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + ClientUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + LogoUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + ProtocolType = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + RequireClientSecret = table.Column(type: "bit", nullable: false), + RequireConsent = table.Column(type: "bit", nullable: false), + AllowRememberConsent = table.Column(type: "bit", nullable: false), + AlwaysIncludeUserClaimsInIdToken = table.Column(type: "bit", nullable: false), + RequirePkce = table.Column(type: "bit", nullable: false), + AllowPlainTextPkce = table.Column(type: "bit", nullable: false), + RequireRequestObject = table.Column(type: "bit", nullable: false), + AllowAccessTokensViaBrowser = table.Column(type: "bit", nullable: false), + FrontChannelLogoutUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + FrontChannelLogoutSessionRequired = table.Column(type: "bit", nullable: false), + BackChannelLogoutUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + BackChannelLogoutSessionRequired = table.Column(type: "bit", nullable: false), + AllowOfflineAccess = table.Column(type: "bit", nullable: false), + IdentityTokenLifetime = table.Column(type: "int", nullable: false), + AllowedIdentityTokenSigningAlgorithms = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + AccessTokenLifetime = table.Column(type: "int", nullable: false), + AuthorizationCodeLifetime = table.Column(type: "int", nullable: false), + ConsentLifetime = table.Column(type: "int", nullable: true), + AbsoluteRefreshTokenLifetime = table.Column(type: "int", nullable: false), + SlidingRefreshTokenLifetime = table.Column(type: "int", nullable: false), + RefreshTokenUsage = table.Column(type: "int", nullable: false), + UpdateAccessTokenClaimsOnRefresh = table.Column(type: "bit", nullable: false), + RefreshTokenExpiration = table.Column(type: "int", nullable: false), + AccessTokenType = table.Column(type: "int", nullable: false), + EnableLocalLogin = table.Column(type: "bit", nullable: false), + IncludeJwtId = table.Column(type: "bit", nullable: false), + AlwaysSendClientClaims = table.Column(type: "bit", nullable: false), + ClientClaimsPrefix = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + PairWiseSubjectSalt = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + UserSsoLifetime = table.Column(type: "int", nullable: true), + UserCodeType = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + DeviceCodeLifetime = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -373,19 +367,19 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerDeviceFlowCodes", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - DeviceCode = table.Column(maxLength: 200, nullable: false), - UserCode = table.Column(maxLength: 200, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - SessionId = table.Column(maxLength: 100, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - Description = table.Column(maxLength: 200, nullable: true), - Expiration = table.Column(nullable: false), - Data = table.Column(maxLength: 50000, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + DeviceCode = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + UserCode = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + SubjectId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + SessionId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Description = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: false), + Data = table.Column(type: "nvarchar(max)", maxLength: 50000, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) }, constraints: table => { @@ -396,23 +390,23 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerIdentityResources", columns: table => new { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 200, nullable: false), - DisplayName = table.Column(maxLength: 200, nullable: true), - Description = table.Column(maxLength: 1000, nullable: true), - Enabled = table.Column(nullable: false), - Required = table.Column(nullable: false), - Emphasize = table.Column(nullable: false), - ShowInDiscoveryDocument = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + DisplayName = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Enabled = table.Column(type: "bit", nullable: false), + Required = table.Column(type: "bit", nullable: false), + Emphasize = table.Column(type: "bit", nullable: false), + ShowInDiscoveryDocument = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -423,19 +417,19 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerPersistedGrants", columns: table => new { - Key = table.Column(maxLength: 200, nullable: false), - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Type = table.Column(maxLength: 50, nullable: false), - SubjectId = table.Column(maxLength: 200, nullable: true), - SessionId = table.Column(maxLength: 100, nullable: true), - ClientId = table.Column(maxLength: 200, nullable: false), - Description = table.Column(maxLength: 200, nullable: true), - CreationTime = table.Column(nullable: false), - Expiration = table.Column(nullable: true), - ConsumedTime = table.Column(nullable: true), - Data = table.Column(maxLength: 50000, nullable: false) + Key = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + SubjectId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + SessionId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientId = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + Description = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + Expiration = table.Column(type: "datetime2", nullable: true), + ConsumedTime = table.Column(type: "datetime2", nullable: true), + Data = table.Column(type: "nvarchar(max)", maxLength: 50000, nullable: false), + Id = table.Column(type: "uniqueidentifier", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) }, constraints: table => { @@ -446,15 +440,15 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpAuditLogActions", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, constraints: table => { @@ -471,15 +465,15 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpEntityChanges", columns: table => new { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) }, constraints: table => { @@ -496,11 +490,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpOrganizationUnitRoles", columns: table => new { - RoleId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) }, constraints: table => { @@ -523,11 +517,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpRoleClaims", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - RoleId = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) }, constraints: table => { @@ -544,9 +538,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpTenantConnectionStrings", columns: table => new { - TenantId = table.Column(nullable: false), - Name = table.Column(maxLength: 64, nullable: false), - Value = table.Column(maxLength: 1024, nullable: false) + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) }, constraints: table => { @@ -563,11 +557,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserClaims", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - UserId = table.Column(nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) }, constraints: table => { @@ -584,11 +578,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserLogins", columns: table => new { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - TenantId = table.Column(nullable: true), - ProviderKey = table.Column(maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(maxLength: 128, nullable: true) + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) }, constraints: table => { @@ -605,11 +599,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserOrganizationUnits", columns: table => new { - UserId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) }, constraints: table => { @@ -632,9 +626,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserRoles", columns: table => new { - UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - TenantId = table.Column(nullable: true) + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) }, constraints: table => { @@ -657,11 +651,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpUserTokens", columns: table => new { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - TenantId = table.Column(nullable: true), - Value = table.Column(nullable: true) + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) }, constraints: table => { @@ -678,8 +672,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiResourceClaims", columns: table => new { - Type = table.Column(maxLength: 200, nullable: false), - ApiResourceId = table.Column(nullable: false) + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false) }, constraints: table => { @@ -696,9 +690,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiResourceProperties", columns: table => new { - ApiResourceId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -715,8 +709,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiResourceScopes", columns: table => new { - ApiResourceId = table.Column(nullable: false), - Scope = table.Column(maxLength: 200, nullable: false) + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Scope = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) }, constraints: table => { @@ -733,11 +727,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiResourceSecrets", columns: table => new { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ApiResourceId = table.Column(nullable: false), - Description = table.Column(maxLength: 1000, nullable: true), - Expiration = table.Column(nullable: true) + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: false), + ApiResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -754,8 +748,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiScopeClaims", columns: table => new { - Type = table.Column(maxLength: 200, nullable: false), - ApiScopeId = table.Column(nullable: false) + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + ApiScopeId = table.Column(type: "uniqueidentifier", nullable: false) }, constraints: table => { @@ -772,9 +766,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerApiScopeProperties", columns: table => new { - ApiScopeId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) + ApiScopeId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -791,9 +785,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientClaims", columns: table => new { - ClientId = table.Column(nullable: false), - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 250, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false) }, constraints: table => { @@ -810,8 +804,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientCorsOrigins", columns: table => new { - ClientId = table.Column(nullable: false), - Origin = table.Column(maxLength: 150, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Origin = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: false) }, constraints: table => { @@ -828,8 +822,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientGrantTypes", columns: table => new { - ClientId = table.Column(nullable: false), - GrantType = table.Column(maxLength: 250, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + GrantType = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false) }, constraints: table => { @@ -846,8 +840,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientIdPRestrictions", columns: table => new { - ClientId = table.Column(nullable: false), - Provider = table.Column(maxLength: 200, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Provider = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) }, constraints: table => { @@ -864,8 +858,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientPostLogoutRedirectUris", columns: table => new { - ClientId = table.Column(nullable: false), - PostLogoutRedirectUri = table.Column(maxLength: 2000, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + PostLogoutRedirectUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -882,9 +876,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientProperties", columns: table => new { - ClientId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -901,8 +895,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientRedirectUris", columns: table => new { - ClientId = table.Column(nullable: false), - RedirectUri = table.Column(maxLength: 2000, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + RedirectUri = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -919,8 +913,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientScopes", columns: table => new { - ClientId = table.Column(nullable: false), - Scope = table.Column(maxLength: 200, nullable: false) + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Scope = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false) }, constraints: table => { @@ -937,11 +931,11 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerClientSecrets", columns: table => new { - Type = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 4000, nullable: false), - ClientId = table.Column(nullable: false), - Description = table.Column(maxLength: 2000, nullable: true), - Expiration = table.Column(nullable: true) + Type = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: false), + ClientId = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + Expiration = table.Column(type: "datetime2", nullable: true) }, constraints: table => { @@ -958,8 +952,8 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerIdentityResourceClaims", columns: table => new { - Type = table.Column(maxLength: 200, nullable: false), - IdentityResourceId = table.Column(nullable: false) + Type = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: false), + IdentityResourceId = table.Column(type: "uniqueidentifier", nullable: false) }, constraints: table => { @@ -976,9 +970,9 @@ namespace MyCompanyName.MyProjectName.Migrations name: "IdentityServerIdentityResourceProperties", columns: table => new { - IdentityResourceId = table.Column(nullable: false), - Key = table.Column(maxLength: 250, nullable: false), - Value = table.Column(maxLength: 2000, nullable: false) + IdentityResourceId = table.Column(type: "uniqueidentifier", nullable: false), + Key = table.Column(type: "nvarchar(250)", maxLength: 250, nullable: false), + Value = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: false) }, constraints: table => { @@ -995,13 +989,13 @@ namespace MyCompanyName.MyProjectName.Migrations name: "AbpEntityPropertyChanges", columns: table => new { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) }, constraints: table => { @@ -1034,11 +1028,6 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpAuditLogs", columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - migrationBuilder.CreateIndex( - name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", - table: "AbpBackgroundJobs", - columns: new[] { "IsAbandoned", "NextTryTime" }); - migrationBuilder.CreateIndex( name: "IX_AbpEntityChanges_AuditLogId", table: "AbpEntityChanges", @@ -1059,6 +1048,13 @@ namespace MyCompanyName.MyProjectName.Migrations table: "AbpFeatureValues", columns: new[] { "Name", "ProviderName", "ProviderKey" }); + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + migrationBuilder.CreateIndex( name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", table: "AbpOrganizationUnitRoles", @@ -1219,9 +1215,6 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpAuditLogActions"); - migrationBuilder.DropTable( - name: "AbpBackgroundJobs"); - migrationBuilder.DropTable( name: "AbpClaimTypes"); @@ -1231,6 +1224,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpFeatureValues"); + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + migrationBuilder.DropTable( name: "AbpOrganizationUnitRoles"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs index 3fcfd093ef..beb40e7827 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs @@ -16,10 +16,10 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -28,99 +28,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -138,39 +138,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -188,39 +188,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -241,30 +241,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -281,21 +281,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.HasKey("Id"); @@ -312,33 +312,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -386,39 +386,39 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -434,19 +434,19 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -462,60 +462,60 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("UserId") .HasColumnType("uniqueidentifier"); b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); @@ -538,136 +538,136 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("IsExternal") .ValueGeneratedOnAdd() - .HasColumnName("IsExternal") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -689,16 +689,16 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -716,21 +716,21 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -748,16 +748,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -775,8 +775,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -791,16 +791,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -818,62 +818,62 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -893,16 +893,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -918,64 +918,64 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AllowedAccessTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Enabled") .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ShowInDiscoveryDocument") .HasColumnType("bit"); @@ -994,8 +994,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Type"); @@ -1008,12 +1008,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiResourceId", "Key", "Value"); @@ -1026,8 +1026,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiResourceId", "Scope"); @@ -1040,16 +1040,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1067,33 +1067,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1102,27 +1102,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1144,8 +1144,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ApiScopeId", "Type"); @@ -1158,12 +1158,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ApiScopeId", "Key", "Value"); @@ -1198,8 +1198,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("AllowedIdentityTokenSigningAlgorithms") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("AlwaysIncludeUserClaimsInIdToken") .HasColumnType("bit"); @@ -1214,54 +1214,54 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("BackChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ClientClaimsPrefix") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsentLifetime") .HasColumnType("int"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DeviceCodeLifetime") .HasColumnType("int"); @@ -1273,15 +1273,15 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("FrontChannelLogoutSessionRequired") .HasColumnType("bit"); b.Property("FrontChannelLogoutUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("IdentityTokenLifetime") .HasColumnType("int"); @@ -1291,30 +1291,30 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LogoUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("PairWiseSubjectSalt") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ProtocolType") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("RefreshTokenExpiration") .HasColumnType("int"); @@ -1341,8 +1341,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("UserCodeType") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("UserSsoLifetime") .HasColumnType("int"); @@ -1360,12 +1360,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "Type", "Value"); @@ -1378,8 +1378,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Origin") - .HasColumnType("nvarchar(150)") - .HasMaxLength(150); + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); b.HasKey("ClientId", "Origin"); @@ -1392,8 +1392,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("GrantType") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.HasKey("ClientId", "GrantType"); @@ -1406,8 +1406,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Provider") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Provider"); @@ -1420,8 +1420,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("PostLogoutRedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "PostLogoutRedirectUri"); @@ -1434,12 +1434,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "Key", "Value"); @@ -1452,8 +1452,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("RedirectUri") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("ClientId", "RedirectUri"); @@ -1466,8 +1466,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Scope") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("ClientId", "Scope"); @@ -1480,16 +1480,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)"); b.Property("Description") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.Property("Expiration") .HasColumnType("datetime2"); @@ -1507,57 +1507,57 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("DeviceCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .IsRequired() .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("UserCode") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("Id"); @@ -1574,19 +1574,19 @@ namespace MyCompanyName.MyProjectName.Migrations modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => { b.Property("Key") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ClientId") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ConsumedTime") .HasColumnType("datetime2"); @@ -1596,35 +1596,35 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Data") .IsRequired() - .HasColumnType("nvarchar(max)") - .HasMaxLength(50000); + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); b.Property("Description") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Expiration") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Id") .HasColumnType("uniqueidentifier"); b.Property("SessionId") - .HasColumnType("nvarchar(100)") - .HasMaxLength(100); + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); b.Property("SubjectId") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Type") .IsRequired() - .HasColumnType("nvarchar(50)") - .HasMaxLength(50); + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); b.HasKey("Key"); @@ -1645,33 +1645,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Description") - .HasColumnType("nvarchar(1000)") - .HasMaxLength(1000); + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); b.Property("DisplayName") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Emphasize") .HasColumnType("bit"); @@ -1680,27 +1680,27 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("bit"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.Property("Required") .HasColumnType("bit"); @@ -1722,8 +1722,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Type") - .HasColumnType("nvarchar(200)") - .HasMaxLength(200); + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); b.HasKey("IdentityResourceId", "Type"); @@ -1736,12 +1736,12 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Key") - .HasColumnType("nvarchar(250)") - .HasMaxLength(250); + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); b.Property("Value") - .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); b.HasKey("IdentityResourceId", "Key", "Value"); @@ -1756,22 +1756,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1788,21 +1788,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -1819,48 +1819,48 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -1875,13 +1875,13 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -2164,6 +2164,92 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs new file mode 100644 index 0000000000..cd2f885a7d --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.Designer.cs @@ -0,0 +1,1222 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace MyCompanyName.MyProjectName.Migrations +{ + [DbContext(typeof(UnifiedDbContext))] + [Migration("20201019021101_Initial")] + partial class Initial + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasMaxLength(4000) + .HasColumnType("nvarchar(4000)") + .HasColumnName("Exceptions"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs new file mode 100644 index 0000000000..392499da58 --- /dev/null +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20201019021101_Initial.cs @@ -0,0 +1,726 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MyCompanyName.MyProjectName.Migrations +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(max)", nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + } + } +} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 21d510c82c..7b90b1954f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -16,10 +16,10 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -28,99 +28,99 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -138,39 +138,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -188,39 +188,39 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -241,30 +241,30 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -281,21 +281,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.HasKey("Id"); @@ -312,33 +312,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -386,39 +386,39 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -434,19 +434,19 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -462,60 +462,60 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Action") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("ApplicationName") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("BrowserInfo") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("ClientId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ClientIpAddress") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("CreationTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Identity") - .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("UserId") .HasColumnType("uniqueidentifier"); b.Property("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); @@ -538,136 +538,136 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("IsExternal") .ValueGeneratedOnAdd() - .HasColumnName("IsExternal") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -689,16 +689,16 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -716,21 +716,21 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -748,16 +748,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -775,8 +775,8 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -791,16 +791,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -818,62 +818,62 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -893,16 +893,16 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -919,22 +919,22 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -951,21 +951,21 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -982,48 +982,48 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -1038,13 +1038,13 @@ namespace MyCompanyName.MyProjectName.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -1174,6 +1174,46 @@ namespace MyCompanyName.MyProjectName.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } From 36a788420bd6edf68a18032516b1d48afb106a56 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 19 Oct 2020 10:53:22 +0800 Subject: [PATCH 52/55] Upgrade IdentityServer4 to 4.1.1 https://github.com/IdentityServer/IdentityServer4/releases/tag/4.1.1 --- .../Volo.Abp.IdentityServer.Domain.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj index 88bf5dfa91..7de8992da6 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj @@ -25,8 +25,8 @@ - - + + From 74991ab1dee71d46c9dc246f180d9e9a4c1cbb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 19 Oct 2020 12:22:00 +0300 Subject: [PATCH 53/55] Created tempkeys --- .../src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk | 1 + .../MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk | 1 + .../src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk | 1 + .../aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk | 1 + 4 files changed, 4 insertions(+) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk new file mode 100644 index 0000000000..75ad83628d --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk @@ -0,0 +1 @@ +{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"na3PYscB_WLfbYJn9_jqqJ1fV1honqUfmyVfc9Rb9WQ3AQCtjx1C1_icNImY-eax0Ic4nDI7ZOZ4oel_pUIqbqb5lXGKvicm73aFX1yoEH2-wnFBXbc3HHMtiMUtgaC6Ra9cOu1omZ9Tc-wmQL2W-_cFbNC5BSkTj-x8CaAfdFY5o2-5TIBHLrRWMluNWFTd5-3mZVBkQiwyURNPQn46QirAMN9dLYhwxCWwOAi_8C0Y0XQtkcKVo8XMHXP5XO82dmId8eVn_lujlDZc2mirv3FcHND7y--yEDxAHGK3ByYsklmWngksT6Oey7ww0DBgMPWWb3XR4Y_-1mk22kPNQQ","DP":"Q03f6WFD0JFxyFU3rNm8a47iaBEuC2o0NX1AOrSfN8ZLvZLqmflnitOSRxMppfBy3R-Gudj6lw03vqoHFw8JVQEYoAgRSDwvZOA3MOzKSpUOODvFZLLXIXRXJN8V2A3Y1FfbPHyrIFLhcQYRcOUtCaMSwe6hwbfYCOCVIUnv8sM","DQ":"qPkNeMlpDSzTAAlq43OR2bxbb-k3YuhJYan4usF7Bg3HhtMXMq4IwOwbF3zYeJrYNrTOOcknsIOc8WZ4xRgnWa_I7pNIyZOtBRk5cL-Des-KN4DVr1HMfIDX6Nscn5-p8aYutXzBW9ctGNZ4W9mr74lYGjcv31VErFIPoiV6M_k","E":"AQAB","K":null,"KeyId":"35F08C61EC133B263F0D9C98A16E4406","Kid":"35F08C61EC133B263F0D9C98A16E4406","Kty":"RSA","N":"xEBQ-uWnMATOry_xqOHA1_pwHYTwegnK8zBvg8qPBYYWvUuaVIe_2bTMpWfByWQrhMAGZS1POQcRE4j9-LJdvQgNXLMRlB4NBdJcrIse8hqtd8sfa9sS_4Fo6osxbawf7JmQCRH8dLhrwIXsJiJ_YqAYIgXwtFKTS9frankVBkHrHCGGC6HL5JOBhbiOVJVgXPn-UTcuiEn88wjtdwsAzMh5pmVT226gy84vTxZcfNF_J0AzO_JeZnfW5YlAlbQd0EUOH47FwwQXnPkoMc_FXDZjyiOHMfuhRyqTriB0YdaaCtqRhfyOgBIZ2szjpui1eiZH0x8QDQm6I0EbCsnB7Q","Oth":null,"P":"62MMN3ssYikLIYZjBLSC1rg1icTgDeIhk02NN32Id_eh9BilwGuQFuJiNOOboafzLgfI76uwKdsSEoWMy4dLLc_2LeJfcTtMgR8plknJs4PNToL62yiV5XZiPdyZfLXROeR69PJY1vKfUTzCJBMLAix1nFGG1CDBrFGq6lWCdjc","Q":"1W_qxdTdjZkERG2NFGFJbPSZIrMfnkOZLu4IMbT9sEToR6fjIm0ekQHQ2Q9VveZOrTsYXg9w63iEaoOc0qF3FBFNTJP62mKEUPMk-dPFoaLAOiiGSWqneWKQtxbSj4s1RlxUDjASb8oLpP5eJ11AzOOjGVF2T-DqUU61UZhx9vs","QI":"m4bNZ1w6zkfZbDPzAzFJOnDtwRB_93k-3Pi2UUvPvdmlcF6EFELaDt-kQOChlPC0oM4yxfBy6GzimpshI58NIZFGJ1GCkqsHkS97TU5Bcr0sIae1EdcU0jtQO4Yk8bBnuwGMSZPaA5b9PxSErfs1XSDPFNGvEqBnRoOwwZABvFs","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk new file mode 100644 index 0000000000..0bf4222973 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk @@ -0,0 +1 @@ +{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"Tk10nJfyDM2az1MXb0dk2v9xJykAvq8Hs7Y9No88NBHGPq1vujBy6R67Bfc9WTlo-oVQsEBr9eWjWlzP1WySZNvSwQDFDaZZcDkC_E8MH_u4v4iWzcM6CfjMB3PoxXos3sxk9Pdkc4eQ4yDw05-oxIcPmvpF_6DLIOdSaQUVJVUdRWXOFCwD85f3Qkc-MeDEVJWcQekORDWjjY2Ezf_LlmM8MAl-Ug0vGucdrCBEi8fB_vIHSqHTVn9uD0WdbSHPYBYaqUHXis3OcUEFU9iPCYiyaJ6HhRgWg8jJVAgrH0t961Mh-PAayty64D8w1OGuTaJa90wmbLoQFCGfZ31wbQ","DP":"MXmQD-0L_mruZeIEVclooX4f9unjijGYfxqwZXmsgCQ8EG9yuiICrYefvZC2mr8mjptepAm0ii4O6YdPUn4J-d4tRGr8JO0yGbqdcsXeLAP38a_9GUwDw7U4BUjJqzsLYhnLbdy-eOOYlOSUn_86-fpadZKx48UpBSbHknIs67E","DQ":"T0ia2epiSg4fNsF11Xh2DHaU895EaPM7gtcSdEm2Y2cEqQZy0b6uP2L4eWdl5PFjuAva59nqeUQ8aK55ZR4rYIOBH4awoUFTIJIr2A3d5SV759GXOI55Ywfq99sVtqrHqs-u3eKyLeCkYIUqQyb4anoIlmaqYi9wVmpk0QQAQzk","E":"AQAB","K":null,"KeyId":"B355AE223C5B3D318547C8F865352EE2","Kid":"B355AE223C5B3D318547C8F865352EE2","Kty":"RSA","N":"w7mccpg-xQ1I74v-HALQNaBVrKgiNa4GpY5qajdZa76auS3ic2RBvvgGN3YqekBnnSwsieqUfiBUrDKtNs8NPns8ftkcY0YMEuNGz57Bc-LpIqpJMZdZNH07YHUDTdFe9qsUs_jJ3jyPUkxfdR90EMDRq618Ja1Jm2-kxPPidV8iuPnXOhwF-u_m4pdnWjBmI_i0v9t2If4Qq5IGLpW_r7ChglokZugamfZWhAj__gsZFHbZaW-GET-Rd2AkIl1V4RPMjNI1q6OOYpa035o6F-Wkdye-RnGCySqzWqrTN9-fFwggVi0CMO-MjfBGSPnIoPVfTrtWdtWiiJldkW5EiQ","Oth":null,"P":"90mYyR6wuMFN9MMgy_GZcB9EWsjBckb2zFzEzl8A-PxVX1ifgPOZN1ZSQjwPN9-Jj-Qk2ZVU43eqPflM4c2jED89vy9WX3XAGJ1FJHUpvYDvtc6ej5AbzAHKeYil9IikQlOrzi2JZ0ioiqTQI1_13v2-Zcg6itY73fIw6YrX0Rs","Q":"yp7yul89BP7ayvAc-sCBG3qks5BGWev_vb1eEmj3Ys3jAqBnGs8VgPNXIky9t6MgUZ2PB_6V7yLWPa7M4j8tJjQByYggqc7EuIkrG7CEH3_pIeBx02ngoQQsPd_Kgmu33CKY6bGnweUb2AEQ5OYewvgqAxtw0IowDlKcPtwxvys","QI":"Z6Co916ku0t5UdGyk_bK-fYKHcjqDBY5u_Hyg45jvz-TuQQEkeSnv2nukK7vIxuyOPlqt6C6-P68P-uNQZPqDWmaibnU4Gjj5dZtQDCl80vJEKpR48AAmnGEt8x-FeB4ZMWqPWQE3GppKAHuA5g4V2gVesziMPZeWmd09kW5Zto","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk new file mode 100644 index 0000000000..796102b2b6 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk @@ -0,0 +1 @@ +{"alg":"RS256","d":"Qe3Ds-NA2pf25sGU3S3SMI4jLm-IzyiKy9daS87SMv49QGRM-3AehH29EZYG05-xIaQiw5ZDaBDBhJ30kld_yKBiKDS82jz7GwD_o7dYsfaKPQP2ceCgscspgLZCRYz2Bn4uPpJEdTzZX0CG3vQNNzuai96vnrw3OOE2hMKzG1G5jBEuG62UmroA1J_hjROe4xN0NweFsA20CVqd-icQRS7BZ61ckW8mJxc2Mge89YZV3OA7uVA9VkBD8WOquLp0MtxM20JI71OKpvcVdpCviO9dqyg9vKNrvzIVQz5UG-uytplQhDXKSQnMwTyityb8-UnUyJwcK97iXxXej8Q8wQ","dp":"guIUNk31o1boT3hHZ8yjD4DOFYWJhj1Zso3lGxLJX6gdWSYk70gG3Knyce0SvCIoxGzNjNr4pOIoAxACHUxlgedmynznjoGaQIUu9r1WNS-2BVzxfEGO7AZ28yhI_lAOk9z772rR8WO4y5eE5-sdT20vIEtk8Ivm8y5KPqG2nxk","dq":"ST_QInrb0xX92ydtZ8JRPEWZ9E7evtvEcDSDdDXhmsU_ikItF4bxyFj2Askgim1Muj8yKKEPEVQffvdXvkMnrCxYPFtxcTGUCblF-dTwMaQJxP8lxOm6TFEJxtFkcK1PVNkL6atx_klYYSp8ziOzdPz1lRxabSK-aMVCyWJNmn8","e":"AQAB","kid":"4A9175F021891DD4BA07727A448B4078","kty":"RSA","n":"yWDayzP7ZIUTpc3ubBUuwG71daDTgRDrDZRngbtAWxDNZQF-8mlOUzBRIBvH_We3eRhMEj5RTfAUG92OaqriB6NZorslBdgqSODRqsABQalI95QudX1DOfwgNphgKi4lRGSpe4UYVYoyWgh5Bp751bmUCdiezMna1bhnilLBK2Y_oHCnCZ3I4cFHGVldC-edefsvndynFOzWJp_y34Q71nbZEHMRKD8mx1Zj_Tt_nxZ7GtzC7AD4jjeZpSkp65mJCGXIaMMCalW2R5qB3pf6u8ei_ky08kvcHtcgi5CLqX6PsNddICzhedyohjp5oznUL5Ohw5WrlEYEeZ3_5JmdHQ","p":"7iMEhduGj-GbdvpkPW9C-pj8YK7i4zGbiE_-7TU4u4alLe_lUM0SMwG6UgqqWmGLi9LBcLkqnQ9NDODZvovyHV-NuvHUIWIrZa9t9iMsSAX-KObGjeFu8Jn9n58WeiMPEQ3X49jHM3e6g_fQ6wxYxbXnlx2-wX3LDzCQ9th-Op8","q":"2Hv1RFfzI4U5Jalaaz7ZLrr6VKGFKb1JnoGArBM7JnEMMmZwTUGlUjGxGgvKbaACTb1wXGS2A_wtPnomOx5Nu63-C6gBWLVbERbplOxowwNOdQC8dCHW5uf0LT62fyvzO8sig87c0hpUR-60ubAnQmW8rFAdHAJNvDrTaTHfSsM","qi":"XjPcTdtgULO3snpQJepHbyF8yGrKPWBdxD1so4TpB8FsCxF8fMl99QvNXLaAxffewLQkfAd7DqE62G3hbsZVgsX0X7gwQkGS_gWXcwpc7rBdeapLj0dEJOXmvpPkhgrpnOadAlnimErXzHv30XEUfph4EJOgb4crBsyeCtiWd54"} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk new file mode 100644 index 0000000000..bea6fe239c --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk @@ -0,0 +1 @@ +{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"apXp8PxjdO94e6VkAofVTiPFA0iqQVhq0Iua4L_l99OdRf-d1kzFararmGo4zRuoa3koxM39eHKJY2VDL79m0v4Pr-8xRGpuR2yw_Xq5P6SuplULlpVMffmCYbMolY6FrKgJkJFHME8QNfkZdO6jd2eQqpQEEUnQt5zab4Vu59-YsM43UB0ZTA285w2v3q9VXnw2j96-f1dKxK2FzOU6UF53BwW_f9Jios1cN1pYS8lzsF7x3TQQUmA9TQhkfvCTnQggthIIqDBaKKZNFe6roD9e5inXNXZ73nFVKEe8yQ5GXT24zXwdbxziIRkbs-CcPhTEOy9gePDjgjvTfLY_MQ","DP":"drizCBGhqyNSIV6hzvSflatteLBoNW4VlTbNOw0IKdT1av1vFuL-L3eDOrgETYndGC00-qEKcXo1cfR_1kFTLzBkpVV_r4ItnO1rafmg_HaXF2T3KXNQfBC48oBU7cfJ58oqF7GHGBWJmH4t29yYI7k33VIrmWkqiTZjew6FhRk","DQ":"4XvVFj1ffO2MOb-2TpyG-jBKMoFs7Ci4r15nw0i5AFIzBJUkQIzXZfpxaew-cpeuKJGeST0G6vbZ22VERLV2rcrWg7Am7MHxWGGO3dtei6aNyGQ9D4nWdPUHt-CtXnucm6SgF2xrsocRdH-lgDZQi-9S2Tf_sV8N6vHgjoOOYks","E":"AQAB","K":null,"KeyId":"752FDE4FB36C1EBE263154443853588C","Kid":"752FDE4FB36C1EBE263154443853588C","Kty":"RSA","N":"qwYe4W2QJDiLQ42S4_g6GhSgzKpETlar5I_6qX9T3FvkYcHl6cDYKLDXGnyCnZ_P6Ise2YIbkXywiXsdY7k9nU0PWyBGHwLMvc5crRA2hOnaAuGZ1VWv1-yMERU_3D4_GTtupGIgWf5y6Cpqo8OugclYfS8Mvoa-f5ieuhN-0T1WnW1oU1if92YkyUxaqGGMnb9_1PGxMYeewTkPW9F2EYl-WIwMtZ0Hi6G5rrzRG_g3Mn3ADQ1G6PItnI_cTqk42Ju6wL5N4LrO9YiCcXqxfN8Nirdx42Bnl_o1REUQm7Veb_E6oA2GgOCRgE3ZRdHRvgYo3_nFJJ-mW7PtEWxEKQ","Oth":null,"P":"wABDhgflF-kjvBTxWqFB5AVgeknXdHQ0rm8l_bCGK8xYcOt4Lmgw1c_A13a7lNkTv3pCNCSFO-Q_c5E7bL1f8xW682eCF09NFwoIsE7okEh-bufo1_bdZyFch7PV8MRwZMxjKs2hmvQO8mDr357kLk0kwdNubDtbQuSP8PPMeWM","Q":"5AfY-qYuQF7X-gLWJ9aXWOIR6_htzyQhAljKrGrRTLExTpOIG1cp10ucS6m1-XVzH_wbvhMQmGDhdgsxoK-QtXexFS4lYaa1IYmrW7kmFsgm9jMJLwAbTL-j5enoKRZNx1l4Nk-YZyE_7Rsmht7vV69ANOHZ0lpnb1rDrSOBSAM","QI":"n_kUKjaIpJZ2hHQeuX8FM5n9-GUIsQO9Nd2v-zk6Z6bWsiNakrcQe-j32qM9cwwUodxw8VD-nliDLiJc8cLL6drXItltpunkCfS1SSNlchN61wJX152_YGfw4UX80T4QbQxTjwB6xQ0Lr6F_mIeVsMYUHLEFO1d_tZ2ZTCK4j88","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file From c9eaabfbb7eeaea2d4213e3a9aca773ced8c7bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 19 Oct 2020 14:13:59 +0300 Subject: [PATCH 54/55] Revert "Created tempkeys" This reverts commit 74991ab1dee71d46c9dc246f180d9e9a4c1cbb97. --- .../src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk | 1 - .../MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk | 1 - .../src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk | 1 - .../aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk | 1 - 4 files changed, 4 deletions(-) delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk deleted file mode 100644 index 75ad83628d..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/tempkey.jwk +++ /dev/null @@ -1 +0,0 @@ -{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"na3PYscB_WLfbYJn9_jqqJ1fV1honqUfmyVfc9Rb9WQ3AQCtjx1C1_icNImY-eax0Ic4nDI7ZOZ4oel_pUIqbqb5lXGKvicm73aFX1yoEH2-wnFBXbc3HHMtiMUtgaC6Ra9cOu1omZ9Tc-wmQL2W-_cFbNC5BSkTj-x8CaAfdFY5o2-5TIBHLrRWMluNWFTd5-3mZVBkQiwyURNPQn46QirAMN9dLYhwxCWwOAi_8C0Y0XQtkcKVo8XMHXP5XO82dmId8eVn_lujlDZc2mirv3FcHND7y--yEDxAHGK3ByYsklmWngksT6Oey7ww0DBgMPWWb3XR4Y_-1mk22kPNQQ","DP":"Q03f6WFD0JFxyFU3rNm8a47iaBEuC2o0NX1AOrSfN8ZLvZLqmflnitOSRxMppfBy3R-Gudj6lw03vqoHFw8JVQEYoAgRSDwvZOA3MOzKSpUOODvFZLLXIXRXJN8V2A3Y1FfbPHyrIFLhcQYRcOUtCaMSwe6hwbfYCOCVIUnv8sM","DQ":"qPkNeMlpDSzTAAlq43OR2bxbb-k3YuhJYan4usF7Bg3HhtMXMq4IwOwbF3zYeJrYNrTOOcknsIOc8WZ4xRgnWa_I7pNIyZOtBRk5cL-Des-KN4DVr1HMfIDX6Nscn5-p8aYutXzBW9ctGNZ4W9mr74lYGjcv31VErFIPoiV6M_k","E":"AQAB","K":null,"KeyId":"35F08C61EC133B263F0D9C98A16E4406","Kid":"35F08C61EC133B263F0D9C98A16E4406","Kty":"RSA","N":"xEBQ-uWnMATOry_xqOHA1_pwHYTwegnK8zBvg8qPBYYWvUuaVIe_2bTMpWfByWQrhMAGZS1POQcRE4j9-LJdvQgNXLMRlB4NBdJcrIse8hqtd8sfa9sS_4Fo6osxbawf7JmQCRH8dLhrwIXsJiJ_YqAYIgXwtFKTS9frankVBkHrHCGGC6HL5JOBhbiOVJVgXPn-UTcuiEn88wjtdwsAzMh5pmVT226gy84vTxZcfNF_J0AzO_JeZnfW5YlAlbQd0EUOH47FwwQXnPkoMc_FXDZjyiOHMfuhRyqTriB0YdaaCtqRhfyOgBIZ2szjpui1eiZH0x8QDQm6I0EbCsnB7Q","Oth":null,"P":"62MMN3ssYikLIYZjBLSC1rg1icTgDeIhk02NN32Id_eh9BilwGuQFuJiNOOboafzLgfI76uwKdsSEoWMy4dLLc_2LeJfcTtMgR8plknJs4PNToL62yiV5XZiPdyZfLXROeR69PJY1vKfUTzCJBMLAix1nFGG1CDBrFGq6lWCdjc","Q":"1W_qxdTdjZkERG2NFGFJbPSZIrMfnkOZLu4IMbT9sEToR6fjIm0ekQHQ2Q9VveZOrTsYXg9w63iEaoOc0qF3FBFNTJP62mKEUPMk-dPFoaLAOiiGSWqneWKQtxbSj4s1RlxUDjASb8oLpP5eJ11AzOOjGVF2T-DqUU61UZhx9vs","QI":"m4bNZ1w6zkfZbDPzAzFJOnDtwRB_93k-3Pi2UUvPvdmlcF6EFELaDt-kQOChlPC0oM4yxfBy6GzimpshI58NIZFGJ1GCkqsHkS97TU5Bcr0sIae1EdcU0jtQO4Yk8bBnuwGMSZPaA5b9PxSErfs1XSDPFNGvEqBnRoOwwZABvFs","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk deleted file mode 100644 index 0bf4222973..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/tempkey.jwk +++ /dev/null @@ -1 +0,0 @@ -{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"Tk10nJfyDM2az1MXb0dk2v9xJykAvq8Hs7Y9No88NBHGPq1vujBy6R67Bfc9WTlo-oVQsEBr9eWjWlzP1WySZNvSwQDFDaZZcDkC_E8MH_u4v4iWzcM6CfjMB3PoxXos3sxk9Pdkc4eQ4yDw05-oxIcPmvpF_6DLIOdSaQUVJVUdRWXOFCwD85f3Qkc-MeDEVJWcQekORDWjjY2Ezf_LlmM8MAl-Ug0vGucdrCBEi8fB_vIHSqHTVn9uD0WdbSHPYBYaqUHXis3OcUEFU9iPCYiyaJ6HhRgWg8jJVAgrH0t961Mh-PAayty64D8w1OGuTaJa90wmbLoQFCGfZ31wbQ","DP":"MXmQD-0L_mruZeIEVclooX4f9unjijGYfxqwZXmsgCQ8EG9yuiICrYefvZC2mr8mjptepAm0ii4O6YdPUn4J-d4tRGr8JO0yGbqdcsXeLAP38a_9GUwDw7U4BUjJqzsLYhnLbdy-eOOYlOSUn_86-fpadZKx48UpBSbHknIs67E","DQ":"T0ia2epiSg4fNsF11Xh2DHaU895EaPM7gtcSdEm2Y2cEqQZy0b6uP2L4eWdl5PFjuAva59nqeUQ8aK55ZR4rYIOBH4awoUFTIJIr2A3d5SV759GXOI55Ywfq99sVtqrHqs-u3eKyLeCkYIUqQyb4anoIlmaqYi9wVmpk0QQAQzk","E":"AQAB","K":null,"KeyId":"B355AE223C5B3D318547C8F865352EE2","Kid":"B355AE223C5B3D318547C8F865352EE2","Kty":"RSA","N":"w7mccpg-xQ1I74v-HALQNaBVrKgiNa4GpY5qajdZa76auS3ic2RBvvgGN3YqekBnnSwsieqUfiBUrDKtNs8NPns8ftkcY0YMEuNGz57Bc-LpIqpJMZdZNH07YHUDTdFe9qsUs_jJ3jyPUkxfdR90EMDRq618Ja1Jm2-kxPPidV8iuPnXOhwF-u_m4pdnWjBmI_i0v9t2If4Qq5IGLpW_r7ChglokZugamfZWhAj__gsZFHbZaW-GET-Rd2AkIl1V4RPMjNI1q6OOYpa035o6F-Wkdye-RnGCySqzWqrTN9-fFwggVi0CMO-MjfBGSPnIoPVfTrtWdtWiiJldkW5EiQ","Oth":null,"P":"90mYyR6wuMFN9MMgy_GZcB9EWsjBckb2zFzEzl8A-PxVX1ifgPOZN1ZSQjwPN9-Jj-Qk2ZVU43eqPflM4c2jED89vy9WX3XAGJ1FJHUpvYDvtc6ej5AbzAHKeYil9IikQlOrzi2JZ0ioiqTQI1_13v2-Zcg6itY73fIw6YrX0Rs","Q":"yp7yul89BP7ayvAc-sCBG3qks5BGWev_vb1eEmj3Ys3jAqBnGs8VgPNXIky9t6MgUZ2PB_6V7yLWPa7M4j8tJjQByYggqc7EuIkrG7CEH3_pIeBx02ngoQQsPd_Kgmu33CKY6bGnweUb2AEQ5OYewvgqAxtw0IowDlKcPtwxvys","QI":"Z6Co916ku0t5UdGyk_bK-fYKHcjqDBY5u_Hyg45jvz-TuQQEkeSnv2nukK7vIxuyOPlqt6C6-P68P-uNQZPqDWmaibnU4Gjj5dZtQDCl80vJEKpR48AAmnGEt8x-FeB4ZMWqPWQE3GppKAHuA5g4V2gVesziMPZeWmd09kW5Zto","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk deleted file mode 100644 index 796102b2b6..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/tempkey.jwk +++ /dev/null @@ -1 +0,0 @@ -{"alg":"RS256","d":"Qe3Ds-NA2pf25sGU3S3SMI4jLm-IzyiKy9daS87SMv49QGRM-3AehH29EZYG05-xIaQiw5ZDaBDBhJ30kld_yKBiKDS82jz7GwD_o7dYsfaKPQP2ceCgscspgLZCRYz2Bn4uPpJEdTzZX0CG3vQNNzuai96vnrw3OOE2hMKzG1G5jBEuG62UmroA1J_hjROe4xN0NweFsA20CVqd-icQRS7BZ61ckW8mJxc2Mge89YZV3OA7uVA9VkBD8WOquLp0MtxM20JI71OKpvcVdpCviO9dqyg9vKNrvzIVQz5UG-uytplQhDXKSQnMwTyityb8-UnUyJwcK97iXxXej8Q8wQ","dp":"guIUNk31o1boT3hHZ8yjD4DOFYWJhj1Zso3lGxLJX6gdWSYk70gG3Knyce0SvCIoxGzNjNr4pOIoAxACHUxlgedmynznjoGaQIUu9r1WNS-2BVzxfEGO7AZ28yhI_lAOk9z772rR8WO4y5eE5-sdT20vIEtk8Ivm8y5KPqG2nxk","dq":"ST_QInrb0xX92ydtZ8JRPEWZ9E7evtvEcDSDdDXhmsU_ikItF4bxyFj2Askgim1Muj8yKKEPEVQffvdXvkMnrCxYPFtxcTGUCblF-dTwMaQJxP8lxOm6TFEJxtFkcK1PVNkL6atx_klYYSp8ziOzdPz1lRxabSK-aMVCyWJNmn8","e":"AQAB","kid":"4A9175F021891DD4BA07727A448B4078","kty":"RSA","n":"yWDayzP7ZIUTpc3ubBUuwG71daDTgRDrDZRngbtAWxDNZQF-8mlOUzBRIBvH_We3eRhMEj5RTfAUG92OaqriB6NZorslBdgqSODRqsABQalI95QudX1DOfwgNphgKi4lRGSpe4UYVYoyWgh5Bp751bmUCdiezMna1bhnilLBK2Y_oHCnCZ3I4cFHGVldC-edefsvndynFOzWJp_y34Q71nbZEHMRKD8mx1Zj_Tt_nxZ7GtzC7AD4jjeZpSkp65mJCGXIaMMCalW2R5qB3pf6u8ei_ky08kvcHtcgi5CLqX6PsNddICzhedyohjp5oznUL5Ohw5WrlEYEeZ3_5JmdHQ","p":"7iMEhduGj-GbdvpkPW9C-pj8YK7i4zGbiE_-7TU4u4alLe_lUM0SMwG6UgqqWmGLi9LBcLkqnQ9NDODZvovyHV-NuvHUIWIrZa9t9iMsSAX-KObGjeFu8Jn9n58WeiMPEQ3X49jHM3e6g_fQ6wxYxbXnlx2-wX3LDzCQ9th-Op8","q":"2Hv1RFfzI4U5Jalaaz7ZLrr6VKGFKb1JnoGArBM7JnEMMmZwTUGlUjGxGgvKbaACTb1wXGS2A_wtPnomOx5Nu63-C6gBWLVbERbplOxowwNOdQC8dCHW5uf0LT62fyvzO8sig87c0hpUR-60ubAnQmW8rFAdHAJNvDrTaTHfSsM","qi":"XjPcTdtgULO3snpQJepHbyF8yGrKPWBdxD1so4TpB8FsCxF8fMl99QvNXLaAxffewLQkfAd7DqE62G3hbsZVgsX0X7gwQkGS_gWXcwpc7rBdeapLj0dEJOXmvpPkhgrpnOadAlnimErXzHv30XEUfph4EJOgb4crBsyeCtiWd54"} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk deleted file mode 100644 index bea6fe239c..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/tempkey.jwk +++ /dev/null @@ -1 +0,0 @@ -{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"apXp8PxjdO94e6VkAofVTiPFA0iqQVhq0Iua4L_l99OdRf-d1kzFararmGo4zRuoa3koxM39eHKJY2VDL79m0v4Pr-8xRGpuR2yw_Xq5P6SuplULlpVMffmCYbMolY6FrKgJkJFHME8QNfkZdO6jd2eQqpQEEUnQt5zab4Vu59-YsM43UB0ZTA285w2v3q9VXnw2j96-f1dKxK2FzOU6UF53BwW_f9Jios1cN1pYS8lzsF7x3TQQUmA9TQhkfvCTnQggthIIqDBaKKZNFe6roD9e5inXNXZ73nFVKEe8yQ5GXT24zXwdbxziIRkbs-CcPhTEOy9gePDjgjvTfLY_MQ","DP":"drizCBGhqyNSIV6hzvSflatteLBoNW4VlTbNOw0IKdT1av1vFuL-L3eDOrgETYndGC00-qEKcXo1cfR_1kFTLzBkpVV_r4ItnO1rafmg_HaXF2T3KXNQfBC48oBU7cfJ58oqF7GHGBWJmH4t29yYI7k33VIrmWkqiTZjew6FhRk","DQ":"4XvVFj1ffO2MOb-2TpyG-jBKMoFs7Ci4r15nw0i5AFIzBJUkQIzXZfpxaew-cpeuKJGeST0G6vbZ22VERLV2rcrWg7Am7MHxWGGO3dtei6aNyGQ9D4nWdPUHt-CtXnucm6SgF2xrsocRdH-lgDZQi-9S2Tf_sV8N6vHgjoOOYks","E":"AQAB","K":null,"KeyId":"752FDE4FB36C1EBE263154443853588C","Kid":"752FDE4FB36C1EBE263154443853588C","Kty":"RSA","N":"qwYe4W2QJDiLQ42S4_g6GhSgzKpETlar5I_6qX9T3FvkYcHl6cDYKLDXGnyCnZ_P6Ise2YIbkXywiXsdY7k9nU0PWyBGHwLMvc5crRA2hOnaAuGZ1VWv1-yMERU_3D4_GTtupGIgWf5y6Cpqo8OugclYfS8Mvoa-f5ieuhN-0T1WnW1oU1if92YkyUxaqGGMnb9_1PGxMYeewTkPW9F2EYl-WIwMtZ0Hi6G5rrzRG_g3Mn3ADQ1G6PItnI_cTqk42Ju6wL5N4LrO9YiCcXqxfN8Nirdx42Bnl_o1REUQm7Veb_E6oA2GgOCRgE3ZRdHRvgYo3_nFJJ-mW7PtEWxEKQ","Oth":null,"P":"wABDhgflF-kjvBTxWqFB5AVgeknXdHQ0rm8l_bCGK8xYcOt4Lmgw1c_A13a7lNkTv3pCNCSFO-Q_c5E7bL1f8xW682eCF09NFwoIsE7okEh-bufo1_bdZyFch7PV8MRwZMxjKs2hmvQO8mDr357kLk0kwdNubDtbQuSP8PPMeWM","Q":"5AfY-qYuQF7X-gLWJ9aXWOIR6_htzyQhAljKrGrRTLExTpOIG1cp10ucS6m1-XVzH_wbvhMQmGDhdgsxoK-QtXexFS4lYaa1IYmrW7kmFsgm9jMJLwAbTL-j5enoKRZNx1l4Nk-YZyE_7Rsmht7vV69ANOHZ0lpnb1rDrSOBSAM","QI":"n_kUKjaIpJZ2hHQeuX8FM5n9-GUIsQO9Nd2v-zk6Z6bWsiNakrcQe-j32qM9cwwUodxw8VD-nliDLiJc8cLL6drXItltpunkCfS1SSNlchN61wJX152_YGfw4UX80T4QbQxTjwB6xQ0Lr6F_mIeVsMYUHLEFO1d_tZ2ZTCK4j88","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file From 59e3a3c3ad994ab01cb3721fd2fa6a9fef4a35d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 19 Oct 2020 14:15:39 +0300 Subject: [PATCH 55/55] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6e767c8f76..5b8dfe9c11 100644 --- a/.gitignore +++ b/.gitignore @@ -305,3 +305,6 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/ /modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json abp-build-config.json /templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Test/ + +# Identity Server temp signature file +tempkey.jwk \ No newline at end of file