简述
“记住密码”功能是一种在现代应用程序和网站中常见的便利性特性,它允许用户在经过一次身份验证后,无需每次访问都重新输入用户名和密码。在登录界面时常常需要“记住密码功能”
代码
下面的代码是登录的post方法,获取前端提交的MAil、Password和Remember。当登录验证通过后执行判断Remember,也就是判断用户是否勾选记住密码,假设Remember==true就会执行记住密码功能,在这里我将用户的邮箱和密码与用户IP绑定并且保存到Cookie中(我获取IP是为了确保用户数据独立),同时设置过期时间为7天(这样做的安全性不高,在条件允许的情况下,生成一个专属的Cookie值保存到数据库中,再根据Cookie执行查询操作)
public ActionResult Login(string Mail, string password, bool remember)
{
if (LogOrSing.Login(Mail, password)) // 验证用户名和密码的逻辑
{
if (remember)
{
// 将用户名和密码保存到Cookie中
Response.Cookies["IP-Mail-Pwd"].Value =
IP.GetLocalIPAddress() + "-" + Mail + "-" + password;
Response.Cookies["remember"].Value = "true";
Response.Cookies["IP-Mail-Pwd"].Expires = DateTime.Now.AddDays(7);
Response.Cookies["remember"].Expires = DateTime.Now.AddDays(7); // 设置Cookie的过期时间为7天
return Content("用户名:" + Mail + "密码:" + password + "记住我" + remember);
}
else
{
return Content("用户名:" + Mail + "密码:" + password + "记住我" + remember);
}
// 登录成功后的操作,例如打开主窗口等
}
else
{
return Content("用户名:" + Mail + "密码:" + password + "记住我" + remember);
}
}
以下是获取IP的方法,引用命名空间System.Net。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
namespace OptiMfg.Models
{
public class IP
{
public static string GetLocalIPAddress()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
return "127.0.0.1";
}
}
}
这里就是登录的get方法,先判断是否存在Cookie,存在就获取Cookie存储的IP,如果Ip与重新获取的Ip相同就获取邮箱和密码并且保存到Employ对象中并且将 Employee
对象作为模型传递给视图。如果没有Cookie和IP不同则返回空的视图。
// 如果Cookie存在,则从Cookie中获取用户名和密码
if (Request.Cookies["IP-Mail-pwd"] != null)
{
// 如果Cookie存在,则从Cookie中获取用户名和密码
string[] values = Request.Cookies["IP-Mail-pwd"].Value.Split('-');
string ip = values[0];
if (IP.GetLocalIPAddress() == ip)
{
string Mail = values[1];
string password = values[2];
ViewBag.BOOL = true;
Employee employee = new Employee { Mail = Mail, Password = password };
return View(employee);
}
else
{
ViewBag.BOOL = false;
return View();
}
}
else
{
ViewBag.BOOL = false;
return View();
}
前端代码,这里要注意的是TextBox和Password的ID要与post方法接收的ID要相同,同时必须要进行判断,不然当控制器传递空的视图时必定报错
<div class="www" id="ws">
<a>邮箱</a>
<br />
@if (ViewBag.BOOL)
{
@Html.TextBox("Mail", Model.Mail, new { style = "margin-left:10px; width: 95%; margin-right: 20px;border: none;" })
}
else
{
@Html.TextBox("Mail", "", new { style = "margin-left:10px; width: 95%; margin-right: 20px;border: none;" })
}
</div>
<div class="www" id="wss">
<a> 密码</a>
<br />
@if (ViewBag.BOOL)
{
@Html.Password("Password", Model.Password, new { style = "margin-left:10px; width: 95%; margin-right: 20px;border: none;" })
}
else
{
@Html.Password("Password", "", new { style = "margin-left:10px; width: 95%; margin-right: 20px;border: none;" })
}
</div>
以下是清除Cookie的代码,简单来讲就是将Cookie的过期时间改成已经过期的时间。
HttpCookie hc = Request.Cookies["user"];
hc.Expires = DateTime.Now.AddDays(-1);
Response.AppendCookie(hc);
最后,这些代码部分来自网上,本人也接触C#不久,如有不足欢迎大佬指正或者是有更好的方式也欢迎大佬提出。