为了账号安全,请及时绑定邮箱和手机立即绑定

mvc3/Mvc4使用Form认证遇到一个奇怪的问题(SetAuthCookie,跨域多点登录,cookie丢失)?

mvc3/Mvc4使用Form认证遇到一个奇怪的问题(SetAuthCookie,跨域多点登录,cookie丢失)?

千巷猫影 2018-12-07 00:53:01
最近写了个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会丢失??
查看完整描述

9 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

问题的关键在:在已有的门户网站中添加js代码,访问Testlogin,无法成功登录。

所以重点是添加的js代码是什么。

查看完整回答
反对 回复 2019-01-21
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

谢谢回复。

门户上的登录 增加了js 向 Testlogin发送post请求数据,为了测试,Testlogin不处理任何数据直接写cookie都不成功。

备注:之前,门户网站已经与 discuzNT整合,也是使用该方法。discuzNT采用的aspx web程序,不是MVC Form验证。

查看完整回答
反对 回复 2019-01-21
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

请问楼主怎么解决的啊,我也遇到这样的问题!

查看完整回答
反对 回复 2019-01-21
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

不好意思,好久没有来了。

查看完整回答
反对 回复 2019-01-21
?
隔江千里

TA贡献1906条经验 获得超10个赞

我也遇到这问题,请楼主分享解决办法。谢谢!

查看完整回答
反对 回复 2019-01-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

后来在服务端请求了。不要在客户端请求。

查看完整回答
反对 回复 2019-01-21
  • 9 回答
  • 0 关注
  • 415 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信