Files
zszq-trs/YLErpWeb/App/Auth/ErpAuthorizeHandler.cs
T
2024-05-09 14:06:26 +08:00

109 lines
2.9 KiB
C#

using Microsoft.AspNetCore.Authorization;
using YLErp.Configuration;
namespace YLErp.Web
{
/// <summary>
///
/// </summary>
public class ErpAuthorizeHandler
{
public bool Handle(AuthorizationHandlerContext context)
{
UserInfo userInfo = null;
var userId = context.User.GetUserId();
if (userId < 1)
{
return false;
}
var userToken = "0";
var UseSingleLogin = PS.Config.UseSingleLogin;
if (UseSingleLogin)
{
userToken = context.User.GetUserToken() ?? "0";
}
userInfo = Server.CacheProvider.Get("loginUser^" + userId) as UserInfo;
if (userInfo != null)
{
if (UseSingleLogin && userInfo.UserToken != userToken)
{
return false;
}
if (context.Resource is HttpContext httpContext && httpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
return true;
}
}
if (PS.Config.Company == CompanyEnum.国泰君安 && CheckLoginTimeout(context.User.GetUserLoginTime()))
{
return false;
}
if (userInfo != null)
{
return true;
}
var predicate = PredicateBuilder.Create<SystemUser>(n => n.Id == userId);
if (UseSingleLogin && userToken != AuthHelper.JwtUserToken)
{
predicate = predicate.And(n => n.UserToken == userToken);
}
using (var db = new ErpBaseContext())
{
var dbUser = db.SystemUsers.FirstOrDefault(predicate);
if (dbUser == null)
{
return false;
}
userInfo = UserInfo.FromDbUser(dbUser);
Server.CacheProvider.SetWithSlidingExpiration("loginUser^" + dbUser.Id, userInfo, TimeSpan.FromMinutes(30));
return true;
}
}
static readonly TimeSpan NightOpenTime = new TimeSpan(20, 32, 0);
private static bool CheckLoginTimeout(DateTime createTime)
{
var now = DateTime.Now;
if (now.Hour < 8)
{
return false;
}
if (createTime.Hour < 8 || createTime.Day != now.Day)
{
return true;
}
if (now.TimeOfDay < NightOpenTime)
{
return false;
}
if (createTime.TimeOfDay < NightOpenTime)
{
return true;
}
return false;
}
public static readonly ErpAuthorizeHandler Default;
static ErpAuthorizeHandler()
{
Default = new ErpAuthorizeHandler();
}
}
}