Files
HTCloud/HT.Cloud.Web/Filter/LoginFilterAttribute.cs
2023-03-03 16:07:50 +08:00

104 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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