AuthorizationFilter.cs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Text;
  2. using System.Web;
  3. using Common;
  4. using Extensions;
  5. using Infrastructure;
  6. using Infrastructure.Model;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.AspNetCore.Mvc.Filters;
  9. using Services;
  10. //本命名空间暂时先不改,改动比较大2023年9月2日
  11. namespace Filters
  12. {
  13. /// <summary>
  14. /// </summary>
  15. public class AuthorizationFilter : IAuthorizationFilter
  16. {
  17. private readonly ISysLoginService SysLoginService;
  18. public AuthorizationFilter(ISysLoginService sysLoginService)
  19. {
  20. this.SysLoginService = sysLoginService;
  21. }
  22. /// <summary>
  23. /// </summary>
  24. /// <param name="context"></param>
  25. public void OnAuthorization(AuthorizationFilterContext context)
  26. {
  27. var request = context.HttpContext.Request;
  28. if(!request.Path.Value.ToLower().Contains("noauth/"))
  29. {
  30. string content = "";
  31. if(context.HttpContext.Request.Method.ToLower() == "get")
  32. {
  33. content = context.HttpContext.GetQueryString();
  34. content = content.Substring(content.IndexOf("=") + 1);
  35. content = HttpUtility.UrlDecode(content);
  36. content = Decrypt(content);
  37. if(!string.IsNullOrEmpty(content))
  38. {
  39. Dictionary<string, string> dic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(content);
  40. string queryString = "";
  41. foreach(string key in dic.Keys)
  42. {
  43. queryString += key + "=" + dic[key] + "&";
  44. }
  45. request.QueryString = new QueryString("?" + queryString.TrimEnd('&'));
  46. }
  47. }
  48. else if(context.HttpContext.Request.Method.ToLower() == "delete")
  49. {
  50. string path = request.Path.Value;
  51. string value = path.Substring(path.LastIndexOf("/") + 1);
  52. path = path.Substring(0, path.LastIndexOf("/") + 1);
  53. value = Decrypt(value);
  54. path += value;
  55. request.Path = new PathString(path);
  56. request.RouteValues["id"] = value;
  57. }
  58. else
  59. {
  60. content = context.HttpContext.GetBody();
  61. content = Decrypt(content);
  62. //{"username":"admin","password":"000000"}
  63. request.Body = new MemoryStream(Encoding.UTF8.GetBytes(content));
  64. //验证登录接口
  65. if(request.Path.Value.EndsWith("/oauth2/token"))
  66. {
  67. var scope = request.Query["scope"].ToString();
  68. var grantType = request.Query["grant_type"].ToString();
  69. bool checkLogin = SysLoginService.CheckLogin(scope, grantType, context.HttpContext.GetToken().Replace("Basic ", ""));
  70. if(!checkLogin)
  71. {
  72. string msg = $"请求访问失败,无法访问系统资源";
  73. context.Result = new JsonResult(ApiResult.Error(ResultCode.DENY, msg));
  74. }
  75. }
  76. }
  77. }
  78. }
  79. public string Decrypt(string str)
  80. {
  81. str = str.Trim('"');
  82. str = Encoding.UTF8.GetString(Convert.FromBase64String(str));
  83. return Dbconn.AesDecrypt(str, Base.GlobalConstant.ApiKey, Base.GlobalConstant.ApiIv);
  84. }
  85. }
  86. }