Merge pull request #164 from hudingwen/master

PR
This commit is contained in:
ansonzhang 2021-02-22 09:34:20 +08:00 committed by GitHub
commit 622fb24de6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 1068 additions and 75 deletions

View File

@ -185,11 +185,11 @@ namespace Blog.Core
app.UseAuthentication();
// 然后是授权中间件
app.UseAuthorization();
//开启性能分析
app.UseMiniProfilerMildd();
// 开启异常中间件,要放到最后
//app.UseExceptionHandlerMidd();
// 性能分析
app.UseMiniProfiler();
app.UseEndpoints(endpoints =>
{

View File

@ -1,4 +1,5 @@
{
"urls": "http://*:8081",//web
"Logging": {
"LogLevel": {
"Default": "Information", //Defaultlog4net
@ -149,6 +150,9 @@
},
"RedisMq": {
"Enabled": false //redis
},
"MiniProfiler": {
"Enabled": false //
}
},
"Middleware": {

View File

@ -15,6 +15,7 @@
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="RestSharp" Version="106.11.7" />
<PackageReference Include="RSAExtensions" Version="1.0.3" />
<PackageReference Include="StackExchange.Redis" Version="2.1.58" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" />

View File

@ -0,0 +1,527 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Web;
namespace Blog.Core.Common
{
/// <summary>
/// 建行支付助手(根据官方提供的dll反编译过来的)
/// </summary>
public class CCBPayUtil
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
public string makeCCBParam(string param, string pubkey)
{
string text = this.dicSort(param);
text += this.MD5KEY;
string str = new MessageDigest_MD5().Md5_32(text);
param = param + "&SIGN=" + str;
if (pubkey.Length >= 30)
{
pubkey = pubkey.Substring(pubkey.Length - 30);
}
if (pubkey.Length >= 8)
{
pubkey = pubkey.Substring(0, 8);
}
string text2 = new DES_ENCRY_DECRY().doEncrypt(param, pubkey);
text2 = text2.Replace("+", ",");
return HttpUtility.UrlEncode(text2, Encoding.GetEncoding("ISO-8859-1"));
}
// Token: 0x06000002 RID: 2 RVA: 0x00002104 File Offset: 0x00000304
public bool verifyNotifySign(string src, string sign, string pubKey)
{
return new RSASign().verifySigature(src, sign, pubKey);
}
// Token: 0x06000003 RID: 3 RVA: 0x00002124 File Offset: 0x00000324
private string dicSort(string param)
{
return this.GetSignContent(this.strToMap(param));
}
// Token: 0x06000004 RID: 4 RVA: 0x00002144 File Offset: 0x00000344
private IDictionary<string, string> strToMap(string param)
{
IDictionary<string, string> dictionary = new Dictionary<string, string>();
string[] array = param.Split(new char[]
{
'&'
});
for (int i = 0; i < array.Length; i++)
{
if (!"".Equals(array[i]))
{
string[] array2 = array[i].Split(new char[]
{
'='
});
if (array2.Length == 1)
{
dictionary.Add(array2[0], "");
}
else
{
dictionary.Add(array2[0], array2[1]);
}
}
}
return dictionary;
}
// Token: 0x06000005 RID: 5 RVA: 0x000021F0 File Offset: 0x000003F0
private string GetSignContent(IDictionary<string, string> parameters)
{
IDictionary<string, string> dictionary = new SortedDictionary<string, string>(parameters);
IEnumerator<KeyValuePair<string, string>> enumerator = dictionary.GetEnumerator();
StringBuilder stringBuilder = new StringBuilder("");
while (enumerator.MoveNext())
{
KeyValuePair<string, string> keyValuePair = enumerator.Current;
string key = keyValuePair.Key;
keyValuePair = enumerator.Current;
string value = keyValuePair.Value;
if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
{
stringBuilder.Append(key).Append("=").Append(value).Append("&");
}
}
return stringBuilder.ToString().Substring(0, stringBuilder.Length - 1);
}
// Token: 0x04000001 RID: 1
private string VERSION = "1.0.0";
// Token: 0x04000002 RID: 2
private string MD5KEY = "20120315201809041004";
}
internal class RSASign
{
// Token: 0x06000007 RID: 7 RVA: 0x000022C4 File Offset: 0x000004C4
protected internal bool verifySigature(string signContent, string sign, string pubKey)
{
byte[] inArray = this.hexStrToBytes(pubKey);
pubKey = Convert.ToBase64String(inArray);
string text = "-----BEGIN PUBLIC KEY-----\r\n";
text += pubKey;
text += "-----END PUBLIC KEY-----\r\n\r\n";
byte[] sign2 = this.hexStrToBytes(sign);
byte[] bytes = Encoding.GetEncoding(RSASign.DEFAULT_CHARSET).GetBytes(signContent);
return this.RSACheckContent(bytes, sign2, text, "MD5");
}
// Token: 0x06000008 RID: 8 RVA: 0x00002330 File Offset: 0x00000530
private bool RSACheckContent(byte[] signContent, byte[] sign, string publicKeyPem, string signType)
{
bool result;
try
{
RSACryptoServiceProvider rsacryptoServiceProvider = new RSACryptoServiceProvider();
rsacryptoServiceProvider.PersistKeyInCsp = false;
RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsacryptoServiceProvider, publicKeyPem);
bool flag = rsacryptoServiceProvider.VerifyData(signContent, signType, sign);
result = flag;
}
catch
{
result = false;
}
return result;
}
// Token: 0x06000009 RID: 9 RVA: 0x0000237C File Offset: 0x0000057C
private byte[] hexStrToBytes(string s)
{
s = s.Replace(" ", "");
if (s.Length % 2 != 0)
{
s += " ";
}
byte[] array = new byte[s.Length / 2];
for (int i = 0; i < array.Length; i++)
{
array[i] = Convert.ToByte(s.Substring(i * 2, 2), 16);
}
return array;
}
// Token: 0x04000003 RID: 3
private static string DEFAULT_CHARSET = "GBK";
}
public class DES_ENCRY_DECRY
{
protected internal string doEncrypt(string param, string pubkey)
{
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
byte[] bytes = this.DESEncrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
return this.Base64Encode(bytes);
}
// Token: 0x0600001A RID: 26 RVA: 0x00002684 File Offset: 0x00000884
protected internal string doDecrypt(string param, string pubkey)
{
this.tdesKey = ((pubkey.Length > 8) ? pubkey.Substring(0, 8) : pubkey);
return this.DESDecrypt(this.UTF_16BE, param, this.ISO_8859_1, this.tdesKey);
}
// Token: 0x0600001B RID: 27 RVA: 0x000026CC File Offset: 0x000008CC
private byte[] DESEncrypt(string dataCharset, string data, string keyCharset, string key)
{
byte[] result;
try
{
byte[] bytes = Encoding.GetEncoding(keyCharset).GetBytes(key);
byte[] rgbIV = bytes;
byte[] bytes2 = Encoding.GetEncoding(dataCharset).GetBytes(data);
DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
descryptoServiceProvider.Mode = CipherMode.ECB;
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateEncryptor(bytes, rgbIV), CryptoStreamMode.Write);
cryptoStream.Write(bytes2, 0, bytes2.Length);
cryptoStream.FlushFinalBlock();
result = memoryStream.ToArray();
}
catch
{
result = null;
}
return result;
}
// Token: 0x0600001C RID: 28 RVA: 0x00002764 File Offset: 0x00000964
private string DESDecrypt(string dataCharset, string data, string keyCoding, string key)
{
string result;
try
{
byte[] bytes = Encoding.GetEncoding(keyCoding).GetBytes(key);
byte[] rgbIV = bytes;
byte[] array = this.Base64Decode(data);
DESCryptoServiceProvider descryptoServiceProvider = new DESCryptoServiceProvider();
descryptoServiceProvider.Mode = CipherMode.ECB;
descryptoServiceProvider.Padding = PaddingMode.PKCS7;
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, descryptoServiceProvider.CreateDecryptor(bytes, rgbIV), CryptoStreamMode.Write);
cryptoStream.Write(array, 0, array.Length);
cryptoStream.FlushFinalBlock();
result = Encoding.GetEncoding(dataCharset).GetString(memoryStream.ToArray());
}
catch
{
result = null;
}
return result;
}
// Token: 0x0600001D RID: 29 RVA: 0x00002800 File Offset: 0x00000A00
private string Base64Encode(byte[] bytes)
{
string result = string.Empty;
try
{
result = Convert.ToBase64String(bytes);
}
catch
{
}
return result;
}
// Token: 0x0600001E RID: 30 RVA: 0x0000283C File Offset: 0x00000A3C
private byte[] Base64Decode(string source)
{
byte[] result = null;
try
{
result = Convert.FromBase64String(source);
}
catch
{
}
return result;
}
// Token: 0x04000031 RID: 49
private string tdesKey = "12345678";
// Token: 0x04000032 RID: 50
private string UTF_16BE = "utf-16BE";
// Token: 0x04000033 RID: 51
private string ISO_8859_1 = "ISO-8859-1";
}
internal class MessageDigest_MD5
{
// Token: 0x06000020 RID: 32 RVA: 0x000028A0 File Offset: 0x00000AA0
protected internal string Md5_32(string src)
{
MD5 md = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(src);
byte[] array = md.ComputeHash(bytes);
string text = "";
for (int i = 0; i < array.Length; i++)
{
text += array[i].ToString("x2");
}
return text;
}
}
internal class RSACryptoServiceProviderExtension
{
// Token: 0x0600000C RID: 12 RVA: 0x00002408 File Offset: 0x00000608
private static void LoadPublicKeyDER(RSACryptoServiceProvider provider, byte[] DERData)
{
byte[] rsafromDER = RSACryptoServiceProviderExtension.GetRSAFromDER(DERData);
byte[] publicKeyBlobFromRSA = RSACryptoServiceProviderExtension.GetPublicKeyBlobFromRSA(rsafromDER);
provider.ImportCspBlob(publicKeyBlobFromRSA);
}
// Token: 0x0600000D RID: 13 RVA: 0x0000242C File Offset: 0x0000062C
internal static void LoadPublicKeyPEM(RSACryptoServiceProvider provider, string sPEM)
{
byte[] derfromPEM = RSACryptoServiceProviderExtension.GetDERFromPEM(sPEM);
RSACryptoServiceProviderExtension.LoadPublicKeyDER(provider, derfromPEM);
}
// Token: 0x0600000E RID: 14 RVA: 0x0000244C File Offset: 0x0000064C
private static byte[] GetPublicKeyBlobFromRSA(byte[] RSAData)
{
byte[] array = null;
uint num = 0U;
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
array = new byte[num];
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(19), RSAData, (uint)RSAData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return array;
}
// Token: 0x0600000F RID: 15 RVA: 0x000024C4 File Offset: 0x000006C4
internal static byte[] GetRSAFromDER(byte[] DERData)
{
byte[] array = null;
byte[] array2 = null;
uint num = 0U;
IntPtr zero = IntPtr.Zero;
if (!RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
array = new byte[num];
if (RSACryptoServiceProviderExtension.CryptDecodeObject((RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS)65537U, new IntPtr(8), DERData, (uint)DERData.Length, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS.NONE, array, ref num))
{
GCHandle gchandle = GCHandle.Alloc(array, GCHandleType.Pinned);
try
{
RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO cert_PUBLIC_KEY_INFO = (RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(gchandle.AddrOfPinnedObject(), typeof(RSACryptoServiceProviderExtension.CERT_PUBLIC_KEY_INFO));
array2 = new byte[cert_PUBLIC_KEY_INFO.PublicKey.cbData];
Marshal.Copy(cert_PUBLIC_KEY_INFO.PublicKey.pbData, array2, 0, array2.Length);
}
finally
{
gchandle.Free();
}
return array2;
}
throw new Win32Exception(Marshal.GetLastWin32Error());
}
// Token: 0x06000010 RID: 16 RVA: 0x000025C0 File Offset: 0x000007C0
internal static byte[] GetDERFromPEM(string sPEM)
{
uint num = 0U;
uint num2;
uint num3;
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, null, ref num, out num2, out num3))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
byte[] array = new byte[num];
if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (uint)sPEM.Length, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, array, ref num, out num2, out num3))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return array;
}
// Token: 0x06000011 RID: 17
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDestroyKey(IntPtr hKey);
// Token: 0x06000012 RID: 18
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptImportKey(IntPtr hProv, byte[] pbKeyData, uint dwDataLen, IntPtr hPubKey, uint dwFlags, ref IntPtr hKey);
// Token: 0x06000013 RID: 19
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags);
// Token: 0x06000014 RID: 20
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptAcquireContext(ref IntPtr hProv, string pszContainer, string pszProvider, RSACryptoServiceProviderExtension.CRYPT_PROVIDER_TYPE dwProvType, RSACryptoServiceProviderExtension.CRYPT_ACQUIRE_CONTEXT_FLAGS dwFlags);
// Token: 0x06000015 RID: 21
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptStringToBinary(string sPEM, uint sPEMLength, RSACryptoServiceProviderExtension.CRYPT_STRING_FLAGS dwFlags, [Out] byte[] pbBinary, ref uint pcbBinary, out uint pdwSkip, out uint pdwFlags);
// Token: 0x06000016 RID: 22
[DllImport("crypt32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDecodeObjectEx(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS dwFlags, IntPtr pDecodePara, ref byte[] pvStructInfo, ref uint pcbStructInfo);
// Token: 0x06000017 RID: 23
[DllImport("crypt32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CryptDecodeObject(RSACryptoServiceProviderExtension.CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, uint cbEncoded, RSACryptoServiceProviderExtension.CRYPT_DECODE_FLAGS flags, [In][Out] byte[] pvStructInfo, ref uint cbStructInfo);
// Token: 0x02000005 RID: 5
internal enum CRYPT_ACQUIRE_CONTEXT_FLAGS : uint
{
// Token: 0x04000005 RID: 5
CRYPT_NEWKEYSET = 8U,
// Token: 0x04000006 RID: 6
CRYPT_DELETEKEYSET = 16U,
// Token: 0x04000007 RID: 7
CRYPT_MACHINE_KEYSET = 32U,
// Token: 0x04000008 RID: 8
CRYPT_SILENT = 64U,
// Token: 0x04000009 RID: 9
CRYPT_DEFAULT_CONTAINER_OPTIONAL = 128U,
// Token: 0x0400000A RID: 10
CRYPT_VERIFYCONTEXT = 4026531840U
}
// Token: 0x02000006 RID: 6
internal enum CRYPT_PROVIDER_TYPE : uint
{
// Token: 0x0400000C RID: 12
PROV_RSA_FULL = 1U
}
// Token: 0x02000007 RID: 7
internal enum CRYPT_DECODE_FLAGS : uint
{
// Token: 0x0400000E RID: 14
NONE,
// Token: 0x0400000F RID: 15
CRYPT_DECODE_ALLOC_FLAG = 32768U
}
// Token: 0x02000008 RID: 8
internal enum CRYPT_ENCODING_FLAGS : uint
{
// Token: 0x04000011 RID: 17
PKCS_7_ASN_ENCODING = 65536U,
// Token: 0x04000012 RID: 18
X509_ASN_ENCODING = 1U
}
// Token: 0x02000009 RID: 9
internal enum CRYPT_OUTPUT_TYPES
{
// Token: 0x04000014 RID: 20
X509_PUBLIC_KEY_INFO = 8,
// Token: 0x04000015 RID: 21
RSA_CSP_PUBLICKEYBLOB = 19,
// Token: 0x04000016 RID: 22
PKCS_RSA_PRIVATE_KEY = 43,
// Token: 0x04000017 RID: 23
PKCS_PRIVATE_KEY_INFO
}
// Token: 0x0200000A RID: 10
internal enum CRYPT_STRING_FLAGS : uint
{
// Token: 0x04000019 RID: 25
CRYPT_STRING_BASE64HEADER,
// Token: 0x0400001A RID: 26
CRYPT_STRING_BASE64,
// Token: 0x0400001B RID: 27
CRYPT_STRING_BINARY,
// Token: 0x0400001C RID: 28
CRYPT_STRING_BASE64REQUESTHEADER,
// Token: 0x0400001D RID: 29
CRYPT_STRING_HEX,
// Token: 0x0400001E RID: 30
CRYPT_STRING_HEXASCII,
// Token: 0x0400001F RID: 31
CRYPT_STRING_BASE64_ANY,
// Token: 0x04000020 RID: 32
CRYPT_STRING_ANY,
// Token: 0x04000021 RID: 33
CRYPT_STRING_HEX_ANY,
// Token: 0x04000022 RID: 34
CRYPT_STRING_BASE64X509CRLHEADER,
// Token: 0x04000023 RID: 35
CRYPT_STRING_HEXADDR,
// Token: 0x04000024 RID: 36
CRYPT_STRING_HEXASCIIADDR,
// Token: 0x04000025 RID: 37
CRYPT_STRING_HEXRAW,
// Token: 0x04000026 RID: 38
CRYPT_STRING_NOCRLF = 1073741824U,
// Token: 0x04000027 RID: 39
CRYPT_STRING_NOCR = 2147483648U
}
// Token: 0x0200000B RID: 11
internal struct CRYPT_OBJID_BLOB
{
// Token: 0x04000028 RID: 40
internal uint cbData;
// Token: 0x04000029 RID: 41
internal IntPtr pbData;
}
// Token: 0x0200000C RID: 12
internal struct CRYPT_ALGORITHM_IDENTIFIER
{
// Token: 0x0400002A RID: 42
internal IntPtr pszObjId;
// Token: 0x0400002B RID: 43
internal RSACryptoServiceProviderExtension.CRYPT_OBJID_BLOB Parameters;
}
// Token: 0x0200000D RID: 13
private struct CRYPT_BIT_BLOB
{
// Token: 0x0400002C RID: 44
internal uint cbData;
// Token: 0x0400002D RID: 45
internal IntPtr pbData;
// Token: 0x0400002E RID: 46
internal uint cUnusedBits;
}
// Token: 0x0200000E RID: 14
private struct CERT_PUBLIC_KEY_INFO
{
// Token: 0x0400002F RID: 47
internal RSACryptoServiceProviderExtension.CRYPT_ALGORITHM_IDENTIFIER Algorithm;
// Token: 0x04000030 RID: 48
internal RSACryptoServiceProviderExtension.CRYPT_BIT_BLOB PublicKey;
}
}
}

View File

@ -1,20 +1,18 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Blog.Core.Common.Helper
{
/// <summary>
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密
/// RSA加解密 使用OpenSSL的公钥加密/私钥解密
/// 公私钥请使用openssl生成
/// </summary>
public class RSAHelper
{
private readonly RSA _privateKeyRsaProvider;
private readonly RSA _publicKeyRsaProvider;
public readonly RSA _privateKeyRsaProvider;
public readonly RSA _publicKeyRsaProvider;
private readonly HashAlgorithmName _hashAlgorithmName;
private readonly Encoding _encoding;
@ -59,10 +57,10 @@ namespace Blog.Core.Common.Helper
#endregion
#region 使
#region 使
/// <summary>
/// 使用公钥验
/// 使用公钥验
/// </summary>
/// <param name="data">原始数据</param>
/// <param name="sign">签名</param>
@ -80,34 +78,105 @@ namespace Blog.Core.Common.Helper
#endregion
#region
/// <summary>
/// 私钥解密(原)
/// </summary>
/// <param name="cipherText">解密字符串(base64)</param>
/// <returns></returns>
//public string Decrypt(string cipherText)
//{
// if (_privateKeyRsaProvider == null)
// {
// throw new Exception("_privateKeyRsaProvider is null");
// }
// return _encoding.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
//}
/// <summary>
/// 私钥解密(支持大量数据)
/// </summary>
/// <param name="cipherText"></param>
/// <returns></returns>
public string Decrypt(string cipherText)
{
if (_privateKeyRsaProvider == null)
{
throw new Exception("_privateKeyRsaProvider is null");
}
var bufferSize = (_privateKeyRsaProvider.KeySize / 8);
byte[] buffer = new byte[bufferSize];//待解密块
using (MemoryStream msInput = new MemoryStream(Convert.FromBase64String(cipherText)))
{
using (MemoryStream msOutput = new MemoryStream())
{
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _privateKeyRsaProvider.Decrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
msOutput.Write(encData, 0, encData.Length);
}
byte[] result = msOutput.ToArray();
return _encoding.GetString(result);
}
}
return Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
}
}
#endregion
#region
/// <summary>
/// 公钥加密(原)
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
//public string Encrypt(string text)
//{
// if (_publicKeyRsaProvider == null)
// {
// throw new Exception("_publicKeyRsaProvider is null");
// }
// return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
//}
/// <summary>
/// 公钥加密(支持大量数据)
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string Encrypt(string text)
{
if (_publicKeyRsaProvider == null)
{
throw new Exception("_publicKeyRsaProvider is null");
}
var bufferSize = (_publicKeyRsaProvider.KeySize / 8 - 11);
byte[] buffer = new byte[bufferSize];//待加密块
using (MemoryStream msInput = new MemoryStream(_encoding.GetBytes(text)))
{
using (MemoryStream msOutput = new MemoryStream())
{
int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0)
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _publicKeyRsaProvider.Encrypt(dataToEnc, RSAEncryptionPadding.Pkcs1);
msOutput.Write(encData, 0, encData.Length);
}
byte[] result = msOutput.ToArray();
return Convert.ToBase64String(result);
}
}
return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
}
#endregion
#region 使RSA实例
public RSA CreateRsaProviderFromPrivateKey(string privateKey)
/// <summary>
/// 使用私钥创建RSA实例
/// </summary>
/// <param name="privateKey"></param>
/// <returns></returns>
private RSA CreateRsaProviderFromPrivateKey(string privateKey)
{
var privateKeyBits = Convert.FromBase64String(privateKey);
@ -151,7 +220,11 @@ namespace Blog.Core.Common.Helper
#endregion
#region 使RSA实例
/// <summary>
/// 使用公钥创建RSA实例
/// </summary>
/// <param name="publicKeyString"></param>
/// <returns></returns>
public RSA CreateRsaProviderFromPublicKey(string publicKeyString)
{
// encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
@ -296,48 +369,13 @@ namespace Blog.Core.Common.Helper
}
#endregion
#region
public void test() {
//2048 公钥
string publicKey =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoQh0wEqx/R2H1v00IU12Oc30fosRC/frhH89L6G+fzeaqI19MYQhEPMU13wpeqRONCUta+2iC1sgCNQ9qGGf19yGdZUfueaB1Nu9rdueQKXgVurGHJ+5N71UFm+OP1XcnFUCK4wT5d7ZIifXxuqLehP9Ts6sNjhVfa+yU+VjF5HoIe69OJEPo7OxRZcRTe17khc93Ic+PfyqswQJJlY/bgpcLJQnM+QuHmxNtF7/FpAx9YEQsShsGpVo7JaKgLo+s6AFoJ4QldQKir2vbN9vcKRbG3piElPilWDpjXQkOJZhUloh/jd7QrKFimZFldJ1r6Q59QYUyGKZARUe0KZpMQIDAQAB";
//2048 私钥
string privateKey =
"MIIEpAIBAAKCAQEAoQh0wEqx/R2H1v00IU12Oc30fosRC/frhH89L6G+fzeaqI19MYQhEPMU13wpeqRONCUta+2iC1sgCNQ9qGGf19yGdZUfueaB1Nu9rdueQKXgVurGHJ+5N71UFm+OP1XcnFUCK4wT5d7ZIifXxuqLehP9Ts6sNjhVfa+yU+VjF5HoIe69OJEPo7OxRZcRTe17khc93Ic+PfyqswQJJlY/bgpcLJQnM+QuHmxNtF7/FpAx9YEQsShsGpVo7JaKgLo+s6AFoJ4QldQKir2vbN9vcKRbG3piElPilWDpjXQkOJZhUloh/jd7QrKFimZFldJ1r6Q59QYUyGKZARUe0KZpMQIDAQABAoIBAQCRZLUlOUvjIVqYvhznRK1OG6p45s8JY1r+UnPIId2Bt46oSLeUkZvZVeCnfq9k0Bzb8AVGwVPhtPEDh73z3dEYcT/lwjLXAkyPB6gG5ZfI/vvC/k7JYV01+neFmktw2/FIJWjEMMF2dvLNZ/Pm4bX1Dz9SfD/45Hwr8wqrvRzvFZsj5qqOxv9RPAudOYwCwZskKp/GF+L+3Ycod1Wu98imzMZUH+L5dQuDGg3kvf3ljIAegTPoqYBg0imNPYY/EGoFKnbxlK5S5/5uAFb16dGJqAz3XQCz9Is/IWrOTu0etteqV2Ncs8uqPdjed+b0j8CMsr4U1xjwPQ8WwdaJtTkRAoGBANAndgiGZkCVcc9975/AYdgFp35W6D+hGQAZlL6DmnucUFdXbWa/x2rTSEXlkvgk9X/PxOptUYsLJkzysTgfDywZwuIXLm9B3oNmv3bVgPXsgDsvDfaHYCgz0nHK6NSrX2AeX3yO/dFuoZsuk+J+UyRigMqYj0wjmxUlqj183hinAoGBAMYMOBgF77OXRII7GAuEut/nBeh2sBrgyzR7FmJMs5kvRh6Ck8wp3ysgMvX4lxh1ep8iCw1R2cguqNATr1klOdsCTOE9RrhuvOp3JrYzuIAK6MpH/uBICy4w1rW2+gQySsHcH40r+tNaTFQ7dQ1tef//iy/IW8v8i0t+csztE1JnAoGABdtWYt8FOYP688+jUmdjWWSvVcq0NjYeMfaGTOX/DsNTL2HyXhW/Uq4nNnBDNmAz2CjMbZwt0y+5ICkj+2REVQVUinAEinTcAe5+LKXNPx4sbX3hcrJUbk0m+rSu4G0B/f5cyXBsi9wFCAzDdHgBduCepxSr04Sc9Hde1uQQi7kCgYB0U20HP0Vh+TG2RLuE2HtjVDD2L/CUeQEiXEHzjxXWnhvTg+MIAnggvpLwQwmMxkQ2ACr5sd/3YuCpB0bxV5o594nsqq9FWVYBaecFEjAGlWHSnqMoXWijwu/6X/VOTbP3VjH6G6ECT4GR4DKKpokIQrMgZ9DzaezvdOA9WesFdQKBgQCWfeOQTitRJ0NZACFUn3Fs3Rvgc9eN9YSWj4RtqkmGPMPvguWo+SKhlk3IbYjrRBc5WVOdoX8JXb2/+nAGhPCuUZckWVmZe5pMSr4EkNQdYeY8kOXGSjoTOUH34ZdKeS+e399BkBWIiXUejX/Srln0H4KoHnTWgxwNpTsBCgXu8Q==";
var rsa = new RSAHelper(RSAType.RSA2, Encoding.UTF8, privateKey, publicKey);
}
string str = "博客园 http://www.cnblogs.com/";
Console.WriteLine("原始字符串:" + str);
//加密
string enStr = rsa.Encrypt(str);
Console.WriteLine("加密字符串:" + enStr);
//解密
string deStr = rsa.Decrypt(enStr);
Console.WriteLine("解密字符串:" + deStr);
//私钥签名
string signStr = rsa.Sign(str);
Console.WriteLine("字符串签名:" + signStr);
//公钥验证签名
bool signVerify = rsa.Verify(str, signStr);
Console.WriteLine("验证签名:" + signVerify);
}
#endregion
}
/// <summary>
/// RSA算法类型
/// </summary>
public enum RSAType
/// <summary>
/// RSA算法类型
/// </summary>
public enum RSAType
{
/// <summary>
/// SHA1

View File

@ -0,0 +1,385 @@
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
namespace Blog.Core.Common.Helper
{
/// <summary>
/// RSA加解密 使用OpenSSL的私钥加密/公钥解密 (一般不用)
/// 公私钥请使用openssl生成
/// </summary>
public class RSAHelperExtend
{
/// <summary>
/// 生成公钥与私钥方法
/// </summary>
/// <returns></returns>
public static string[] CreateKey(KeyType keyType)
{
string[] sKeys = new String[2];
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
switch (keyType)
{
case KeyType.XML:
{
//私钥
sKeys[0] = rsa.ToXmlString(true);
//公钥
sKeys[1] = rsa.ToXmlString(false);
}
break;
case KeyType.PKS8:
{
//JAVA私钥
sKeys[0] = RSAPrivateKeyDotNet2Java(sKeys[0]);
//JAVA公钥
sKeys[1] = RSAPublicKeyDotNet2Java(sKeys[1]);
}
break;
default:
break;
}
return sKeys;
}
/// <summary>
/// 密钥类型
/// </summary>
public enum KeyType
{
/// <summary>
/// xml类型
/// </summary>
XML,
/// <summary>
/// pks8类型
/// </summary>
PKS8
}
/// <summary>
/// RSA私钥格式转换.net->java
/// </summary>
/// <param name="privateKey">.net生成的私钥</param>
/// <returns></returns>
public static string RSAPrivateKeyDotNet2Java(string privateKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(privateKey);
BigInteger m = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger exp = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
BigInteger d = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
BigInteger p = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
BigInteger q = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
BigInteger dp = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
BigInteger dq = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
BigInteger qinv = new BigInteger(Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
return Convert.ToBase64String(serializedPrivateBytes);
}
/// <summary>
/// RSA公钥格式转换.net->java
/// </summary>
/// <param name="publicKey">.net生成的公钥</param>
/// <returns></returns>
public static string RSAPublicKeyDotNet2Java(string publicKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(publicKey);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return Convert.ToBase64String(serializedPublicBytes);
}
/// <summary>
/// RSA私钥格式转换java->.net
/// </summary>
/// <param name="privateKey">java生成的RSA私钥</param>
/// <returns></returns>
public static string RSAPrivateKeyJavaToDotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
}
/// <summary>
/// RSA公钥格式转换java->.net
/// </summary>
/// <param name="publicKey">java生成的公钥</param>
/// <returns></returns>
public static string RSAPublicKeyJavaToDotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}
/// <summary>
/// 最大加密长度
/// </summary>
private static int MAX_ENCRYPT_BLOCK = 245;
/// <summary>
/// 最大解密长度
/// </summary>
private static int MAX_DECRYPT_BLOCK = 256;
/// <summary>
/// 用私钥给数据进行RSA加密
/// </summary>
/// <param name="xmlPrivateKey"></param>
/// <param name="strEncryptString"></param>
/// <returns></returns>
public static string PrivateKeyEncrypt(string xmlPrivateKey, string strEncryptString)
{
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, xmlPrivateKey);
var xml = rs._privateKeyRsaProvider.ToXmlString(true);
MAX_ENCRYPT_BLOCK = rs._privateKeyRsaProvider.KeySize / 8 - 11;
//加载私钥
RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
privateRsa.FromXmlString(xml);
//转换密钥
AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); //使用RSA/ECB/PKCS1Padding格式
c.Init(true, keyPair.Private);//第一个参数为true表示加密为false表示解密第二个参数表示密钥
byte[] DataToEncrypt = Encoding.UTF8.GetBytes(strEncryptString);//获取字节
byte[] cache;
int time = 0;//次数
int inputLen = DataToEncrypt.Length;
int offSet = 0;
using (MemoryStream outStream = new MemoryStream())
{
while (inputLen - offSet > 0)
{
if (inputLen - offSet > MAX_ENCRYPT_BLOCK)
{
cache = c.DoFinal(DataToEncrypt, offSet, MAX_ENCRYPT_BLOCK);
}
else
{
cache = c.DoFinal(DataToEncrypt, offSet, inputLen - offSet);
}
//写入
outStream.Write(cache, 0, cache.Length);
time++;
offSet = time * MAX_ENCRYPT_BLOCK;
}
byte[] resData = outStream.ToArray();
string strBase64 = Convert.ToBase64String(resData);
return strBase64;
}
}
/// <summary>
/// 用公钥给数据进行RSA解密
/// </summary>
/// <param name="xmlPublicKey"> 公钥(XML格式字符串) </param>
/// <param name="strDecryptString"> 要解密数据 </param>
/// <returns> 解密后的数据 </returns>
public static string PublicKeyDecrypt(string xmlPublicKey, string strDecryptString)
{
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, "", xmlPublicKey);
var xml = rs._publicKeyRsaProvider.ToXmlString(false);
MAX_DECRYPT_BLOCK = rs._publicKeyRsaProvider.KeySize / 8;
//加载公钥
RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
publicRsa.FromXmlString(xml);
RSAParameters rp = publicRsa.ExportParameters(false);
//转换密钥
AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp);
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
//第一个参数为true表示加密为false表示解密第二个参数表示密钥
c.Init(false, pbk);
byte[] DataToDecrypt = Convert.FromBase64String(strDecryptString);
//byte[] outBytes = c.DoFinal(DataToDecrypt);//解密
//string strDec = Encoding.UTF8.GetString(outBytes);
byte[] cache;
int time = 0;//次数
int inputLen = DataToDecrypt.Length;
int offSet = 0;
using (MemoryStream outStream = new MemoryStream())
{
while (inputLen - offSet > 0)
{
if (inputLen - offSet > MAX_DECRYPT_BLOCK)
{
cache = c.DoFinal(DataToDecrypt, offSet, MAX_DECRYPT_BLOCK);
}
else
{
cache = c.DoFinal(DataToDecrypt, offSet, inputLen - offSet);
}
//写入
outStream.Write(cache, 0, cache.Length);
time++;
offSet = time * MAX_DECRYPT_BLOCK;
}
byte[] resData = outStream.ToArray();
string strDec = Encoding.UTF8.GetString(resData);
return strDec;
}
}
/// <summary>
/// 私钥签名
/// </summary>
/// <param name="str">需签名的数据</param>
/// <param name="privateKey">私钥</param>
/// <param name="signAlgType">hash算法</param>
/// <returns>签名后的值</returns>
public static string Sign(string str, string privateKey, SignAlgType signAlgType)
{
//根据需要加签时的哈希算法转化成对应的hash字符节
byte[] bt = Encoding.UTF8.GetBytes(str);
byte[] rgbHash = null;
switch (signAlgType)
{
case SignAlgType.SHA1:
{
var csp = new SHA1CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
case SignAlgType.SHA256:
{
var csp = new SHA256CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
case SignAlgType.MD5:
{
var csp = new MD5CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
default:
break;
}
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, privateKey);
var xml = rs._privateKeyRsaProvider.ToXmlString(true);
key.FromXmlString(xml);
RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
formatter.SetHashAlgorithm(signAlgType.ToString());//此处是你需要加签的hash算法需要和上边你计算的hash值的算法一致不然会报错。
byte[] inArray = formatter.CreateSignature(rgbHash);
return Convert.ToBase64String(inArray);
}
/// <summary>
/// 公钥验签
/// </summary>
/// <param name="str">待验证的字符串</param>
/// <param name="sign">加签之后的字符串</param>
/// <param name="publicKey">公钥</param>
/// <param name="signAlgType">hash算法</param>
/// <returns>签名是否符合</returns>
public static bool Verify(string str, string sign, string publicKey, SignAlgType signAlgType)
{
byte[] bt = Encoding.UTF8.GetBytes(str);
byte[] rgbHash = null;
switch (signAlgType)
{
case SignAlgType.SHA1:
{
var csp = new SHA1CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
case SignAlgType.SHA256:
{
var csp = new SHA256CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
case SignAlgType.MD5:
{
var csp = new MD5CryptoServiceProvider();
rgbHash = csp.ComputeHash(bt);
}
break;
default:
break;
}
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
RSAHelper rs = new RSAHelper(RSAType.RSA, Encoding.UTF8, "", publicKey);
var xml = rs._publicKeyRsaProvider.ToXmlString(false);
key.FromXmlString(xml);
RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);
deformatter.SetHashAlgorithm(signAlgType.ToString());
byte[] rgbSignature = Convert.FromBase64String(sign);
if (deformatter.VerifySignature(rgbHash, rgbSignature))
return true;
return false;
}
/// <summary>
/// 签名算法类型
/// </summary>
public enum SignAlgType
{
/// <summary>
/// sha1
/// </summary>
SHA1,
/// <summary>
/// sha256
/// </summary>
SHA256,
/// <summary>
/// md5
/// </summary>
MD5
}
}
}

View File

@ -0,0 +1,34 @@
using Blog.Core.Common;
using log4net;
using Microsoft.AspNetCore.Builder;
using System;
namespace Blog.Core.Extensions
{
/// <summary>
/// MiniProfiler性能分析
/// </summary>
public static class MiniProfilerMildd
{
private static readonly ILog log = LogManager.GetLogger(typeof(MiniProfilerMildd));
public static void UseMiniProfilerMildd(this IApplicationBuilder app)
{
if (app == null) throw new ArgumentNullException(nameof(app));
try
{
if (Appsettings.app("Startup", "MiniProfiler", "Enabled").ObjToBool())
{
// 性能分析
app.UseMiniProfiler();
}
}
catch (Exception e)
{
log.Error($"An error was reported when starting the MiniProfilerMildd.\n{e.Message}");
throw;
}
}
}
}

View File

@ -109,6 +109,16 @@ namespace Blog.Core.Extensions
ConsoleHelper.WriteSuccessLine($"IpRateLimiting: True");
}
// 性能分析
if (!Appsettings.app("Startup", "MiniProfiler", "Enabled").ObjToBool())
{
Console.WriteLine($"MiniProfiler: False");
}
else
{
ConsoleHelper.WriteSuccessLine($"MiniProfiler: True");
}
// CORS跨域
if (!Appsettings.app("Startup", "Cors", "EnableAllIPs").ObjToBool())
{
@ -116,7 +126,7 @@ namespace Blog.Core.Extensions
}
else
{
ConsoleHelper.WriteSuccessLine($"EnableAllIPs For EnableAllIPs: True");
ConsoleHelper.WriteSuccessLine($"EnableAllIPs For CORS: True");
}
// redis消息队列

View File

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Blog.Core.Common;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace Blog.Core.Extensions
@ -11,9 +12,10 @@ namespace Blog.Core.Extensions
public static void AddMiniProfilerSetup(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddMiniProfiler();
if(Appsettings.app(new string[] { "Startup", "MiniProfiler", "Enabled" }).ObjToBool())
{
services.AddMiniProfiler();
}
// 3.x使用MiniProfiler必须要注册MemoryCache服务
// services.AddMiniProfiler(options =>
// {

View File

@ -17,12 +17,5 @@
<ProjectReference Include="..\Blog.Core.IServices\Blog.Core.IServices.csproj" />
<ProjectReference Include="..\Blog.Core.Repository\Blog.Core.Repository.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="CCB_B2CPay_Util">
<HintPath>File\CCB_B2CPay_Util.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -1,11 +1,11 @@
using Blog.Core.Common.Helper;
using Blog.Core.Common;
using Blog.Core.Common.Helper;
using Blog.Core.Common.StaticHelper;
using Blog.Core.IRepository.Base;
using Blog.Core.IServices;
using Blog.Core.Model;
using Blog.Core.Model.ViewModels;
using Blog.Core.Services.BASE;
using CCB_B2CPay_Util;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
@ -277,6 +277,7 @@ namespace Blog.Core.Services
public async Task<MessageModel<PayReturnResultModel>> PayCheck(PayNeedModel payModel, int times)
{
_logger.LogInformation("轮询开始");
MessageModel<PayReturnResultModel> messageModel = new MessageModel<PayReturnResultModel>();
messageModel.response = new PayReturnResultModel();
string url = string.Empty;
@ -284,11 +285,9 @@ namespace Blog.Core.Services
string returnData = string.Empty;
try
{
//设置最大轮询次数,跟建行保持一致
int theLastTime = 6;
if (times > theLastTime)
{
throw new Exception($"轮询次数超过最大次数{theLastTime}");
}
if (times > theLastTime) throw new Exception($"轮询次数超过最大次数{theLastTime}");
string host = "https://ibsbjstar.ccb.com.cn/CCBIS/B2CMainPlat_00_BEPAY?";