diff --git a/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj b/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj
index c7021e85f0..b522899251 100644
--- a/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj
+++ b/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj
@@ -18,7 +18,7 @@
-
+
\ No newline at end of file
diff --git a/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResources.cs b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResources.cs
new file mode 100644
index 0000000000..32b32251ad
--- /dev/null
+++ b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResources.cs
@@ -0,0 +1,24 @@
+using System.Threading.Tasks;
+using Volo.Abp.IdentityServer.IdentityResources;
+
+namespace Volo.Abp.IdentityServer.ApiResources
+{
+ public class ApiResources
+ {
+ public Task Resources { get; set; }
+
+ public Task IdentityResources { get; set; }
+
+ public ApiResources()
+ {
+
+ }
+
+ public ApiResources(Task resources, Task identityResources)
+ {
+ Resources = resources;
+ IdentityResources = identityResources;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs
new file mode 100644
index 0000000000..1d9bbffd15
--- /dev/null
+++ b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs
@@ -0,0 +1,19 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using IdentityServer4.Models;
+using Volo.Abp.Domain.Repositories;
+using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource;
+
+namespace Volo.Abp.IdentityServer.IdentityResources
+{
+ public interface IIdentityResourceRepository : IRepository
+ {
+ Task> FindIdentityResourcesByScopeAsync(string[] scopeNames);
+
+ Task> FindApiResourcesByScopeAsync(string[] scopeNames);
+
+ Task FindApiResourceAsync(string name);
+
+ Task GetAllResourcesAsync();
+ }
+}
\ No newline at end of file
diff --git a/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceStore.cs b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceStore.cs
new file mode 100644
index 0000000000..e1f15844b8
--- /dev/null
+++ b/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceStore.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using IdentityServer4.Models;
+using IdentityServer4.Stores;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.ObjectMapping;
+
+namespace Volo.Abp.IdentityServer.IdentityResources
+{
+ public class IdentityResourceStore : IResourceStore, ITransientDependency
+ {
+ private readonly IIdentityResourceRepository _identityResourceRepository;
+ private readonly IObjectMapper _objectMapper;
+
+ public IdentityResourceStore(IIdentityResourceRepository identityResourceRepository, IObjectMapper objectMapper)
+ {
+ _identityResourceRepository = identityResourceRepository;
+ _objectMapper = objectMapper;
+ }
+
+ public virtual async Task> FindIdentityResourcesByScopeAsync(IEnumerable scopeNames)
+ {
+ var results = await _identityResourceRepository.FindIdentityResourcesByScopeAsync(scopeNames.ToArray());
+ return _objectMapper.Map, List>(results);
+ }
+
+ public virtual async Task> FindApiResourcesByScopeAsync(IEnumerable scopeNames)
+ {
+ var results = await _identityResourceRepository.FindApiResourcesByScopeAsync(scopeNames.ToArray());
+ return results?.Select(x => _objectMapper.Map(x));
+ }
+
+ public virtual async Task FindApiResourceAsync(string name)
+ {
+ var result = await _identityResourceRepository.FindApiResourceAsync(name);
+ return _objectMapper.Map(result);
+ }
+
+ public virtual async Task GetAllResourcesAsync()
+ {
+ var result = await _identityResourceRepository.GetAllResourcesAsync();
+ return new Resources
+ (
+ result.Resources.Result.Select(y => _objectMapper.Map(y)),
+ result.IdentityResources.Result.Select(x => _objectMapper.Map(x))
+ );
+ }
+ }
+}
diff --git a/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResourceRepository.cs b/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResourceRepository.cs
new file mode 100644
index 0000000000..02897dcd99
--- /dev/null
+++ b/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResourceRepository.cs
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using IdentityServer4.Models;
+using Microsoft.EntityFrameworkCore;
+using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.IdentityServer.EntityFrameworkCore;
+using Volo.Abp.IdentityServer.IdentityResources;
+using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource;
+using IdentityResource = Volo.Abp.IdentityServer.IdentityResources.IdentityResource;
+
+namespace Volo.Abp.IdentityServer
+{
+ public class IdentityResourceRepository : EfCoreRepository, IIdentityResourceRepository
+ {
+ public IdentityResourceRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider)
+ {
+
+ }
+
+ public Task> FindIdentityResourcesByScopeAsync(string[] scopeNames)
+ {
+ var query = from identityResource in DbSet.Include(x => x.UserClaims)
+ where scopeNames.Contains(identityResource.Name)
+ select identityResource;
+
+ return query.ToListAsync();
+ }
+
+ public Task> FindApiResourcesByScopeAsync(string[] scopeNames)
+ {
+ var names = scopeNames.ToArray();
+
+ var query = from api in DbContext.ApiResources
+ where api.Scopes.Any(x => names.Contains(x.Name))
+ select api;
+
+ var apis = query
+ .Include(x => x.Secrets)
+ .Include(x => x.Scopes)
+ .ThenInclude(s => s.UserClaims)
+ .Include(x => x.UserClaims);
+
+ return apis.ToListAsync();
+ }
+
+ public Task FindApiResourceAsync(string name)
+ {
+ var query = from apiResource in DbContext.ApiResources
+ where apiResource.Name == name
+ select apiResource;
+
+ var apis = query
+ .Include(x => x.Secrets)
+ .Include(x => x.Scopes)
+ .ThenInclude(s => s.UserClaims)
+ .Include(x => x.UserClaims);
+
+ return apis.FirstOrDefaultAsync();
+ }
+
+ public Task GetAllResourcesAsync()
+ {
+ var identity = DbContext.IdentityResources
+ .Include(x => x.UserClaims);
+
+ var apis = DbContext.ApiResources
+ .Include(x => x.Secrets)
+ .Include(x => x.Scopes)
+ .ThenInclude(s => s.UserClaims)
+ .Include(x => x.UserClaims);
+
+ return Task.FromResult(new ApiResources.ApiResources(identity.ToArrayAsync(), apis.ToArrayAsync()));
+ }
+ }
+}