/// <summary>设置当前用户</summary> /// <param name="provider">提供者</param> public static void SetPrincipal(this IManageProvider provider) { var ctx = HttpContext.Current; if (ctx == null) { return; } var user = provider.Current; if (user == null) { return; } var id = user as IIdentity; if (id == null) { return; } // 角色列表 var roles = new List <String>(); if (user is IUser) { roles.Add((user as IUser).RoleName); } ctx.User = new GenericPrincipal(id, roles.ToArray()); }
/// <summary>尝试登录。如果Session未登录则借助Cookie</summary> /// <param name="provider">提供者</param> /// <param name="context">Http上下文,兼容NetCore</param> public static IManageUser TryLogin(this IManageProvider provider, HttpContext context) { var serviceProvider = context?.RequestServices; // 判断当前登录用户 var user = provider.GetCurrent(serviceProvider); if (user == null) { // 尝试从Cookie登录 user = provider.LoadCookie(true, context); if (user != null) { provider.SetCurrent(user, serviceProvider); } } // 设置前端当前用户 if (user != null) { provider.SetPrincipal(serviceProvider); } return(user); }
/// <summary>设置当前用户</summary> /// <param name="provider">提供者</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SetPrincipal(this IManageProvider provider, IServiceProvider context = null) { //var ctx = context as Microsoft.AspNetCore.Http.HttpContext; var ctx = context as HttpContext ?? HttpContext.Current; if (ctx == null) { return; } var user = provider.GetCurrent(context); if (user == null) { return; } if (!(user is IIdentity id) || ctx.User?.Identity == id) { return; } // 角色列表 var roles = new List <String>(); if (user is IUser user2) { roles.AddRange(user2.Roles.Select(e => e + "")); } var up = new GenericPrincipal(id, roles.ToArray()); ctx.User = up; Thread.CurrentPrincipal = up; }
/// <summary>保存用户信息到Cookie</summary> /// <param name="provider">提供者</param> /// <param name="user">用户</param> /// <param name="expire">过期时间</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SaveCookie(this IManageProvider provider, IManageUser user, TimeSpan expire, HttpContext context) { var res = context?.Response; if (res == null) { return; } var key = "token"; if (user == null) { res.Cookies.Delete(key); } else { // 令牌有效期,默认2小时 var exp = DateTime.Now.Add(expire.TotalSeconds > 0 ? expire : TimeSpan.FromHours(2)); var jwt = GetJwt(); jwt.Subject = user.Name; jwt.Expire = exp; var token = jwt.Encode(null); var option = new CookieOptions(); if (expire.TotalSeconds > 0) { option.Expires = DateTimeOffset.Now.Add(expire); } res.Cookies.Append(key, token, option); } }
/// <summary>设置当前用户</summary> /// <param name="provider">提供者</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SetPrincipal(this IManageProvider provider, IServiceProvider context = null) { var ctx = ModelExtension.GetService <IHttpContextAccessor>(context)?.HttpContext; if (ctx == null) { return; } var user = provider.GetCurrent(context); if (user == null) { return; } if (user is not IIdentity id || ctx.User?.Identity == id) { return; } // 角色列表 var roles = new List <String>(); if (user is IUser user2) { roles.AddRange(user2.Roles.Select(e => e + "")); } var up = new GenericPrincipal(id, roles.ToArray()); ctx.User = up; Thread.CurrentPrincipal = up; }
private static String GetCookieKey(IManageProvider provider) { var key = (provider as DefaultManageProvider)?.CookieKey; if (key.IsNullOrEmpty()) { key = "cube_user"; } return(key); }
/// <summary>从Cookie加载用户信息</summary> /// <param name="provider">提供者</param> /// <param name="autologin">是否自动登录</param> /// <param name="context">Http上下文,兼容NetCore</param> /// <returns></returns> public static IManageUser LoadCookie(this IManageProvider provider, Boolean autologin, HttpContext context) { var key = "token"; var req = context?.Request; var token = req?.Cookies[key]; if (token.IsNullOrEmpty()) { return(null); } var jwt = GetJwt(); if (!jwt.TryDecode(token, out var msg)) { XTrace.WriteLine("令牌无效:{0}, token={1}", msg, token); return(null); } var user = jwt.Subject; if (user.IsNullOrEmpty()) { return(null); } //// 判断有效期 //if (jwt.Expire < DateTime.Now) //{ // XTrace.WriteLine("令牌过期:{0} {1}", jwt.Expire, token); // return null; //} var u = provider.FindByName(user); if (u == null || !u.Enable) { return(null); } // 保存登录信息 if (autologin && u is IAuthUser mu) { mu.SaveLogin(null); LogProvider.Provider.WriteLog("用户", "自动登录", true, $"{user} Time={jwt.IssuedAt} Expire={jwt.Expire} Token={token}", u.ID, u + "", ip: context.GetUserHost()); } return(u); }
/// <summary>保存用户信息到Cookie</summary> /// <param name="provider">提供者</param> /// <param name="user">用户</param> /// <param name="expire">过期时间</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SaveCookie(this IManageProvider provider, IManageUser user, TimeSpan expire, HttpContext context) { var res = context?.Response; if (res == null) { return; } var key = "token"; if (user == null) { var cookie = new HttpCookie(key) { Value = null, Expires = DateTime.Now.AddDays(-1) }; res.Cookies.Set(cookie); } else { // 令牌有效期,默认2小时 var exp = DateTime.Now.Add(expire.TotalSeconds > 0 ? expire : TimeSpan.FromHours(2)); var jwt = GetJwt(); jwt.Subject = user.Name; jwt.Expire = exp; var token = jwt.Encode(null); var cookie = new HttpCookie(key) { Value = token }; if (expire.TotalSeconds > 0) { cookie.Expires = DateTime.Now.Add(expire); } res.Cookies.Set(cookie); } }
/// <summary>保存用户信息到Cookie</summary> /// <param name="provider">提供者</param> /// <param name="user">用户</param> /// <param name="expire">过期时间</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SaveCookie(this IManageProvider provider, IManageUser user, TimeSpan expire, HttpContext context) { if (context == null) { return; } var req = context.Request; var res = context.Response; if (req == null || res == null) { return; } var key = GetCookieKey(provider); if (user is IAuthUser au) { var u = HttpUtility.UrlEncode(user.Name); var p = !au.Password.IsNullOrEmpty() ? au.Password.MD5() : null; var m = new CookieModel { UserName = u, Password = p, Time = DateTime.Now, Expire = DateTime.Now.Add(expire) }; m.Write(res.Cookies, key, SysConfig.Current.InstallTime.ToFullString()); } else { res.Cookies.Append(key, "", new CookieOptions() { Expires = DateTime.Now.AddYears(-1) }); } }
/// <summary>保存用户信息到Cookie</summary> /// <param name="provider">提供者</param> /// <param name="user">用户</param> /// <param name="expire">过期时间</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SaveCookie(this IManageProvider provider, IManageUser user, TimeSpan expire, HttpContext context) { var res = context?.Response; if (res == null) { return; } var option = new CookieOptions { SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Unspecified, Secure = true }; var token = ""; if (user != null) { // 令牌有效期,默认2小时 var exp = DateTime.Now.Add(expire.TotalSeconds > 0 ? expire : TimeSpan.FromHours(2)); var jwt = GetJwt(); jwt.Subject = user.Name; jwt.Expire = exp; token = jwt.Encode(null); if (expire.TotalSeconds > 0) { option.Expires = DateTimeOffset.Now.Add(expire); } } else { option.Expires = DateTimeOffset.MinValue; } res.Cookies.Append("token", token, option); context.Items["jwtToken"] = token; }
/// <summary>保存用户信息到Cookie</summary> /// <param name="provider">提供者</param> /// <param name="user">用户</param> /// <param name="expire">过期时间</param> /// <param name="context">Http上下文,兼容NetCore</param> public static void SaveCookie(this IManageProvider provider, IManageUser user, TimeSpan expire, IServiceProvider context = null) { if (context == null) { context = HttpContext.Current; } var req = context?.GetService <HttpRequest>(); var res = context?.GetService <HttpResponse>(); if (req == null || res == null) { return; } var key = GetCookieKey(provider); //var reqcookie = req.Cookies[key]; if (user is IAuthUser au) { var u = HttpUtility.UrlEncode(user.Name); var p = !au.Password.IsNullOrEmpty() ? au.Password.MD5() : null; var m = new CookieModel { UserName = u, Password = p, Time = DateTime.Now, Expire = DateTime.Now.Add(expire) }; m.Write(res.Cookies[key], SysConfig.Current.InstallTime.ToFullString()); } else { var cookie = res.Cookies[key]; cookie.Value = null; cookie.Expires = DateTime.Now.AddYears(-1); } }
/// <summary>尝试登录。如果Session未登录则借助Cookie</summary> /// <param name="provider">提供者</param> /// <param name="context">Http上下文,兼容NetCore</param> public static IManageUser TryLogin(this IManageProvider provider, IServiceProvider context = null) { // 判断当前登录用户 var user = provider.GetCurrent(context); if (user == null) { // 尝试从Cookie登录 user = provider.LoadCookie(true, context); if (user != null) { provider.SetCurrent(user, context); } } // 设置前端当前用户 if (user != null) { provider.SetPrincipal(context); } return(user); }
/// <summary>实例化</summary> /// <param name="provider"></param> public UserModule(IManageProvider provider) => Provider = provider;
/// <summary>实例化</summary> /// <param name="manageProvider"></param> public IndexController(IManageProvider manageProvider) => _Provider = manageProvider;
/// <summary>实例化</summary> /// <param name="manageProvider"></param> public IndexController(IManageProvider manageProvider, IApplicationLifetime appLifetime , ILogger <IndexController> logger) { _provider = manageProvider; _applicationLifetime = appLifetime; }
/// <summary>从Cookie加载用户信息</summary> /// <param name="provider">提供者</param> /// <param name="autologin">是否自动登录</param> /// <param name="context">Http上下文,兼容NetCore</param> /// <returns></returns> public static IManageUser LoadCookie(this IManageProvider provider, Boolean autologin, HttpContext context) { var key = "token"; var req = context?.Request; var token = req?.Cookies[key]; // 尝试从url中获取token if (token.IsNullOrEmpty() || token.Split(".").Length != 3) { token = req?.Query["token"]; } if (token.IsNullOrEmpty() || token.Split(".").Length != 3) { token = req?.Query["jwtToken"]; } // 尝试从头部获取token if (token.IsNullOrEmpty() || token.Split(".").Length != 3) { token = req?.Headers[HeaderNames.Authorization]; } if (token.IsNullOrEmpty() || token.Split(".").Length != 3) { return(null); } token = token.Replace("Bearer ", "", StringComparison.OrdinalIgnoreCase); var jwt = GetJwt(); if (!jwt.TryDecode(token, out var msg)) { XTrace.WriteLine("令牌无效:{0}, token={1}", msg, token); return(null); } var user = jwt.Subject; if (user.IsNullOrEmpty()) { return(null); } // 判断有效期 if (jwt.Expire < DateTime.Now) { XTrace.WriteLine("令牌过期:{0} {1}", jwt.Expire, token); return(null); } var u = provider.FindByName(user); if (u == null || !u.Enable) { return(null); } // 保存登录信息。如果是json请求,不用记录自动登录 if (autologin && u is IAuthUser mu && !req.IsAjaxRequest()) { mu.SaveLogin(null); LogProvider.Provider.WriteLog("用户", "自动登录", true, $"{user} Time={jwt.IssuedAt} Expire={jwt.Expire} Token={token}", u.ID, u + "", ip: context.GetUserHost()); } return(u); }
/// <summary>从Cookie加载用户信息</summary> /// <param name="provider">提供者</param> /// <param name="autologin">是否自动登录</param> /// <param name="context">Http上下文,兼容NetCore</param> /// <returns></returns> public static IManageUser LoadCookie(this IManageProvider provider, Boolean autologin = true, IServiceProvider context = null) { var key = GetCookieKey(provider); if (context == null) { context = HttpContext.Current; } var req = context.GetService <HttpRequest>(); var cookie = req?.Cookies[key]; if (cookie == null) { return(null); } var m = new CookieModel(); if (!m.Read(cookie, SysConfig.Current.InstallTime.ToFullString())) { return(null); } var user = HttpUtility.UrlDecode(m.UserName); //var user = HttpUtility.UrlDecode(cookie["u"]); //var pass = cookie["p"]; //var exp = cookie["e"].ToInt(-1); if (user.IsNullOrEmpty() || m.Password.IsNullOrEmpty()) { return(null); } // 判断有效期 //var expire = exp.ToDateTime(); if (m.Expire < DateTime.Now) { return(null); } var u = provider.FindByName(user); if (u == null || !u.Enable) { return(null); } var mu = u as IAuthUser; if (!m.Password.EqualIgnoreCase(mu.Password.MD5())) { return(null); } // 保存登录信息 if (autologin) { mu.SaveLogin(null); LogProvider.Provider.WriteLog("用户", "自动登录", $"{user} Time={m.Time} Expire={m.Expire}", u.ID, u + "", ip: req.RequestContext.HttpContext.GetUserHost()); } return(u); }
/// <summary>实例化</summary> /// <param name="provider"></param> public UserModule(IManageProvider provider) { //Provider = provider ?? ManageProvider.Provider; Provider = provider; }
protected override void OnPreLoad(EventArgs e) { base.OnPreLoad(e); IManageUser user = ManageProvider.Provider.Current; if (user == null) { Response.Redirect("Login.aspx"); } IManageProvider provider = ManageProvider.Provider; IMenu root = ManageProvider.Menu.Root; IUser admin = user as IUser; if (admin == null) { if (root != null) { Menus = root.Childs; //menuItem.DataSource = root.Childs; //menuItem.DataBind(); } return; } if (Request["act"] == "logout") { admin.Logout(); // 再跳一次,除去Url中的尾巴 if (!String.IsNullOrEmpty(Request.Url.Query)) { Response.Redirect("Default.aspx"); } } if (admin.Role != null) { //List<IMenu> list = admin.Role.GetMySubMenus(root.ID); IList <IMenu> list = ManageProvider.Menu.GetMySubMenus(root.ID); Menus = list; //menuItem.DataSource = list; //menuItem.DataBind(); if (list != null && list.Count > 0) { IMenu first = list[0]; DefaultLeft = String.Format("Frame/Left.aspx?ID={0}", first.ID); if (!String.IsNullOrEmpty(first.Url)) { DefaultMain = first.Url; } } } #region 自动修正菜单 // 自动修正菜单中英文 if (root != null) { using (EntityTransaction trans = new EntityTransaction(EntityFactory.CreateOperate(root.GetType()))) { //root.CheckMenuName("Admin", "管理平台") // .CheckMenuName(@"Admin\Sys", "系统管理") // .CheckMenuName(@"Admin\Advance", "高级设置") // .CheckMenuName(@"Admin\Help", "帮助手册"); // 自动挂载Main.aspx IMenu menu = root.FindByPath("Admin"); if (menu != null && menu.Url == "../Admin/Default.aspx") { menu.Url = "../Admin/Main.aspx"; menu.Save(); } if (menu == null) { menu = root; } if (menu != null) { #region 自动排序 IMenu menu2 = menu.FindByPath("Sys"); if (menu2 != null) { menu2.Sort = 3; menu2.Save(); } menu2 = menu.FindByPath("Advance"); if (menu2 != null) { menu2.Sort = 2; menu2.Save(); } menu2 = menu.FindByPath("Help"); if (menu2 != null) { menu2.Sort = 1; menu2.Save(); } #endregion } trans.Commit(); } } #endregion }