using EntrustSettle.Common; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using System; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EntrustSettle.Extensions { /// /// 自定义中间件 /// 通过配置,对指定接口返回数据进行加密返回 /// 可过滤文件流 /// public class EncryptionRequestMiddleware { private readonly RequestDelegate _next; public EncryptionRequestMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var a = App.User.IsAuthenticated(); var b = App.User.ID; // 配置开关,过滤接口 if (AppSettings.app("Middleware", "EncryptionRequest", "Enabled").ObjToBool()) { var isAllApis = AppSettings.app("Middleware", "EncryptionRequest", "AllApis").ObjToBool(); var needEnApis = AppSettings.app("Middleware", "EncryptionRequest", "LimitApis"); var path = context.Request.Path.Value.ToLower(); if (isAllApis || (path.Length > 5 && needEnApis.Any(d => d.ToLower().Contains(path)))) { Console.WriteLine($"{isAllApis} -- {path}"); if (context.Request.Method.ToLower() == "post") { // 读取请求主体 using StreamReader reader = new(context.Request.Body, Encoding.UTF8); string requestBody = await reader.ReadToEndAsync(); // 检查是否有要解密的数据 if (!string.IsNullOrEmpty(requestBody) && context.Request.Headers.ContainsKey("Content-Type") && context.Request.Headers["Content-Type"].ToString().ToLower().Contains("application/json")) { // 解密数据 string decryptedString = DecryptData(requestBody); // 更新请求主体中的数据 context.Request.Body = GenerateStreamFromString(decryptedString); } } else if (context.Request.Method.ToLower() == "get") { // 获取url参数 string param = context.Request.Query["param"]; // 检查是否有要解密的数据 if (!string.IsNullOrEmpty(param)) { // 解密数据 string decryptedString = DecryptData(param); // 更新url参数值 context.Request.QueryString = new QueryString($"?{decryptedString}"); } } await _next(context); } else { await _next(context); } } else { await _next(context); } } private string DecryptData(string encryptedData) { // 解密逻辑实现,可以根据你使用的加密算法和密钥进行自定义 byte[] bytes = Convert.FromBase64String(encryptedData); string originalString = Encoding.UTF8.GetString(bytes); Console.WriteLine(originalString); return originalString; } private static Stream GenerateStreamFromString(string s) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; } } public static class EncryptionRequestExtensions { /// /// 自定义中间件 /// 通过配置,对指定接口入参进行解密操作 /// 注意:放到管道最外层 /// public static IApplicationBuilder UseEncryptionRequest(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } }