客户方使用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
怎么感觉你没搞清楚sso是什么东西呢
还有,你的这个描述,真心看不懂
客户方使用nginx做了反向代理,从门户页增加应用系统的链接,将用户信息传输过来,但是做了反向代理之后,就有了跨域的问题,Asp.NET_SessionId就拿不到了,拿不到Session肯定失效
@小李北漂: 吧环境交代清楚,各个站点情况,所使用域名等。如果可以,画个时序图
@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为空,就得重新登录。
@小李北漂:
门户站点和你的站点是域名是相同的,都是portal.qingan.com。对么?
在你的网站完成登录之后,自动登录门户网站。
在然后,在门户网站 ajax 你的站点。之前的登录信息没有了。
是这样么?
@calvinK: 门户站点是portal.qingan.com,我们的站点不是,客户方的单点登录使用access manager webseal实现的
@小李北漂: 你网站的代码放上来,登录的代码
@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); }
@小李北漂: 跨域了呀,跨域request,cookie不会带上的。
2种方式
1.ajax的时候带上token之类的,比如oauth
2.假如你们的域名是a.b.com,c.b.com。二级域名不一样,可通document.domain='.b.com';来搞定
您好 请问这个问题解决了吗 我现在也是这个问题 头好大