From 127ac4f6170e8a4266394aca88179c6a426583f1 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Sat, 6 Jan 2018 00:51:13 +0300 Subject: [PATCH] Added IdentityResourceStore --- .../Volo.Abp.AutoMapper.csproj | 2 +- .../ApiResources/ApiResources.cs | 24 ++++++ .../IIdentityResourceRepository.cs | 19 +++++ .../IdentityResourceStore.cs | 50 ++++++++++++ .../IdentityResourceRepository.cs | 77 +++++++++++++++++++ 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/ApiResources.cs create mode 100644 src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs create mode 100644 src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceStore.cs create mode 100644 src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResourceRepository.cs 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())); + } + } +}