using LiveForum.Code.Base;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System.Security.Cryptography;
using System.Text;
namespace LiveForum.Code.MiddlewareExtend
{
///
/// 参数请求加密验证
///
public class SignBaseMiddleware
{
private readonly RequestDelegate _next;
private const string FixedString = "LiveForum"; // 固定字符串
public SignBaseMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// 读取请求体
context.Request.EnableBuffering(); // 启用请求流的多次读取功能
var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
context.Request.Body.Position = 0; // 重置请求体的位置
if (string.IsNullOrEmpty(requestBody))
{
await _next(context);
return;
}
// 解析请求体为 JSON 对象
var requestJson = JObject.Parse(requestBody);
// 获取请求中的 sign 值
var requestSign = requestJson["sign"]?.ToString();
if (string.IsNullOrEmpty(requestSign))
{
await _next(context);
return;
}
// 获取所有的键值对,并排序
var sortedKeys = requestJson.Properties()
.Where(p => p.Name != "sign")
.OrderBy(p => p.Name)
.Select(p => p.Value.ToString())
.ToList();
// 拼接所有的值,并加上固定字符串
var concatenatedValues = string.Join("", sortedKeys) + FixedString;
// 计算 MD5 哈希值
var md5Hash = ComputeMD5Hash(concatenatedValues);
// 验证 MD5 哈希值与请求中的 sign 是否匹配
if (md5Hash != requestSign)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
// 返回 500 错误
context.Response.StatusCode = 500;
BaseResponse