using System.Text; using System.Web; using Common; using Extensions; using Infrastructure; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Services; //本命名空间暂时先不改,改动比较大2023年9月2日 namespace Filters { /// /// public class AuthorizationFilter : IAuthorizationFilter { public AuthorizationFilter() { } /// /// /// public void OnAuthorization(AuthorizationFilterContext context) { var request = context.HttpContext.Request; string content = ""; if(context.HttpContext.Request.Method.ToLower() == "get") { content = context.HttpContext.GetQueryString(); content = GetParam(content); if(!string.IsNullOrEmpty(content)) { Dictionary dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(content); string queryString = ""; var parameters = context.ActionDescriptor.Parameters; foreach(var parameter in parameters) { string parameterName = parameter.Name; Type objectType = parameter.ParameterType; if(objectType.FullName != "System.String") { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(objectType); var entry = assembly.CreateInstance(objectType.FullName); Type type = entry.GetType(); System.Reflection.PropertyInfo[] propertyInfos = type.GetProperties(); for (int i = 0; i < propertyInfos.Length; i++) { foreach (string key in dic.Keys) { if (propertyInfos[i].Name == key) { object value = dic[key]; string ParameterType = propertyInfos[i].GetMethod.ReturnParameter.ParameterType.Name; if (ParameterType == "Int32") { if(value == null || value == "") value = "0"; value = Convert.ToInt32(value); } else if (ParameterType == "Decimal") { if(value == null || value == "") value = "0"; value = Convert.ToDecimal(value); } else if (ParameterType == "Int64[]") { value = Tools.SpitLongArrary(Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'), ','); } else if (ParameterType == "Int32[]") { value = Tools.SpitIntArrary(Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'), ','); } else if (ParameterType == "List`1") { string val = Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'); value = Tools.SpitLongArrary(val, ',').ToList(); } if(value.ToString() == "-1") value = -1; if(value.ToString() == "[]") value = ""; queryString += key + "=" + value.ToString() + "&"; break; } } } } } request.QueryString = new QueryString("?" + queryString.TrimEnd('&')); } } else if(context.HttpContext.Request.Method.ToLower() == "delete") { string path = request.Path.Value; string value = path.Substring(path.LastIndexOf("/") + 1); path = path.Substring(0, path.LastIndexOf("/") + 1); path += value; request.Path = new PathString(path); request.RouteValues["id"] = value; } else { content = context.HttpContext.GetBody(); if(!string.IsNullOrEmpty(content)) { Dictionary dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(content); string queryString = "{"; var parameters = context.ActionDescriptor.Parameters; foreach(var parameter in parameters) { string parameterName = parameter.Name; Type objectType = parameter.ParameterType; if(objectType.FullName != "System.String") { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(objectType); var entry = assembly.CreateInstance(objectType.FullName); Type type = entry.GetType(); System.Reflection.PropertyInfo[] propertyInfos = type.GetProperties(); for (int i = 0; i < propertyInfos.Length; i++) { foreach (string key in dic.Keys) { if (propertyInfos[i].Name == key) { object value = dic[key]; string ParameterType = propertyInfos[i].GetMethod.ReturnParameter.ParameterType.Name; if (ParameterType == "Int32") { if(value == null || value == "") value = "0"; value = Convert.ToInt32(value); } else if (ParameterType == "Decimal") { if(value == null || value == "") value = "0"; value = Convert.ToDecimal(value); } else if (ParameterType == "Int64[]") { value = Tools.SpitLongArrary(Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'), ','); } else if (ParameterType == "Int32[]") { value = Tools.SpitIntArrary(Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'), ','); } else if (ParameterType == "List`1") { string val = Newtonsoft.Json.JsonConvert.SerializeObject(value).Replace("[", "").Replace("]", "").Trim('"'); value = Tools.SpitLongArrary(val, ',').ToList(); } if(value.ToString() == "-1") value = -1; if(value.ToString() == "[]") value = ""; queryString += "\"" + key + "\":\"" + value.ToString() + "\","; break; } } } } } queryString = queryString.TrimEnd(','); queryString += "}"; request.Body = new MemoryStream(Encoding.UTF8.GetBytes(queryString)); } } } // public string Decrypt(string str) // { // str = str.Trim('"'); // str = Encoding.UTF8.GetString(Convert.FromBase64String(str)); // return Dbconn.AesDecrypt(str, Base.GlobalConstant.ApiKey, Base.GlobalConstant.ApiIv); // } public string GetParam(string content) { string result = "{"; if(content.StartsWith("?")) content = content.Substring(1); string[] data = content.Split('&'); foreach(string sub in data) { string[] subData = sub.Split('='); result += "\"" + subData[0] + "\":\"" + subData[1] + "\","; } result += "}"; return result; } } }