首页新闻找找看学习计划

WeSeal单点登录 Session失效的问题

0
悬赏园豆:100 [待解决问题]

客户方使用IBM WebSeal做的单点登录,

var username = Request.Headers["iv-user"];
            
            var ip = Request.ServerVariables["Remote_Addr"];
            
            var portalip = ConfigurationManager.AppSettings["SinglePoint"] 
            var webUrl = ConfigurationManager.AppSettings["weburl"];

            var user = _dbContext.Users.FirstOrDefault(o => o.Name == username);
            //单点登录
            if (user != null 
                && ip.Equals(portalip)
                )
            {
                //return RedirectToAction("AutoLogin", new { username = user.Name,password = user.Password });
                var url = "http://" + webUrl + "/Home/AutoLogin?userName={0}";
                Response.Redirect(string.Format(url, username), false);
                return new EmptyResult();
            }
            else
            {

                var url = "http://" + webUrl + "/Home/Login";
                Response.Redirect(url, false);
                return new EmptyResult();
            }

客户配置好之后,在Portal加一个连接,点击这个连接,跳转到我们的系统,访问方式变成:

www.domain.com/XX/Home/Index,此时因为有跨域的问题,session失效

问题补充:

域名保护的情况下,正常情况的Asp.NET_SessionId这个cookie在新域名下不存在的;

客户方单点登录的情况,使用IBM WebSeal来做的,具体的请求路线图:

客户方的问题,似乎是这个问题:

https://www.ibm.com/support/knowledgecenter/SSPREK_6.1.0/com.ibm.itame.doc_6.1/am61_webseal_admin551.htm

 

小李北漂的主页 小李北漂 | 初学一级 | 园豆:176
提问于:2016-10-31 14:43
< >
分享
所有回答(1)
0

怎么感觉你没搞清楚sso是什么东西呢

还有,你的这个描述,真心看不懂

czd890 | 园豆:7463 (大侠五级) | 2016-10-31 22:28

客户方使用nginx做了反向代理,从门户页增加应用系统的链接,将用户信息传输过来,但是做了反向代理之后,就有了跨域的问题,Asp.NET_SessionId就拿不到了,拿不到Session肯定失效

支持(0) 反对(0) 小李北漂 | 园豆:176 (初学一级) | 2016-11-01 10:35

@小李北漂: 吧环境交代清楚,各个站点情况,所使用域名等。如果可以,画个时序图

支持(0) 反对(0) czd890 | 园豆:7463 (大侠五级) | 2016-11-01 12:14

@calvinK: 客户有一个门户系统,叫portal.qingan.com,服务器地址192.168.XXX.179,这个是那个代理服务器;我们应用系统部署在另外一台服务器上,IP是192.168.XXX.130;

在门户系统上,加了一个单点登录的入口,指向的地址是我们应用系统的Home/Index(系统是ASP.NET MVC 3.0)做的,访问系统之后portal.qingan.com/cvgi6s/Home/Index,拿到用户信息之后,跳转到AutoLogin,从应用系统拿到用户信息,存储在Session里面,在Redirect到系统首页中,此时Session还是存在的;

应用系统登录首页之后,会有一些AJAX数据请求,AJAX数据请求Controller时,会做登录验证,此时去Session取用户信息,Session为空,就得重新登录。

支持(0) 反对(0) 小李北漂 | 园豆:176 (初学一级) | 2016-11-01 14:05

@小李北漂: 

门户站点和你的站点是域名是相同的,都是portal.qingan.com。对么?

在你的网站完成登录之后,自动登录门户网站。

在然后,在门户网站 ajax 你的站点。之前的登录信息没有了。

是这样么?

支持(0) 反对(0) czd890 | 园豆:7463 (大侠五级) | 2016-11-01 15:59

@calvinK: 门户站点是portal.qingan.com,我们的站点不是,客户方的单点登录使用access manager webseal实现的

支持(0) 反对(0) 小李北漂 | 园豆:176 (初学一级) | 2016-11-01 20:43

@小李北漂: 你网站的代码放上来,登录的代码

支持(0) 反对(0) czd890 | 园豆:7463 (大侠五级) | 2016-11-01 22:38

@calvinK: AutoLoin的方法体:

 /// <summary>
        /// 自动登录
        /// </summary>
        /// <returns></returns>
        public ActionResult AutoLogin(string username)
        {
            //解决在通过iframe访问时IE下session丢失
            //Response.AddHeader("p3p", "CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'");

            string url = Request.Form["url"];
            //WriteLog("C://单点登录测试.log", url);
            var userList = _dbContext.Users.Where(item => item.Name == username).ToList();
            var webUrl = ConfigurationManager.AppSettings["weburl"];
            bool exist = userList.Count != 0;
            if (exist)
            {
                var user = userList.FirstOrDefault();
                if (user.IsStop == true)
                {
                    ViewData["_error"] = "该用户已停用!";
                    ViewData["SysVersion"] = ConfigurationManager.AppSettings["SysVersion"];
                    ViewData["DBVersion"] = ConfigurationManager.AppSettings["DBVersion"];
                    ViewData["FrameVersion"] = ConfigurationManager.AppSettings["FrameVersion"];
                    ViewData["PDAVersion"] = ConfigurationManager.AppSettings["PDAVersion"];
                    ViewData["PageSetting"] = GetLoginPageSetting();
                    return View();
                }
                //add login log
                _dbContext.UserLoginInfoes.Add(new UserLoginInfo()
                {
                    ID = Guid.NewGuid().ToString(),
                    UserID = user.ID,
                    LoginDate = DateTime.Now,
                    CreateDate = DateTime.Now,
                    LoginWay = (short)LoginWay.pcLogin
                });
                _dbContext.SaveChanges();

                //将当前登录用户信息记录到静态属性中,方便之后调用
                CurrentUserInfo.RecordCurrentUserInfo(user);

                Session["CurrentUser"] = userList[0].ID;
                Session["CurrentUserName"] = userList[0].Name;
                Session["RealName"] = userList[0].Person.FullName;
                var defaultGroup = GetDefaultGroup();
                if (username == "admin")
                {
                    if (string.IsNullOrWhiteSpace(url))
                    {
                        var redirectUrl = "~/Home/Default?code=manage";
                        Response.Redirect(redirectUrl, false);
                    }
                }

                if (string.IsNullOrWhiteSpace(url))
                {
                    var redirectUrl=string.Format("~/Home/Default?code={0}", 
                        string.IsNullOrWhiteSpace(defaultGroup) ? "risk-system" : defaultGroup);
                    Response.Redirect(redirectUrl, false);
                }
                else
                {
                    var returnUrl = "~" + url.Split(',')[0].Split(':').Last().Trim('"');
                    var returnModule = _dbContext.SystemModules.FirstOrDefault(item => item.StartPage == returnUrl);
                    if (returnModule == null)
                        Response.Redirect(string.Format("~/Home/Default?code={0}", string.IsNullOrWhiteSpace(defaultGroup) ? "risk-system" : defaultGroup), false);
                    else
                        Response.Redirect(string.Format("~/Home/Default?code={0}", returnModule.Group.Code + "#" + url), false);
                    return new EmptyResult();
                }

            }
            else
            {
                ViewData["SysVersion"] = ConfigurationManager.AppSettings["SysVersion"];
                ViewData["DBVersion"] = ConfigurationManager.AppSettings["DBVersion"];
                ViewData["FrameVersion"] = ConfigurationManager.AppSettings["FrameVersion"];
                ViewData["PDAVersion"] = ConfigurationManager.AppSettings["PDAVersion"];
                ViewData["PageSetting"] = GetLoginPageSetting();
                var loginUrl = "http://" + webUrl + "/Home/Login";
                Response.Redirect(loginUrl);
            }
            return new EmptyResult();
        }

Default的代码体:

public ActionResult Default(string code)
        {
            //WriteLog("C://单点登录测试.log",DateTime.Now.ToString()+"请求进入");
            DebugTimer timer = DebugTimer.StartOne("Default");
            if (Session["CurrentUser"] == null)
            {
                WriteLog("C://单点登录测试.log", "Session为空" + "跳转");
                return RedirectToAction("Login");
            }
            //var ip = Request.ServerVariables["Remote_Addr"];
            //var portalip = ConfigurationManager.AppSettings["SinglePoint"];
            //if (ip.Equals(portalip))
            //{
            //    var session_cookie = System.Web.HttpContext.Current.Request.Cookies["ASP.NET_SessionId"];
            //    if (session_cookie != null)
            //    {
            //        WriteLog("C://单点登录测试.log", "session_cookie不为null" + "跳转");
            //        HttpCookie domain_cookie = new HttpCookie("ASP.NET_SessionId");
            //        domain_cookie.Domain = "portal.qingan.com";
            //        domain_cookie.Value = session_cookie.Value;
            //        System.Web.HttpContext.Current.Response.AppendCookie(domain_cookie);
            //    }
            //}

            var env = _appservice.GetUserEnvironment();
            var group = _dbContext.SystemModuleGroups.FirstOrDefault(o => o.Code == code);
            //如果code 错误则转向默认的code
            if (group == null)
            {
                var defCode = GetDefaultGroup();
                group = _dbContext.SystemModuleGroups.FirstOrDefault(o => o.Code == defCode);
            }

            env.CurrentGroup = group;
            ViewData["CurrentUser"] = Session["CurrentUser"];
            ViewData["CurrentUserName"] = Session["CurrentUserName"] ?? "";
            ViewData["RealName"] = Session["RealName"];
            ViewData["PageSetting"] = GetLoginPageSetting();
            ViewData["CustomTopMenuSettings"] = ProjectSettingService.GetCustomTopMenuSettings();
            var userid = Session["CurrentUser"].ToString();
            var user = _dbContext.Users.FirstOrDefault(item => item.ID == userid);
            var systemModuleGroups = ReSelectModuleGroups(env, user);
            env.ModuleGroups = systemModuleGroups;
            ViewBag.Avatar = user.Person.Photo;
            ViewBag.HasDelegation = hasDelegation(Session["CurrentUser"].ToString());
            if (env.Historys != null)
            {
                ViewData["CurrentUrl"] = env.Historys.CurrentUrl;
                env.Historys.Clear();
                env.Historys.CurrentUrl = "";
            }
            timer.End("Default");
            return View(env);
        }
支持(0) 反对(0) 小李北漂 | 园豆:176 (初学一级) | 2016-11-01 23:22

@小李北漂: 跨域了呀,跨域request,cookie不会带上的。

2种方式

1.ajax的时候带上token之类的,比如oauth

2.假如你们的域名是a.b.com,c.b.com。二级域名不一样,可通document.domain='.b.com';来搞定

支持(0) 反对(0) czd890 | 园豆:7463 (大侠五级) | 2016-11-02 11:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册