You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:57:54