无味无感 2023-01-31 17:32 采纳率: 50%
浏览 17

seesion取值问题

根据客户需求我们已经做了一个对应的系统;这个时候客户另一个供应商也开发了一个系统,但是他们要嵌入我们的页面,这里就有个保存用户信息的问题
因为系统是asp.net mvc框架(.net framework 4.5),我们自己系统里面保存用户信息的方式也是使用seesion;要嵌入的页面控制器权限是默认开放了,嵌入授权方式是在他们系统里面打开我们的页面地址会传一个token值,我通过token和key获取用户信息;那我的想法是两个登录方式都要使用session保存用户信息,那我提前再功能代码获取用户信息的时候使用自己的做的视图过滤器先判断一下是不是能拿到用户信息,视图执行完能拿到seesion信息就正常访问页面,拿不到就跳到错误页面
保存seesion信息
public void EmbeddedAuth(string userToken)
        {
            try
            {
                if (SessionHelper.Get("UserName") == null)
                {
                    Log.CreateLogManager().Debug("从报表链接地址获取到得userToken:" + userToken);
                    string accessKey = DataWithReportUtilities.Common.ConfigHelper.GetConfigStr("accessKey");
                    string url = DataWithReportUtilities.Common.ConfigHelper.GetConfigStr("url");
                    if (accessKey.IsStrNULL() && url.IsStrNULL())
                    {
                        AuthorizationConfiguration authorization = new AuthorizationConfiguration() { userToken = userToken, accessKey = accessKey };
                        string authorizationJson = Newtonsoft.Json.JsonConvert.SerializeObject(authorization);
                        string result = HttpUtils.DoPost(url, authorizationJson, "application/json");
                        OAResultJosn json = JsonConvert.DeserializeObject<OAResultJosn>(result);
                        if (json.code == 200)
                        {
                            OASYSTEM_USER_SESSION oASYSTEM_USER_ = new OASYSTEM_USER_SESSION();
                            oASYSTEM_USER_.adAccount = "PowerBI_FISK_1";//json.data.adAccount
                            oASYSTEM_USER_.createTime = DateTime.Now;//DateTime.Parse(json.data.createTime)
                            SessionHelper.Add("UserName", oASYSTEM_USER_.adAccount.Replace(ConfigHelper.GetConfigStr("LDADUser"), ""), 500);
                            SessionHelper.Add("UserPwd", Encryptor.AESEncrypt(oASYSTEM_USER_.adAccount), 500);
                            SessionHelper.Add("UserID", oASYSTEM_USER_.adAccount, 500);
                        }
                        else Log.CreateLogManager().Debug("嵌入式访问报表没有获取到当前用户数据!返回状态:" + json.code);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.CreateLogManager().Debug("获取嵌入式访问报表用户异常:" + ex);
            }
        }

        public void SignIn(string userAccount, string userPwd)
        {
            //创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。
            var ticket = new FormsAuthenticationTicket(2, userAccount, DateTime.Now, DateTime.Now.AddDays(1), true, "/");

            //加密Ticket,变成一个加密的字符串。
            var cookieValue = FormsAuthentication.Encrypt(ticket);

            //根据加密结果创建登录Cookie
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
            {
                HttpOnly = true,  //可以防止浏览器攻击窃取、伪造Cookie,但是客户端js无法读取到这个Cookie
                Secure = FormsAuthentication.RequireSSL,
                Domain = FormsAuthentication.CookieDomain,
                Path = FormsAuthentication.FormsCookiePath
            };
            string adnewname = ConfigHelper.GetConfigStr("LDADUser") + userAccount;
            var model = BE.System_UserInfo.Where(u => u.UserAccount == userAccount || u.AADUserAccount == userAccount || u.UserAccount == adnewname && u.Validity == "1").FirstOrDefault();
            if (model != null)
            {
                cookie.Expires = DateTime.Now.AddMinutes(500);//设置保存时间
                //cookie.Expires = DateTime.Now.AddMinutes(1);//设置保存时间
                SessionHelper.Add("UserName", model.UserAccount.Replace(ConfigHelper.GetConfigStr("LDADUser"), ""), 500);
                SessionHelper.Add("UserPwd", Encryptor.AESEncrypt(userPwd), 500);
                SessionHelper.Add("UserID", model.ID, 500);
                var context = HttpContext.Current;

                //写登录Cookie
                context.Response.Cookies.Remove(cookie.Name);
                context.Response.Cookies.Add(cookie);
            }

        }

没有拿到seesion跳错误页面
        /// 
        /// 加载“视图”后执行
        /// 
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log.CreateLogManager().Debug("用户名:" + User.UserInfo());
            if (!User.UserInfo().IsStrNULL())
            { 
                string ResponseAddress = ConfigHelper.GetConfigStr("ResponseAddress");
                string url = ResponseAddress + "/zh-CN/Home/Error";
                string str = "<script>window.location.href='" + url + "'</script>";
                //Log.CreateLogManager().Debug("地址:"+url);
                //filterContext.HttpContext.Response.Write(str);
            }
        }
现在的情况就是
          1.当没有一个用户登录的时候,我打开需要嵌入的页面不传Token会自动跳到错误页面
          2.走系统登录或者嵌入式登录获取的信息都是不一样的
          3.当有一个人(用户A)再A电脑走系统登录方式的时候访问开放页面,另一个人(用户B)使用B电脑访问开放的页面(嵌入页面,不通过问号传参的方式携带Token)居然也能正常访问页面,不跳转到错误页面,而且访问信息是用户A

现在遇到的困惑时第3种情况不知道怎么解决,因为系统登录方式浏览器里面有seesion_cookie;直接打开的开放页面没有seesion_cookie,居然还是用别人的信息就不能理解

  • 写回答

1条回答 默认 最新

  • 流比 2023-01-31 21:47
    关注

    可以参考的一种方案:
    1.定义一个 EmbeddedAuth() 方法来保存 session 信息
    2.通过提供的 token 和 accessKey 获取用户信息
    3.利用 JSON 序列化和反序列化实现获取的用户信息的转换
    4.将获取的用户信息存入 session 中
    5.在视图执行完之前使用过滤器判断是否能够获取到用户信息
    6.若能获取到用户信息,则正常访问页面;否则跳转到错误页面。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月31日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀