MyAuthorizeAttribute.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using Masuit.MyBlogs.Core.Configs;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.Filters;
  5. using System.Web;
  6. namespace Masuit.MyBlogs.Core.Extensions;
  7. /// <summary>
  8. /// 授权验证过滤器
  9. /// </summary>
  10. public sealed class MyAuthorizeAttribute : ActionFilterAttribute
  11. {
  12. /// <summary>在执行操作方法之前由 ASP.NET MVC 框架调用。</summary>
  13. /// <param name="filterContext">筛选器上下文。</param>
  14. public override void OnActionExecuting(ActionExecutingContext filterContext)
  15. {
  16. if (filterContext.ActionDescriptor.EndpointMetadata.OfType<AllowAnonymousAttribute>().Any())
  17. {
  18. return;
  19. }
  20. #if !DEBUG
  21. var user = filterContext.HttpContext.Session.Get<UserInfoDto>(SessionKey.UserInfo);
  22. if (user?.IsAdmin == true)
  23. {
  24. return;
  25. }
  26. //先尝试自动登录
  27. if (filterContext.HttpContext.Request.Cookies.Any(x => x.Key == "username" || x.Key == "password"))
  28. {
  29. string name = filterContext.HttpContext.Request.Cookies["username"] ?? "";
  30. string pwd = filterContext.HttpContext.Request.Cookies["password"]?.DesDecrypt(AppConfig.BaiduAK) ?? "";
  31. var userInfo = filterContext.HttpContext.RequestServices.GetRequiredService<IUserInfoService>().Login(name, pwd);
  32. if (userInfo != null)
  33. {
  34. filterContext.HttpContext.Response.Cookies.Append("username", name, new CookieOptions()
  35. {
  36. Expires = DateTime.Now.AddYears(1),
  37. SameSite = SameSiteMode.Lax
  38. });
  39. filterContext.HttpContext.Response.Cookies.Append("password", filterContext.HttpContext.Request.Cookies["password"], new CookieOptions()
  40. {
  41. Expires = DateTime.Now.AddYears(1),
  42. SameSite = SameSiteMode.Lax
  43. });
  44. filterContext.HttpContext.Session.Set(SessionKey.UserInfo, userInfo);
  45. }
  46. else
  47. {
  48. if (filterContext.HttpContext.Request.Method.Equals(HttpMethods.Get))
  49. {
  50. filterContext.Result = new RedirectResult("/passport/login?from=" + HttpUtility.UrlEncode(filterContext.HttpContext.Request.Path.ToString())?.Replace("#", "%23"));
  51. }
  52. else
  53. {
  54. filterContext.Result = new UnauthorizedObjectResult(new { StatusCode = 401, Success = false, IsLogin = false, Message = "未登录系统,请先登录!" });
  55. }
  56. }
  57. }
  58. else
  59. {
  60. if (filterContext.HttpContext.Request.Method.Equals(HttpMethods.Get))
  61. {
  62. filterContext.Result = new RedirectResult("/passport/login?from=" + HttpUtility.UrlEncode(filterContext.HttpContext.Request.Path.ToString()));
  63. }
  64. else
  65. {
  66. filterContext.Result = new UnauthorizedObjectResult(new { StatusCode = 401, Success = false, IsLogin = false, Message = "未登录系统,请先登录!" });
  67. }
  68. }
  69. #endif
  70. }
  71. }