Files
HTCloud/HT.Cloud.Web/Filter/LoginFilterAttribute.cs

104 lines
3.2 KiB
C#
Raw Normal View History

2023-03-03 16:07:50 +08:00
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using HT.Cloud.Code;
using HT.Cloud.Service.SystemOrganize;
namespace HT.Cloud.Web
{
/// <summary>
/// 验证token
/// </summary>
public class LoginFilterAttribute : ActionFilterAttribute
{
private readonly bool _needLogin;
/// <summary>
/// 登录特性
/// </summary>
/// <param name="needLogin">是否验证</param>
public LoginFilterAttribute(bool needLogin = true)
{
_needLogin = needLogin;
}
/// <summary>
/// 验证
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Stopwatch sw = new Stopwatch();
sw.Start();
string token = context.HttpContext.Request.Headers[GlobalContext.SystemConfig.TokenName].ParseToString();
OperatorModel user = OperatorProvider.Provider.GetCurrent();
var description =
(Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;
//添加有允许匿名的Action可以不用登录访问如Login/Index
//控制器整体忽略或者单独方法忽略
var anonymous = description.ControllerTypeInfo.GetCustomAttribute(typeof(AllowAnonymousAttribute));
var methodanonymous = description.MethodInfo.GetCustomAttribute(typeof(AllowAnonymousAttribute));
if (user != null && RoleAuthorize())
{
//延长过期时间
int LoginExpire = GlobalContext.SystemConfig.LoginExpire;
string cacheKeyOperator = GlobalContext.SystemConfig.ProjectPrefix + "_operator_";// +登录者token
await CacheHelper.ExpireAsync(cacheKeyOperator + token, LoginExpire);
await CacheHelper.ExpireAsync(cacheKeyOperator + "api_" + user.UserId, LoginExpire);
// 根据传入的Token添加token和客户参数
if (context.ActionArguments != null && context.ActionArguments.Count > 0)
{
PropertyInfo property = context.ActionArguments.First().Value.GetType().GetProperty("Token");
if (property != null)
{
property.SetValue(context.ActionArguments.First().Value, token, null);
}
switch (context.HttpContext.Request.Method.ToUpper())
{
case "GET":
break;
case "POST":
property = context.ActionArguments.First().Value.GetType().GetProperty("CustomerId");
if (property != null)
{
property.SetValue(context.ActionArguments.First().Value, user.UserId, null);
}
break;
}
}
}
else if (anonymous == null && methodanonymous == null && _needLogin)
{
AlwaysResult obj = new AlwaysResult();
obj.message = "抱歉,没有操作权限";
obj.state = ResultType.error.ToString();
context.Result = new JsonResult(obj);
return;
}
var resultContext = await next();
sw.Stop();
}
private bool RoleAuthorize()
{
try
{
return GlobalContext.GetRequiredService<RoleAuthorizeService>().RoleValidate().GetAwaiter().GetResult();
}
catch (System.Exception ex)
{
LogHelper.WriteWithTime(ex);
return false;
}
}
}
}