diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoFacesController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoFacesController.cs index 52debc37..d20c2989 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfoFacesController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoFacesController.cs @@ -1,4 +1,5 @@ -using System.Text; +using System.Security.Cryptography; +using System.Text; using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Basic.Organization.Services; @@ -18,10 +19,12 @@ namespace Dlhis.Basic.Organization.Controllers; public class GainfoFacesController : ControllerBase { private readonly IGainfoFaceService _gainfoFaceService; + private readonly IHttpClientFactory _httpClientFactory; - public GainfoFacesController(IGainfoFaceService gainfoFaceService) + public GainfoFacesController(IGainfoFaceService gainfoFaceService, IHttpClientFactory httpClientFactory) { _gainfoFaceService = gainfoFaceService; + _httpClientFactory = httpClientFactory; } /// @@ -37,13 +40,167 @@ public class GainfoFacesController : ControllerBase [AllowAnonymous] [HttpPost("test")] - public string TestAsync(GainfoFaceValidateRequest request) + public async Task TestAsync(GainfoFaceValidateRequest request) { - HttpUtillib.SetPlatformInfo("27390082", "MLl7Dv7p5Pgc9XYI3r4O", "10.32.0.10", 443, true); + var client = _httpClientFactory.CreateClient("hik-openapi"); + var body = request.ToJson(); + var url = "/artemis/api/frs/v1/application/oneToOne"; + var key = "27390082"; + var secret = "MLl7Dv7p5Pgc9XYI3r4O"; - var r = HttpUtillib.HttpPost("/artemis/api/frs/v1/application/oneToOne", request.ToJson(), 15); - var rs = Encoding.UTF8.GetString(r); + var headers = InitRequest(url, body, key, secret); + foreach (var item in headers) + { + client.DefaultRequestHeaders.Add(item.Key, item.Value); + } - return rs; + var r = await client.PostAsync(url, new StringContent(body)); + return await r.Content.ReadAsStringAsync(); + } + + private static Dictionary InitRequest(string url, string body, string key, string secret) + { + Dictionary header = new Dictionary(); + + // Accept + header.Add("Accept", "application/json"); + + // ContentType + header.Add("Content-Type", "application/json"); + + //if POST content-md5,be careful it must be lower case. + string contentMd5 = computeContentMd5(body); + header.Add("content-md5", contentMd5); + + // x-ca-timestamp + string timestamp = ((DateTime.Now.Ticks - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 1000).ToString(); + header.Add("x-ca-timestamp", timestamp); + + // x-ca-nonce + string nonce = System.Guid.NewGuid().ToString(); + header.Add("x-ca-nonce", nonce); + + // x-ca-key + header.Add("x-ca-key", key); + + // build string to sign + string strToSign = buildSignString("POST", url, header); + string signedStr = computeForHMACSHA256(strToSign, secret); + + // x-ca-signature + header.Add("x-ca-signature", signedStr); + + return header; + } + + /// + /// 计算content-md5 + /// + /// + /// base64后的content-md5 + private static string computeContentMd5(string body) + { + MD5 md5 = new MD5CryptoServiceProvider(); + byte[] result = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(body)); + return Convert.ToBase64String(result); + } + + /// + /// 计算HMACSHA265 + /// + /// 待计算字符串 + /// 平台APPSecet + /// HMAXH265计算结果字符串 + private static string computeForHMACSHA256(string str, string secret) + { + var encoder = new System.Text.UTF8Encoding(); + byte[] secretBytes = encoder.GetBytes(secret); + byte[] strBytes = encoder.GetBytes(str); + var opertor = new HMACSHA256(secretBytes); + byte[] hashbytes = opertor.ComputeHash(strBytes); + return Convert.ToBase64String(hashbytes); + } + + /// + /// 计算签名字符串 + /// + /// HTTP请求方法,如“POST” + /// 接口Url,如/artemis/api/resource/v1/org/advance/orgList + /// 请求头 + /// 签名字符串 + private static string buildSignString(string method, string url, Dictionary header) + { + StringBuilder sb = new StringBuilder(); + sb.Append(method.ToUpper()).Append("\n"); + if (null != header) + { + if (null != header["Accept"]) + { + sb.Append((string)header["Accept"]); + sb.Append("\n"); + } + + if (header.Keys.Contains("Content-MD5") && null != header["Content-MD5"]) + { + sb.Append((string)header["Content-MD5"]); + sb.Append("\n"); + } + + if (null != header["Content-Type"]) + { + sb.Append((string)header["Content-Type"]); + sb.Append("\n"); + } + + if (header.Keys.Contains("Date") && null != header["Date"]) + { + sb.Append((string)header["Date"]); + sb.Append("\n"); + } + } + + // build and add header to sign + string signHeader = buildSignHeader(header); + sb.Append(signHeader); + sb.Append(url); + return sb.ToString(); + } + + /// + /// 计算签名头 + /// + /// 请求头 + /// 签名头 + private static string buildSignHeader(Dictionary header) + { + Dictionary sortedDicHeader = new Dictionary(); + sortedDicHeader = header; + var dic = from objDic in sortedDicHeader orderby objDic.Key ascending select objDic; + + StringBuilder sbSignHeader = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + foreach (KeyValuePair kvp in dic) + { + if (kvp.Key.Replace(" ", "").Contains("x-ca-")) + { + sb.Append(kvp.Key + ":"); + if (!string.IsNullOrWhiteSpace(kvp.Value)) + { + sb.Append(kvp.Value); + } + + sb.Append("\n"); + if (sbSignHeader.Length > 0) + { + sbSignHeader.Append(","); + } + + sbSignHeader.Append(kvp.Key); + } + } + + header.Add("x-ca-signature-headers", sbSignHeader.ToString()); + + return sb.ToString(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Program.cs b/Src/Dlhis.Basic/Program.cs index 62899522..c14f1165 100644 --- a/Src/Dlhis.Basic/Program.cs +++ b/Src/Dlhis.Basic/Program.cs @@ -23,5 +23,18 @@ public class Startup : DefaultStartup { base.ConfigureServices(services); services.AddRedis(); + + services.AddHttpClient("hik-openapi") + .ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://10.32.0.10"); }) + .ConfigurePrimaryHttpMessageHandler(() => + { + var handler = new HttpClientHandler + { + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (_, _, _, _) => true + }; + + return handler; + }); } } \ No newline at end of file