最近写了个WEB邮件系统,希望与已有的门户网站实现单点登录。
基本情况:
1.邮件系统采用Mvc4,使用Form身份认证。该系统单独运行没有任何问题。
登录部分代码
[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model, string returnUrl) { if (Membership.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); if (!string.IsNullOrEmpty(returnUrl)) //if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } } else { ModelState.AddModelError("", "The user name or password provided is incorrect."); } } // If we got this far, something failed, redisplay form return View(model); }
2. 在与已有网站系统整合的时候,出现无法同步登录。
为了方便测试,添加了一个测试的控制器
public ActionResult Testlogin() { FormsAuthentication.SetAuthCookie("用户名", true, FormsAuthentication.FormsCookiePath); return RedirectToAction("Index", "Home"); }
在浏览器中直接访问 Testlogin 能够成功登录,并跳转到指定页面。
但在已有的门户网站中添加js代码,访问Testlogin,无法成功登录。跳转到指定页面显示cookie为空,User.Identity.Name 为空。
3. 我以为cookie写入错误,或者form认证存在问题,于是不使用SetAuthCookie,重写Testlogin,手动写入cookie。
[AllowAnonymous] public ActionResult Testlogin() { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, "sssss", DateTime.Now, DateTime.Now.AddMinutes(20), false, "sssss"); // generate new identity FormsIdentity identity = new FormsIdentity(ticket); HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); // write to client. Response.Cookies.Set(cookie); HttpCookie cookie2 = Request.Cookies[FormsAuthentication.FormsCookieName]; return RedirectToAction("Index", "Home"); }
但是问题依旧存在。在浏览器中直接访问该Testlogin一切正常。
从其他网站用js请求Testlogin,经过调试,发现cookie能够设置到Request,但是在RedirectToAction后,在新的请求(Global.asax.cs中)
//AuthenticateRequest protected void Application_AuthenticateRequest() { // 1. 读登录Cookie HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (cookie == null || string.IsNullOrEmpty(cookie.Value)) { } else { try { LoginModel userData = null; // 2. 解密Cookie值,获取FormsAuthenticationTicket对象 FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); if (ticket != null && string.IsNullOrEmpty(ticket.UserData) == false)
设置断点,跳转后,就丢失了cookie。
请大家帮忙看看,问题出在哪里??为什么cookie会丢失??
慕妹3146593
慕桂英546537
德玛西亚99
阿波罗的战车
隔江千里
慕的地6264312