コード例 #1
0
ファイル: IManageProvider.cs プロジェクト: xiawei666/X
        /// <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());
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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;
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
        private static String GetCookieKey(IManageProvider provider)
        {
            var key = (provider as DefaultManageProvider)?.CookieKey;

            if (key.IsNullOrEmpty())
            {
                key = "cube_user";
            }

            return(key);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
            }
        }
コード例 #9
0
        /// <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)
                });
            }
        }
コード例 #10
0
        /// <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;
        }
コード例 #11
0
        /// <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);
            }
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
 /// <summary>实例化</summary>
 /// <param name="provider"></param>
 public UserModule(IManageProvider provider) => Provider = provider;
コード例 #14
0
 /// <summary>实例化</summary>
 /// <param name="manageProvider"></param>
 public IndexController(IManageProvider manageProvider) => _Provider = manageProvider;
コード例 #15
0
 /// <summary>实例化</summary>
 /// <param name="manageProvider"></param>
 public IndexController(IManageProvider manageProvider, IApplicationLifetime appLifetime
                        , ILogger <IndexController> logger)
 {
     _provider            = manageProvider;
     _applicationLifetime = appLifetime;
 }
コード例 #16
0
        /// <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);
        }
コード例 #17
0
        /// <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);
        }
コード例 #18
0
ファイル: UserTimeEntity.cs プロジェクト: mazhongbin/X
 /// <summary>实例化</summary>
 /// <param name="provider"></param>
 public UserModule(IManageProvider provider)
 {
     //Provider = provider ?? ManageProvider.Provider;
     Provider = provider;
 }
コード例 #19
0
ファイル: Default.aspx.cs プロジェクト: yuyu2you/X_NET20
    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
    }