using Masuit.MyBlogs.Core.Configs; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Web; namespace Masuit.MyBlogs.Core.Extensions; /// /// 授权验证过滤器 /// public sealed class MyAuthorizeAttribute : ActionFilterAttribute { /// 在执行操作方法之前由 ASP.NET MVC 框架调用。 /// 筛选器上下文。 public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.ActionDescriptor.EndpointMetadata.OfType().Any()) { return; } #if !DEBUG var user = filterContext.HttpContext.Session.Get(SessionKey.UserInfo); if (user?.IsAdmin == true) { return; } //先尝试自动登录 if (filterContext.HttpContext.Request.Cookies.Any(x => x.Key == "username" || x.Key == "password")) { string name = filterContext.HttpContext.Request.Cookies["username"] ?? ""; string pwd = filterContext.HttpContext.Request.Cookies["password"]?.DesDecrypt(AppConfig.BaiduAK) ?? ""; var userInfo = filterContext.HttpContext.RequestServices.GetRequiredService().Login(name, pwd); if (userInfo != null) { filterContext.HttpContext.Response.Cookies.Append("username", name, new CookieOptions() { Expires = DateTime.Now.AddYears(1), SameSite = SameSiteMode.Lax }); filterContext.HttpContext.Response.Cookies.Append("password", filterContext.HttpContext.Request.Cookies["password"], new CookieOptions() { Expires = DateTime.Now.AddYears(1), SameSite = SameSiteMode.Lax }); filterContext.HttpContext.Session.Set(SessionKey.UserInfo, userInfo); } else { if (filterContext.HttpContext.Request.Method.Equals(HttpMethods.Get)) { filterContext.Result = new RedirectResult("/passport/login?from=" + HttpUtility.UrlEncode(filterContext.HttpContext.Request.Path.ToString())?.Replace("#", "%23")); } else { filterContext.Result = new UnauthorizedObjectResult(new { StatusCode = 401, Success = false, IsLogin = false, Message = "未登录系统,请先登录!" }); } } } else { if (filterContext.HttpContext.Request.Method.Equals(HttpMethods.Get)) { filterContext.Result = new RedirectResult("/passport/login?from=" + HttpUtility.UrlEncode(filterContext.HttpContext.Request.Path.ToString())); } else { filterContext.Result = new UnauthorizedObjectResult(new { StatusCode = 401, Success = false, IsLogin = false, Message = "未登录系统,请先登录!" }); } } #endif } }