diff --git a/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index 8c20d83b0..75425eb96 100644 --- a/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -1,9 +1,9 @@ -using Volo.Abp.Modularity; - -namespace LINGYUN.Abp.IdentityServer -{ - [DependsOn(typeof(Volo.Abp.IdentityServer.AbpIdentityServerDomainModule))] - public class AbpIdentityServerDomainModule : AbpModule - { - } -} +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.IdentityServer +{ + [DependsOn(typeof(Volo.Abp.IdentityServer.AbpIdentityServerDomainModule))] + public class AbpIdentityServerDomainModule : AbpModule + { + } +} diff --git a/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeeder.cs b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeeder.cs new file mode 100644 index 000000000..72c4e7376 --- /dev/null +++ b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeeder.cs @@ -0,0 +1,73 @@ +using Microsoft.Extensions.Options; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.Identity; +using Volo.Abp.IdentityServer.IdentityResources; + +namespace LINGYUN.Abp.IdentityServer.IdentityResources +{ + public class CustomIdentityResourceDataSeeder : ICustomIdentityResourceDataSeeder, ITransientDependency + { + protected IIdentityClaimTypeRepository ClaimTypeRepository { get; } + protected IIdentityResourceRepository IdentityResourceRepository { get; } + protected IGuidGenerator GuidGenerator { get; } + protected CustomIdentityResourceDataSeederOptions Options { get; } + + public CustomIdentityResourceDataSeeder( + IIdentityResourceRepository identityResourceRepository, + IGuidGenerator guidGenerator, + IIdentityClaimTypeRepository claimTypeRepository, + IOptions options) + { + IdentityResourceRepository = identityResourceRepository; + GuidGenerator = guidGenerator; + ClaimTypeRepository = claimTypeRepository; + Options = options.Value; + } + + public virtual async Task CreateCustomResourcesAsync() + { + foreach (var resource in Options.Resources) + { + foreach (var claimType in resource.UserClaims) + { + await AddClaimTypeIfNotExistsAsync(claimType); + } + + await AddIdentityResourceIfNotExistsAsync(resource); + } + } + + protected virtual async Task AddIdentityResourceIfNotExistsAsync(IdentityServer4.Models.IdentityResource resource) + { + if (await IdentityResourceRepository.CheckNameExistAsync(resource.Name)) + { + return; + } + + await IdentityResourceRepository.InsertAsync( + new IdentityResource( + GuidGenerator.Create(), + resource + ) + ); + } + + protected virtual async Task AddClaimTypeIfNotExistsAsync(string claimType) + { + if (await ClaimTypeRepository.AnyAsync(claimType)) + { + return; + } + + await ClaimTypeRepository.InsertAsync( + new IdentityClaimType( + GuidGenerator.Create(), + claimType, + isStatic: true + ) + ); + } + } +} diff --git a/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeederOptions.cs b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeederOptions.cs new file mode 100644 index 000000000..28dc48ea5 --- /dev/null +++ b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/CustomIdentityResourceDataSeederOptions.cs @@ -0,0 +1,14 @@ +using IdentityServer4.Models; +using System.Collections.Generic; + +namespace LINGYUN.Abp.IdentityServer.IdentityResources +{ + public class CustomIdentityResourceDataSeederOptions + { + public IList Resources { get; } + public CustomIdentityResourceDataSeederOptions() + { + Resources = new List(); + } + } +} diff --git a/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/ICustomIdentityResourceDataSeeder.cs b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/ICustomIdentityResourceDataSeeder.cs new file mode 100644 index 000000000..e6b58a3c5 --- /dev/null +++ b/aspnet-core/modules/identityServer/LINGYUN.Abp.IdentityServer.Domain/LINGYUN/Abp/IdentityServer/IdentityResources/ICustomIdentityResourceDataSeeder.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IdentityServer.IdentityResources +{ + public interface ICustomIdentityResourceDataSeeder + { + Task CreateCustomResourcesAsync(); + } +} diff --git a/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.Configure.cs b/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.Configure.cs index 666a6922c..b6345a2dc 100644 --- a/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.Configure.cs +++ b/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.Configure.cs @@ -1,4 +1,6 @@ -using DotNetCore.CAP; +using AuthServer.IdentityResources; +using DotNetCore.CAP; +using LINGYUN.Abp.IdentityServer.IdentityResources; using LINGYUN.Abp.Serilog.Enrichers.Application; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -85,6 +87,15 @@ namespace AuthServer.Host options.UseMySQL(); }); } + + private void ConfigureDataSeeder() + { + Configure(options => + { + options.Resources.Add(new CustomIdentityResources.AvatarUrl()); + }); + } + private void ConfigureJsonSerializer() { // 中文序列化的编码问题 diff --git a/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs b/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs index 9708c11a7..74aea7157 100644 --- a/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs +++ b/aspnet-core/services/account/AuthServer.Host/AuthIdentityServerModule.cs @@ -88,6 +88,7 @@ namespace AuthServer.Host ConfigureVirtualFileSystem(); ConfigureLocalization(); ConfigureAuditing(); + ConfigureDataSeeder(); ConfigureUrls(configuration); ConfigureMultiTenancy(configuration); ConfigureCors(context.Services, configuration); diff --git a/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs index d8d6c7374..5859cbe60 100644 --- a/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs +++ b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs @@ -1,4 +1,5 @@ using LINGYUN.Abp.IdentityServer; +using LINGYUN.Abp.IdentityServer.IdentityResources; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; @@ -24,6 +25,7 @@ namespace AuthServer.DataSeeder private readonly IApiResourceRepository _apiResourceRepository; private readonly IApiScopeRepository _apiScopeRepository; private readonly IClientRepository _clientRepository; + private readonly ICustomIdentityResourceDataSeeder _customIdentityResourceDataSeeder; private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; private readonly IWeChatResourceDataSeeder _weChatResourceDataSeeder; private readonly IGuidGenerator _guidGenerator; @@ -38,6 +40,7 @@ namespace AuthServer.DataSeeder IApiResourceRepository apiResourceRepository, IWeChatResourceDataSeeder weChatResourceDataSeeder, IIdentityResourceDataSeeder identityResourceDataSeeder, + ICustomIdentityResourceDataSeeder customIdentityResourceDataSeeder, IGuidGenerator guidGenerator, ICurrentTenant currentTenant) { @@ -48,8 +51,9 @@ namespace AuthServer.DataSeeder _apiResourceRepository = apiResourceRepository; _weChatResourceDataSeeder = weChatResourceDataSeeder; _identityResourceDataSeeder = identityResourceDataSeeder; + _customIdentityResourceDataSeeder = customIdentityResourceDataSeeder; _guidGenerator = guidGenerator; - var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"; + var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"; var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile($"appsettings.{env}.json", optional: false, reloadOnChange: true) @@ -64,6 +68,7 @@ namespace AuthServer.DataSeeder using (_currentTenant.Change(context?.TenantId)) { await _identityResourceDataSeeder.CreateStandardResourcesAsync(); + await _customIdentityResourceDataSeeder.CreateCustomResourcesAsync(); await CreateWeChatClaimTypeAsync(); await CreateApiResourcesAsync(); await CreateApiScopesAsync(); diff --git a/aspnet-core/services/account/AuthServer.Host/IdentityResources/CustomIdentityResources.cs b/aspnet-core/services/account/AuthServer.Host/IdentityResources/CustomIdentityResources.cs new file mode 100644 index 000000000..0a96ce600 --- /dev/null +++ b/aspnet-core/services/account/AuthServer.Host/IdentityResources/CustomIdentityResources.cs @@ -0,0 +1,19 @@ +using IdentityServer4.Models; + +namespace AuthServer.IdentityResources +{ + public class CustomIdentityResources + { + public class AvatarUrl : IdentityResource + { + public static string ClaimType { get; set; } = "avatarUrl"; + public AvatarUrl() + { + Name = ClaimType; + DisplayName = "Your avatar url"; + Emphasize = true; + UserClaims = new string[] { ClaimType }; + } + } + } +} diff --git a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.Configure.cs b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.Configure.cs index 62ed63cba..48cb553e0 100644 --- a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.Configure.cs +++ b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.Configure.cs @@ -11,11 +11,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using StackExchange.Redis; using System; -using System.Collections.Generic; -using System.Linq; using System.Text.Encodings.Web; using System.Text.Unicode; -using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Auditing; using Volo.Abp.Authorization.Permissions;