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 { private readonly ISysLoginService SysLoginService; public AuthorizationFilter(ISysLoginService sysLoginService) { this.SysLoginService = sysLoginService; } /// /// /// public void OnAuthorization(AuthorizationFilterContext context) { var request = context.HttpContext.Request; if(!request.Path.Value.ToLower().Contains("noauth/")) { string content = ""; if(context.HttpContext.Request.Method.ToLower() == "get") { content = context.HttpContext.GetQueryString(); content = content.Substring(content.IndexOf("=") + 1); content = HttpUtility.UrlDecode(content); content = Decrypt(content); if(!string.IsNullOrEmpty(content)) { Dictionary dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(content); string queryString = ""; foreach(string key in dic.Keys) { queryString += key + "=" + dic[key] + "&"; } 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); value = Decrypt(value); path += value; request.Path = new PathString(path); request.RouteValues["id"] = value; } else { content = context.HttpContext.GetBody(); content = Decrypt(content); //{"username":"admin","password":"000000"} request.Body = new MemoryStream(Encoding.UTF8.GetBytes(content)); //验证登录接口 if(request.Path.Value.EndsWith("/oauth2/token")) { var scope = request.Query["scope"].ToString(); var grantType = request.Query["grant_type"].ToString(); bool checkLogin = SysLoginService.CheckLogin(scope, grantType, context.HttpContext.GetToken().Replace("Basic ", "")); if(!checkLogin) { string msg = $"请求访问失败,无法访问系统资源"; context.Result = new JsonResult(ApiResult.Error(ResultCode.DENY, msg)); } } } } } 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); } } }