diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceDataSeeder.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceDataSeeder.cs new file mode 100644 index 0000000000..cd50765ec5 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceDataSeeder.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.IdentityServer.IdentityResources +{ + public interface IIdentityResourceDataSeeder + { + Task CreateStandardResourcesAsync(); + } +} \ No newline at end of file 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 09eb9a762b..af53d12d38 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 @@ -22,11 +22,12 @@ namespace Volo.Abp.IdentityServer.IdentityResources CancellationToken cancellationToken = default ); - Task> GetListAsync( - bool includeDetails = false, + Task FindByNameAsync( + string name, + bool includeDetails = true, CancellationToken cancellationToken = default ); - Task GetTotalCount(); + Task GetTotalCountAsync(); } } \ 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 37b259fe61..b01296dad3 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 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; using Volo.Abp.Domain.Entities; @@ -52,6 +53,19 @@ namespace Volo.Abp.IdentityServer.IdentityResources UserClaims = new List(); } + public IdentityResource(Guid id, IdentityServer4.Models.IdentityResource resource) + { + Id = id; + Name = resource.Name; + DisplayName = resource.DisplayName; + Description = resource.Description; + Enabled = resource.Enabled; + Required = resource.Required; + Emphasize = resource.Emphasize; + ShowInDiscoveryDocument = resource.ShowInDiscoveryDocument; + UserClaims = resource.UserClaims.Select(claimType => new IdentityClaim(id, claimType)).ToList(); + } + public virtual void AddUserClaim([NotNull] string type) { UserClaims.Add(new IdentityClaim(Id, type)); diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs new file mode 100644 index 0000000000..af62b8ed15 --- /dev/null +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceDataSeeder.cs @@ -0,0 +1,52 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; + +namespace Volo.Abp.IdentityServer.IdentityResources +{ + public class IdentityResourceDataSeeder : IIdentityResourceDataSeeder, ITransientDependency + { + protected IIdentityResourceRepository IdentityResourceRepository { get; } + protected IGuidGenerator GuidGenerator { get; } + + public IdentityResourceDataSeeder( + IIdentityResourceRepository identityResourceRepository, + IGuidGenerator guidGenerator) + { + IdentityResourceRepository = identityResourceRepository; + GuidGenerator = guidGenerator; + } + + public virtual async Task CreateStandardResourcesAsync() + { + var resources = new IdentityServer4.Models.IdentityResource[] + { + new IdentityServer4.Models.IdentityResources.OpenId(), + new IdentityServer4.Models.IdentityResources.Profile(), + new IdentityServer4.Models.IdentityResources.Email(), + new IdentityServer4.Models.IdentityResources.Address(), + new IdentityServer4.Models.IdentityResources.Phone() + }; + + foreach (var resource in resources) + { + await AddIfNotExistsAsync(resource); + } + } + + protected virtual async Task AddIfNotExistsAsync(IdentityServer4.Models.IdentityResource resource) + { + if (await IdentityResourceRepository.FindByNameAsync(resource.Name) != null) + { + return; + } + + await IdentityResourceRepository.InsertAsync( + new IdentityResource( + GuidGenerator.Create(), + resource + ) + ); + } + } +} 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 deef97424f..a6ff62fc05 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 @@ -31,15 +31,6 @@ namespace Volo.Abp.IdentityServer.IdentityResources return await query.ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task> GetListAsync( - bool includeDetails = false, - CancellationToken cancellationToken = default) - { - return await DbSet - .IncludeDetails(includeDetails) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - public override IQueryable WithDetails() { return GetQueryable().IncludeDetails(); @@ -49,12 +40,24 @@ namespace Volo.Abp.IdentityServer.IdentityResources bool includeDetails = false, CancellationToken cancellationToken = default) { return await DbSet - .IncludeDetails(includeDetails).OrderBy(sorting ?? "name desc") + .IncludeDetails(includeDetails) + .OrderBy(sorting ?? "name desc") .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task GetTotalCount() + public async Task FindByNameAsync( + string name, + bool includeDetails = true, + CancellationToken cancellationToken = default) + { + return await DbSet + .IncludeDetails(includeDetails) + .Where(x => x.Name == name) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetTotalCountAsync() { return await DbSet.CountAsync(); } 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 c5d4d7750f..85505c2987 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 @@ -28,6 +28,16 @@ namespace Volo.Abp.IdentityServer.MongoDB .ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task FindByNameAsync( + string name, + bool includeDetails = true, + CancellationToken cancellationToken = default) + { + return await GetMongoQueryable() + .Where(x => x.Name == name) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + public async Task> GetListByScopesAsync(string[] scopeNames, bool includeDetails = false, CancellationToken cancellationToken = default) { @@ -36,7 +46,7 @@ namespace Volo.Abp.IdentityServer.MongoDB .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task GetTotalCount() + public virtual async Task GetTotalCountAsync() { return await GetCountAsync(); }