From 43c7bfcb1d683cfcefe15c07aea99921e2aa18e6 Mon Sep 17 00:00:00 2001
From: hwh <332078369@qq.com>
Date: 星期三, 19 六月 2024 16:52:02 +0800
Subject: [PATCH] 验签

---
 Wms/Utility/Filter/ApiSignatureVerificationAttribute.cs |   89 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 89 insertions(+), 0 deletions(-)

diff --git a/Wms/Utility/Filter/ApiSignatureVerificationAttribute.cs b/Wms/Utility/Filter/ApiSignatureVerificationAttribute.cs
new file mode 100644
index 0000000..dc85ffb
--- /dev/null
+++ b/Wms/Utility/Filter/ApiSignatureVerificationAttribute.cs
@@ -0,0 +1,89 @@
+锘縰sing Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Utility.Tools;
+using static System.Net.Mime.MediaTypeNames;
+
+namespace Utility
+{
+    /// <summary>
+    /// 楠岀
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
+    public class VerificationAttribute : ActionFilterAttribute
+    {
+        private static readonly string appKey = "signature";//鍚庨潰鏀规垚鎷块厤缃枃浠剁殑
+        private static readonly double Minutes = 5;//鏃堕棿鎴冲繀椤�5鍒嗛挓鍐呯殑锛屽惁鍒欎笉閫氳繃
+        public VerificationAttribute()
+        {
+
+        }
+
+        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+        {
+            var request = context.HttpContext.Request;
+
+            // 鑾峰彇璇锋眰涓殑鏃堕棿鎴冲拰绛惧悕
+            var timestamp = request.Headers["Timestamp"].FirstOrDefault();
+            var signature = request.Headers["Signature"].FirstOrDefault();
+
+            if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(signature))
+            {
+                context.Result = new UnauthorizedResult();
+                return;
+            }
+
+            // 楠岃瘉鏃堕棿鎴虫槸鍚﹀湪鍏佽鐨勬椂闂磋寖鍥村唴
+            if (!IsTimestampValid(timestamp))
+            {
+                context.Result = new UnauthorizedResult();
+                return;
+            }
+
+            // 璇诲彇璇锋眰浣撲腑鐨� JSON 鍙傛暟
+            string jsonParams;
+            using (var reader = new System.IO.StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
+            {
+                char[] buffer = new char[500];
+                int bytesRead = await reader.ReadAsync(buffer, 0, buffer.Length);
+                jsonParams = new string(buffer, 0, bytesRead);
+            }
+
+            // 鏋勫缓寰呯鍚嶅瓧绗︿覆
+            var signatureBaseString = appKey + jsonParams + timestamp;
+
+            // 璁$畻 MD5 鍊�
+            var computedSignature = Md5Tools.CalcMd5(Encoding.UTF8.GetBytes(signatureBaseString));
+
+            // 楠岃瘉绛惧悕
+            if (computedSignature != signature)
+            {
+                context.Result = new UnauthorizedResult();
+                return;
+            }
+
+            await base.OnActionExecutionAsync(context, next);
+        }
+
+        private bool IsTimestampValid(string timestamp)
+        {
+            if (long.TryParse(timestamp, out var timestampSeconds))
+            {
+                var requestDateTime = DateTimeOffset.FromUnixTimeSeconds(timestampSeconds);
+                var currentDateTime = DateTimeOffset.UtcNow;
+
+                // 璁$畻鏃堕棿宸�
+                var timeDifference = currentDateTime - requestDateTime;
+
+                // 姣旇緝鏃堕棿宸槸鍚﹀湪鍏佽鐨勮寖鍥村唴
+                return timeDifference.TotalMinutes <= 5;
+            }
+
+            return false;
+        }
+    }
+}

--
Gitblit v1.8.0