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
}
}