首页 > 解决方案 > 将应用程序发布到服务器后,为什么我的会话变量不稳定?

问题描述

首先,我知道有更好的方法来恢复密码,我知道身份框架有一种更简单的方法。所以我对所有这些建议不感兴趣,我只想找到问题的根源。

基本上,当我在本地测试它时,当我在网络应用程序上进行密码恢复时,这段代码可以工作。我发布后,它不能工作 9/10 次,但由于某种原因,它仍然工作 1/10 次。

我已经将问题追溯到我的会话变量为空,即使它们已设置,这似乎只发生在代码在服务器上运行时,但它在本地工作正常。

为什么我的网络服务器上的会话变量大部分时间都是空的?但是偶尔,它会起作用吗?我无法深究。

这是我的代码:

    // Reset password view
    [HttpGet]
    public ActionResult ResetPassword()
    {
        return View();
    }

    // Reset password ajax method, sends out an e-mail to confirm password reset.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public string ResetPassword(string email)
    {
        if (Request.Cookies["tecrom"] == null)
        {
            var user = db.Users.FirstOrDefault(x => x.Customer.ContactMail == email);
            if (user != null)
            {
                var token = Guid.NewGuid().ToString();
                Session["resetuserid"] = user.Id;
                Session["resettitle"] = user.Customer.Title;
                Session["resetemail"] = email;
                Session["resettoken"] = token;
                var body = $"Kære {user.Customer.Title}<br><br>Vi har modtaget en anmodning om at genoprette dit password.<br><br>Bekræft venligst dit password reset ved at klikke <a href='https://pdfparser.dk/Home/FinishReset?hash=" + token + "'>her</a>, eller ignorer denne mail hvis du ikke ønsker at fortsætte.<br><br>Mvh x.dk";
                EmailHelper.SendMail(email, "Genopret dit password", body);
                var myCookie = new HttpCookie("tecrom");
                var now = DateTime.Now;

                // Set the cookie value.
                myCookie.Value = now.ToString();
                // Set the cookie expiration date.
                myCookie.Expires = now.AddMinutes(15);
                // Add the cookie.
                Response.Cookies.Add(myCookie);
                return "ok";
            }
            else
            {
                return "error";
            }
        }
        else
        {
            return "error2";
        }
      
    }

    // The final step in the password reset proces
    public ActionResult FinishReset(string hash)
    {
 
        var token = (string)Session["resettoken"];
 
        if (token == hash) 
        {
            var password = "Tempas" + new Random().Next(100000, 999999);
            var userid = (string)Session["resetuserid"];        
            var mail = (string)Session["resetemail"];
            var title = (string)Session["resettitle"];

            var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
            ApplicationUser user = db.Users.Find(userid);             
            user.PasswordHash = um.PasswordHasher.HashPassword(password);
            db.Entry(user).State = EntityState.Modified;
            db.SaveChanges();
           
            var body = "Kære "+title+"<br><br>Dit midlertidige password er: "+password+ "<br><br>Log venligst ind på pdfparser.dk og skift dit password hurtigst muligt. Dette kan gøres i menuen oppe i højre hjørne af websitet efter du er logget ind.<br><br>Mvh x.dk";
          
            EmailHelper.SendMail(mail, "Dit midlertidige password", body);
            ViewBag.Message = "Et midlertidigt password er sendt til dig, tjek din mail for at fortsætte";
        }
        else
        {
            ViewBag.Message = "Noget er desværre gået galt, dit password forbliver uændret";
        }
        return View();
    }

基本上,重置密码功能使用该电子邮件检查用户的数据库,然后发送一封邮件,其中包含保存在会话变量中的确认令牌。当用户点击发送的电子邮件中的链接时,它会激活完成重置功能,然后创建一个临时密码并通过电子邮件将其发送给用户。

我再次知道这不是最佳的做法,但我有点痴迷于找出为什么我的会话变量在我的服务器上表现得很奇怪。有没有人知道为什么它是否有效似乎如此随机?

将来我几乎肯定会在我的网络应用程序的其他地方需要会话变量,因此我需要确保它们正常工作和正常运行。如果有任何相关性,Simply.com 就是我拥有我的服务器的地方。

标签: c#asp.net-mvcsession-variables

解决方案


根据您的代码,只有当用户从他们单击重置密码请求的同一浏览器打开重置密码电子邮件链接时,它才应该起作用。因为会话仅在该浏览器中维护。


推荐阅读