MyAuthorizeAttribute.cs 3.7 KB

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