ASP.NET Core中Cookie认证下登录后存储用户信息的实现方法
在ASP.NET Core中存储用户信息的几种方案
嘿,我之前从ASP.NET Framework转Core的时候也纠结过这个问题!其实Core里有更贴合Cookie Authentication的方案,当然也可以沿用Session的方式,我给你逐一说明:
1. 使用Claims(推荐,和Cookie Auth原生集成)
ASP.NET Core的Cookie Authentication本身就是基于**声明式身份(Claims)**设计的,把用户信息存在Claims里是最正统的做法,不需要额外依赖Session,而且信息会加密存在Cookie中,安全又方便。
登录时添加用户信息到Claims
在你处理登录逻辑的地方(比如AccountController的Login方法),创建ClaimsIdentity的时候把需要的用户信息加进去:
// 假设你已经获取到了UserInfo对象 var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, UserInfo.UserID.ToString()), new Claim(ClaimTypes.Name, UserInfo.Name), new Claim("Age", UserInfo.Age.ToString()) // 自定义Claim类型 }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
在其他控制器中获取用户信息
之后在任意控制器里,直接通过User属性就能获取这些信息:
// 获取UserID var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 获取用户名 var userName = User.FindFirstValue(ClaimTypes.Name); // 获取自定义的Age var age = int.Parse(User.FindFirstValue("Age"));
如果觉得每次写FindFirstValue麻烦,还可以写个扩展方法简化:
public static class ClaimsPrincipalExtensions { public static string GetUserId(this ClaimsPrincipal principal) { return principal.FindFirstValue(ClaimTypes.NameIdentifier); } public static string GetUserName(this ClaimsPrincipal principal) { return principal.FindFirstValue(ClaimTypes.Name); } public static int GetAge(this ClaimsPrincipal principal) { return int.Parse(principal.FindFirstValue("Age")); } }
这样用的时候就更简洁:var userId = User.GetUserId();
2. 启用并使用Session(兼容旧项目习惯)
如果你还是想沿用Session的方式,ASP.NET Core里需要先手动启用Session功能,默认是不开启的。
第一步:配置Session服务
在Program.cs里添加Session服务和中间件:
var builder = WebApplication.CreateBuilder(args); // 添加Session服务 builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session超时时间 options.Cookie.HttpOnly = true; // 防止前端JS访问,提升安全性 options.Cookie.IsEssential = true; // 标记为必要Cookie,符合GDPR }); // 其他服务配置... var app = builder.Build(); // 注意:UseSession要放在UseRouting之后,UseAuthorization之前 app.UseRouting(); app.UseSession(); app.UseAuthorization(); // 其他中间件配置... app.Run();
第二步:存储和读取Session数据
现在就可以像Framework里那样用Session了,不过Core里需要通过HttpContext.Session操作:
// 登录成功后存储信息 HttpContext.Session.SetString("UserName", UserInfo.Name); HttpContext.Session.SetInt32("Age", UserInfo.Age); HttpContext.Session.SetString("GroupUserID", UserInfo.GroupID.ToString());
在其他控制器中读取:
var userName = HttpContext.Session.GetString("UserName"); var age = HttpContext.Session.GetInt32("Age"); var groupId = HttpContext.Session.GetString("GroupUserID");
方案对比
- Claims方案:和Cookie Auth深度集成,无需额外配置Session,信息加密存储在认证Cookie中,适合存储用户身份相关的核心信息,是Core推荐的做法。
- Session方案:兼容旧习惯,但需要额外配置Session中间件,Session数据默认存在服务器内存中(生产环境建议改用分布式缓存比如Redis),适合存储非身份相关的临时数据。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

