From f37e0440c6c11e796bfe4ae869130e100ad7b392 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:06:33 +0800 Subject: [PATCH] Add high-performance AddDeveloperSigningCredential method. --- .../AbpIdentityServerBuilderExtensions.cs | 81 ++++++++++++++++++- .../AbpIdentityServerDomainModule.cs | 2 +- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs index 6719192fdd..52ff0ac9c5 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderExtensions.cs @@ -1,9 +1,14 @@ -using System; +using System; using System.IdentityModel.Tokens.Jwt; +using System.IO; +using System.Security.Cryptography; using IdentityModel; +using IdentityServer4; +using IdentityServer4.Configuration; using IdentityServer4.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Newtonsoft.Json.Linq; using Volo.Abp.Identity; using Volo.Abp.IdentityServer.AspNetIdentity; using Volo.Abp.Security.Claims; @@ -49,5 +54,77 @@ namespace Volo.Abp.IdentityServer return builder; } + + public static IIdentityServerBuilder AddAbpDeveloperSigningCredential( + this IIdentityServerBuilder builder, + bool persistKey = true, + string filename = null, + IdentityServerConstants.RsaSigningAlgorithm signingAlgorithm = IdentityServerConstants.RsaSigningAlgorithm.RS256) + { + if (filename == null) + { + filename = Path.Combine(Directory.GetCurrentDirectory(), "tempkey.rsa"); + } + + if (File.Exists(filename)) + { + var keyFile = File.ReadAllText(filename); + + var json = JObject.Parse(keyFile); + var keyId = json.GetValue("KeyId").Value(); + var jsonParameters = json.GetValue("Parameters"); + RSAParameters rsaParameters; + rsaParameters.D = Convert.FromBase64String(jsonParameters["D"].Value()); + rsaParameters.DP = Convert.FromBase64String(jsonParameters["DP"].Value()); + rsaParameters.DQ = Convert.FromBase64String(jsonParameters["DQ"].Value()); + rsaParameters.Exponent = Convert.FromBase64String(jsonParameters["Exponent"].Value()); + rsaParameters.InverseQ = Convert.FromBase64String(jsonParameters["InverseQ"].Value()); + rsaParameters.Modulus = Convert.FromBase64String(jsonParameters["Modulus"].Value()); + rsaParameters.P = Convert.FromBase64String(jsonParameters["P"].Value()); + rsaParameters.Q = Convert.FromBase64String(jsonParameters["Q"].Value()); + + return builder.AddSigningCredential(CryptoHelper.CreateRsaSecurityKey(rsaParameters, keyId), signingAlgorithm); + } + else + { + var key = CryptoHelper.CreateRsaSecurityKey(); + + RSAParameters parameters; + + if (key.Rsa != null) + { + parameters = key.Rsa.ExportParameters(includePrivateParameters: true); + } + else + { + parameters = key.Parameters; + } + + var jObject = new JObject + { + { + "KeyId", key.KeyId + }, + { + "Parameters", new JObject + { + {"D", Convert.ToBase64String(parameters.D)}, + {"DP", Convert.ToBase64String(parameters.DP)}, + {"DQ", Convert.ToBase64String(parameters.DQ)}, + {"Exponent", Convert.ToBase64String(parameters.Exponent)}, + {"Modulus", Convert.ToBase64String(parameters.Modulus)}, + {"P", Convert.ToBase64String(parameters.P)}, + {"Q", Convert.ToBase64String(parameters.Q)} + } + } + }; + + if (persistKey) + { + File.WriteAllText(filename, jObject.ToString()); + } + return builder.AddSigningCredential(key, signingAlgorithm); + } + } } -} \ No newline at end of file +} diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index 95c8eec537..01001aeb35 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -67,7 +67,7 @@ namespace Volo.Abp.IdentityServer if (builderOptions.AddDeveloperSigningCredential) { - identityServerBuilder = identityServerBuilder.AddDeveloperSigningCredential(); + identityServerBuilder = identityServerBuilder.AddAbpDeveloperSigningCredential(); } identityServerBuilder.AddAbpIdentityServer(builderOptions);