如何在ASP.NET Core中获取Cookie过期时间并实现自动登录功能
ASP.NET Core 自动登录功能实现方案
之前方案失效的核心原因
浏览器向服务器发起请求时,只会携带Cookie的键值对内容,不会传递Cookie的有效期、路径、域名等元属性,这些属性仅由浏览器本地存储并管理Cookie生命周期,过期的Cookie浏览器会自动清理,根本不会发送到服务器端。所以你尝试读取Request.Cookies里的Expires属性的逻辑从根本上就行不通,ASP.NET Core的IRequestCookieCollection也压根没有提供Expires属性的访问接口。
额外安全提醒:你当前代码直接把用户明文密码存在Cookie里是严重的安全漏洞,极易造成用户信息泄露,生产环境绝对不能这么用。
正确实现步骤
1. 登录接口优化(可选但强烈建议)
不要存储明文密码,推荐两种方案:
- 直接使用ASP.NET Core Identity自带的「记住我」功能,框架会自动处理安全Cookie的加密、有效期管理,只需要在
PasswordSignInAsync方法里把isPersistent参数设为true即可。 - 如果不想引入Identity,可以生成一个加密的用户身份标识存在Cookie里,替代明文的账号密码。
如果暂时保留原有逻辑,登录接口不需要改动,Cookie的Expires设置已经正确,浏览器会自动管理10天有效期。
2. 首页逻辑修改
只要Request.Cookies中能读取到对应的Cookie键,就说明Cookie还在有效期内,不需要额外判断过期时间,直接验证用户信息后跳转即可:
public IActionResult Index() { // 能拿到IsRemember且值为True,说明Cookie未过期 if (Request.Cookies.TryGetValue("IsRemember", out string isRemember) && isRemember == "True") { // 读取Cookie中的账号密码(仅演示,生产环境请替换为加密Token验证) if (Request.Cookies.TryGetValue("UserEmail", out string email) && Request.Cookies.TryGetValue("UserPassword", out string password)) { // 这里加你的账号密码校验逻辑,校验通过就跳转仪表盘 var user = 你的用户校验方法(email, password); if (user != null) { // 可以在这里补充登录态写入Session或者 ClaimsPrincipal的逻辑 return RedirectToAction("Index", "Dashboard"); } // 校验失败说明Cookie内容被篡改,清理失效Cookie Response.Cookies.Delete("IsRemember"); Response.Cookies.Delete("UserEmail"); Response.Cookies.Delete("UserPassword"); } } // 未触发自动登录就返回首页 return View(); }
内容的提问来源于stack exchange,提问作者J Mak
相关产品推荐
相关产品推荐

