3 changed files with 189 additions and 187 deletions
@ -1,187 +1,187 @@ |
|||||
using IdentityServer4; |
using IdentityServer4; |
||||
using IdentityServer4.Models; |
using IdentityServer4.Models; |
||||
using Microsoft.AspNetCore.Authorization; |
using Microsoft.AspNetCore.Authorization; |
||||
using System; |
using System; |
||||
using System.Collections.Generic; |
using System.Collections.Generic; |
||||
using System.Linq; |
using System.Linq; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
using Volo.Abp; |
using Volo.Abp; |
||||
using Volo.Abp.Application.Dtos; |
using Volo.Abp.Application.Dtos; |
||||
using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; |
using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource; |
||||
|
|
||||
namespace LINGYUN.Abp.IdentityServer.ApiResources |
namespace LINGYUN.Abp.IdentityServer.ApiResources |
||||
{ |
{ |
||||
[Authorize(AbpIdentityServerPermissions.ApiResources.Default)] |
[Authorize(AbpIdentityServerPermissions.ApiResources.Default)] |
||||
public class ApiResourceAppService : AbpIdentityServerAppServiceBase, IApiResourceAppService |
public class ApiResourceAppService : AbpIdentityServerAppServiceBase, IApiResourceAppService |
||||
{ |
{ |
||||
protected IApiResourceRepository ApiResourceRepository { get; } |
protected IApiResourceRepository ApiResourceRepository { get; } |
||||
|
|
||||
public ApiResourceAppService( |
public ApiResourceAppService( |
||||
IApiResourceRepository apiResourceRepository) |
IApiResourceRepository apiResourceRepository) |
||||
{ |
{ |
||||
ApiResourceRepository = apiResourceRepository; |
ApiResourceRepository = apiResourceRepository; |
||||
} |
} |
||||
|
|
||||
public virtual async Task<ApiResourceDto> GetAsync(Guid id) |
public virtual async Task<ApiResourceDto> GetAsync(Guid id) |
||||
{ |
{ |
||||
var apiResource = await ApiResourceRepository.GetAsync(id); |
var apiResource = await ApiResourceRepository.GetAsync(id); |
||||
|
|
||||
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
||||
} |
} |
||||
|
|
||||
public virtual async Task<PagedResultDto<ApiResourceDto>> GetListAsync(ApiResourceGetByPagedInputDto input) |
public virtual async Task<PagedResultDto<ApiResourceDto>> GetListAsync(ApiResourceGetByPagedInputDto input) |
||||
{ |
{ |
||||
var apiResources = await ApiResourceRepository.GetListAsync(input.Sorting, |
var apiResources = await ApiResourceRepository.GetListAsync(input.Sorting, |
||||
input.SkipCount, input.MaxResultCount, |
input.SkipCount, input.MaxResultCount, |
||||
input.Filter); |
input.Filter); |
||||
// 未加Filter过滤器? 结果数不准
|
// 未加Filter过滤器? 结果数不准
|
||||
var apiResourceCount = await ApiResourceRepository.GetCountAsync(); |
var apiResourceCount = await ApiResourceRepository.GetCountAsync(input.Filter); |
||||
|
|
||||
return new PagedResultDto<ApiResourceDto>(apiResourceCount, |
return new PagedResultDto<ApiResourceDto>(apiResourceCount, |
||||
ObjectMapper.Map<List<ApiResource>, List<ApiResourceDto>>(apiResources)); |
ObjectMapper.Map<List<ApiResource>, List<ApiResourceDto>>(apiResources)); |
||||
} |
} |
||||
|
|
||||
[Authorize(AbpIdentityServerPermissions.ApiResources.Create)] |
[Authorize(AbpIdentityServerPermissions.ApiResources.Create)] |
||||
public virtual async Task<ApiResourceDto> CreateAsync(ApiResourceCreateDto input) |
public virtual async Task<ApiResourceDto> CreateAsync(ApiResourceCreateDto input) |
||||
{ |
{ |
||||
var apiResourceExists = await ApiResourceRepository.CheckNameExistAsync(input.Name); |
var apiResourceExists = await ApiResourceRepository.CheckNameExistAsync(input.Name); |
||||
if (apiResourceExists) |
if (apiResourceExists) |
||||
{ |
{ |
||||
throw new UserFriendlyException(L[AbpIdentityServerErrorConsts.ApiResourceNameExisted, input.Name]); |
throw new UserFriendlyException(L[AbpIdentityServerErrorConsts.ApiResourceNameExisted, input.Name]); |
||||
} |
} |
||||
var apiResource = new ApiResource( |
var apiResource = new ApiResource( |
||||
GuidGenerator.Create(), |
GuidGenerator.Create(), |
||||
input.Name, |
input.Name, |
||||
input.DisplayName, |
input.DisplayName, |
||||
input.Description); |
input.Description); |
||||
|
|
||||
await UpdateApiResourceByInputAsync(apiResource, input); |
await UpdateApiResourceByInputAsync(apiResource, input); |
||||
|
|
||||
apiResource = await ApiResourceRepository.InsertAsync(apiResource); |
apiResource = await ApiResourceRepository.InsertAsync(apiResource); |
||||
|
|
||||
await CurrentUnitOfWork.SaveChangesAsync(); |
await CurrentUnitOfWork.SaveChangesAsync(); |
||||
|
|
||||
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
||||
} |
} |
||||
|
|
||||
[Authorize(AbpIdentityServerPermissions.ApiResources.Update)] |
[Authorize(AbpIdentityServerPermissions.ApiResources.Update)] |
||||
public virtual async Task<ApiResourceDto> UpdateAsync(Guid id, ApiResourceUpdateDto input) |
public virtual async Task<ApiResourceDto> UpdateAsync(Guid id, ApiResourceUpdateDto input) |
||||
{ |
{ |
||||
var apiResource = await ApiResourceRepository.GetAsync(id); |
var apiResource = await ApiResourceRepository.GetAsync(id); |
||||
|
|
||||
await UpdateApiResourceByInputAsync(apiResource, input); |
await UpdateApiResourceByInputAsync(apiResource, input); |
||||
|
|
||||
apiResource = await ApiResourceRepository.UpdateAsync(apiResource); |
apiResource = await ApiResourceRepository.UpdateAsync(apiResource); |
||||
|
|
||||
await CurrentUnitOfWork.SaveChangesAsync(); |
await CurrentUnitOfWork.SaveChangesAsync(); |
||||
|
|
||||
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
return ObjectMapper.Map<ApiResource, ApiResourceDto>(apiResource); |
||||
} |
} |
||||
|
|
||||
[Authorize(AbpIdentityServerPermissions.ApiResources.Delete)] |
[Authorize(AbpIdentityServerPermissions.ApiResources.Delete)] |
||||
public virtual async Task DeleteAsync(Guid id) |
public virtual async Task DeleteAsync(Guid id) |
||||
{ |
{ |
||||
var apiResource = await ApiResourceRepository.GetAsync(id); |
var apiResource = await ApiResourceRepository.GetAsync(id); |
||||
await ApiResourceRepository.DeleteAsync(apiResource); |
await ApiResourceRepository.DeleteAsync(apiResource); |
||||
|
|
||||
await CurrentUnitOfWork.SaveChangesAsync(); |
await CurrentUnitOfWork.SaveChangesAsync(); |
||||
} |
} |
||||
|
|
||||
protected virtual async Task UpdateApiResourceByInputAsync(ApiResource apiResource, ApiResourceCreateOrUpdateDto input) |
protected virtual async Task UpdateApiResourceByInputAsync(ApiResource apiResource, ApiResourceCreateOrUpdateDto input) |
||||
{ |
{ |
||||
apiResource.ShowInDiscoveryDocument = input.ShowInDiscoveryDocument; |
apiResource.ShowInDiscoveryDocument = input.ShowInDiscoveryDocument; |
||||
apiResource.Enabled = input.Enabled; |
apiResource.Enabled = input.Enabled; |
||||
|
|
||||
if (!string.Equals(apiResource.AllowedAccessTokenSigningAlgorithms, input.AllowedAccessTokenSigningAlgorithms, StringComparison.InvariantCultureIgnoreCase)) |
if (!string.Equals(apiResource.AllowedAccessTokenSigningAlgorithms, input.AllowedAccessTokenSigningAlgorithms, StringComparison.InvariantCultureIgnoreCase)) |
||||
{ |
{ |
||||
apiResource.AllowedAccessTokenSigningAlgorithms = input.AllowedAccessTokenSigningAlgorithms; |
apiResource.AllowedAccessTokenSigningAlgorithms = input.AllowedAccessTokenSigningAlgorithms; |
||||
} |
} |
||||
if (!string.Equals(apiResource.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) |
if (!string.Equals(apiResource.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) |
||||
{ |
{ |
||||
apiResource.DisplayName = input.DisplayName; |
apiResource.DisplayName = input.DisplayName; |
||||
} |
} |
||||
if (apiResource.Description?.Equals(input.Description, StringComparison.InvariantCultureIgnoreCase) |
if (apiResource.Description?.Equals(input.Description, StringComparison.InvariantCultureIgnoreCase) |
||||
== false) |
== false) |
||||
{ |
{ |
||||
apiResource.Description = input.Description; |
apiResource.Description = input.Description; |
||||
} |
} |
||||
|
|
||||
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageClaims)) |
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageClaims)) |
||||
{ |
{ |
||||
// 删除不存在的UserClaim
|
// 删除不存在的UserClaim
|
||||
apiResource.UserClaims.RemoveAll(claim => !input.UserClaims.Any(inputClaim => claim.Type == inputClaim.Type)); |
apiResource.UserClaims.RemoveAll(claim => !input.UserClaims.Any(inputClaim => claim.Type == inputClaim.Type)); |
||||
foreach (var inputClaim in input.UserClaims) |
foreach (var inputClaim in input.UserClaims) |
||||
{ |
{ |
||||
var userClaim = apiResource.FindClaim(inputClaim.Type); |
var userClaim = apiResource.FindClaim(inputClaim.Type); |
||||
if (userClaim == null) |
if (userClaim == null) |
||||
{ |
{ |
||||
apiResource.AddUserClaim(inputClaim.Type); |
apiResource.AddUserClaim(inputClaim.Type); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageScopes)) |
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageScopes)) |
||||
{ |
{ |
||||
// 删除不存在的Scope
|
// 删除不存在的Scope
|
||||
apiResource.Scopes.RemoveAll(scope => !input.Scopes.Any(inputScope => scope.Scope == inputScope.Scope)); |
apiResource.Scopes.RemoveAll(scope => !input.Scopes.Any(inputScope => scope.Scope == inputScope.Scope)); |
||||
foreach (var inputScope in input.Scopes) |
foreach (var inputScope in input.Scopes) |
||||
{ |
{ |
||||
var scope = apiResource.FindScope(inputScope.Scope); |
var scope = apiResource.FindScope(inputScope.Scope); |
||||
if (scope == null) |
if (scope == null) |
||||
{ |
{ |
||||
apiResource.AddScope(inputScope.Scope); |
apiResource.AddScope(inputScope.Scope); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageSecrets)) |
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageSecrets)) |
||||
{ |
{ |
||||
// 删除不存在的Secret
|
// 删除不存在的Secret
|
||||
apiResource.Secrets.RemoveAll(secret => !input.Secrets.Any(inputSecret => secret.Type == inputSecret.Type && secret.Value == inputSecret.Value)); |
apiResource.Secrets.RemoveAll(secret => !input.Secrets.Any(inputSecret => secret.Type == inputSecret.Type && secret.Value == inputSecret.Value)); |
||||
foreach (var inputSecret in input.Secrets) |
foreach (var inputSecret in input.Secrets) |
||||
{ |
{ |
||||
// 第一次重复校验已经加密过的字符串
|
// 第一次重复校验已经加密过的字符串
|
||||
if (apiResource.FindSecret(inputSecret.Value, inputSecret.Type) == null) |
if (apiResource.FindSecret(inputSecret.Value, inputSecret.Type) == null) |
||||
{ |
{ |
||||
var apiSecretValue = inputSecret.Value; |
var apiSecretValue = inputSecret.Value; |
||||
if (IdentityServerConstants.SecretTypes.SharedSecret.Equals(inputSecret.Type)) |
if (IdentityServerConstants.SecretTypes.SharedSecret.Equals(inputSecret.Type)) |
||||
{ |
{ |
||||
if (inputSecret.HashType == HashType.Sha256) |
if (inputSecret.HashType == HashType.Sha256) |
||||
{ |
{ |
||||
apiSecretValue = inputSecret.Value.Sha256(); |
apiSecretValue = inputSecret.Value.Sha256(); |
||||
} |
} |
||||
else if (inputSecret.HashType == HashType.Sha512) |
else if (inputSecret.HashType == HashType.Sha512) |
||||
{ |
{ |
||||
apiSecretValue = inputSecret.Value.Sha512(); |
apiSecretValue = inputSecret.Value.Sha512(); |
||||
} |
} |
||||
} |
} |
||||
// 加密之后还需要做一次校验 避免出现重复值
|
// 加密之后还需要做一次校验 避免出现重复值
|
||||
var secret = apiResource.FindSecret(apiSecretValue, inputSecret.Type); |
var secret = apiResource.FindSecret(apiSecretValue, inputSecret.Type); |
||||
if (secret == null) |
if (secret == null) |
||||
{ |
{ |
||||
apiResource.AddSecret(apiSecretValue, inputSecret.Expiration, inputSecret.Type, inputSecret.Description); |
apiResource.AddSecret(apiSecretValue, inputSecret.Expiration, inputSecret.Type, inputSecret.Description); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageProperties)) |
if (await IsGrantAsync(AbpIdentityServerPermissions.ApiResources.ManageProperties)) |
||||
{ |
{ |
||||
// 删除不存在的属性
|
// 删除不存在的属性
|
||||
apiResource.Properties.RemoveAll(prop => !input.Properties.Any(inputProp => prop.Key == inputProp.Key)); |
apiResource.Properties.RemoveAll(prop => !input.Properties.Any(inputProp => prop.Key == inputProp.Key)); |
||||
foreach (var inputProp in input.Properties) |
foreach (var inputProp in input.Properties) |
||||
{ |
{ |
||||
var apiResourceProperty = apiResource.FindProperty(inputProp.Key); |
var apiResourceProperty = apiResource.FindProperty(inputProp.Key); |
||||
if (apiResourceProperty == null) |
if (apiResourceProperty == null) |
||||
{ |
{ |
||||
apiResource.AddProperty(inputProp.Key, inputProp.Value); |
apiResource.AddProperty(inputProp.Key, inputProp.Value); |
||||
} |
} |
||||
else |
else |
||||
{ |
{ |
||||
apiResourceProperty.Value = inputProp.Value; |
apiResourceProperty.Value = inputProp.Value; |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue