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;
}
}
}