using Microsoft.AspNetCore.Authorization; using YLErp.Configuration; namespace YLErp.Web { /// /// /// 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(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(); } } }