c# - 将应用程序发布到服务器后,为什么我的会话变量不稳定?
问题描述
首先,我知道有更好的方法来恢复密码,我知道身份框架有一种更简单的方法。所以我对所有这些建议不感兴趣,我只想找到问题的根源。
基本上,当我在本地测试它时,当我在网络应用程序上进行密码恢复时,这段代码可以工作。我发布后,它不能工作 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# - 如何在 nlog.config 文件中将归档文件名创建为 today-1
- java - 有没有办法在 TestNG 中设置全局参数?
- mysql - MySQL 语句 ON DUPLICATE KEY 用于非键
- python - 你如何让 python 库“urwid”的按钮看起来很漂亮?
- python - 如何解决 ReverseNoMatch 错误 django?
- javascript - 如何授权用纯 Javascript 编写的网络应用程序与 Google AutoML 预测模型 Restful API 对话?
- php - 使用 Count 给出错误的行数
- javascript - 将对象数组推送到数组以进行排序
- android - 获取具有非固定键的对象的属性
- docker - 使用 Docker Compose 或 Kubernetes 时动态服务发现如何工作?