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

.NET Core 6中如何更新认证Cookie存储的用户声明?

解决Cookie认证中更新JWT令牌声明的问题

问题根源

你仅修改了当前请求上下文内存中的ClaimsIdentity,但未将更新后的声明重新持久化到认证Cookie中。后续请求会重新从浏览器存储的Cookie读取旧声明,因此仍会使用过期的令牌。

正确的更新流程

要让新令牌声明在后续请求中生效,必须重新生成认证票证并替换响应中的Cookie,具体步骤如下:

  1. 更新当前上下文的ClaimsIdentity(你已实现的这部分逻辑可保留)
  2. 基于更新后的身份信息创建新的认证主体与票证
  3. 将新票证重新写入响应的认证Cookie中

完整代码示例

// 获取当前用户的ClaimsIdentity
var identity = User.Identity as ClaimsIdentity;
if (identity == null) return;

// 替换Token声明
var oldTokenClaim = identity.FindFirst("Token");
if (oldTokenClaim != null)
{
    identity.RemoveClaim(oldTokenClaim);
}
identity.AddClaim(new Claim("Token", response.Token));

// 替换RefreshToken声明
var oldRefreshTokenClaim = identity.FindFirst("RefreshToken");
if (oldRefreshTokenClaim != null)
{
    identity.RemoveClaim(oldRefreshTokenClaim);
}
identity.AddClaim(new Claim("RefreshToken", response.RefreshToken));

// 创建新的认证主体
var newPrincipal = new ClaimsPrincipal(identity);

// 配置认证属性(保持与原Cookie一致的持久化策略)
var authProperties = new AuthenticationProperties
{
    IsPersistent = true,
    ExpiresUtc = DateTimeOffset.UtcNow.AddDays(7) // 建议与RefreshToken有效期匹配
};

// 重新生成认证Cookie(注意方案名称要与配置的Cookie认证方案一致)
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, newPrincipal, authProperties);

额外注意事项

  • 认证方案匹配:确保SignInAsync中的方案名称,与你在Program.cs中配置Cookie认证时指定的名称一致,默认配置示例:
    builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => { /* 自定义配置 */ });
    
  • 异常规避:查找Claim时建议用FindFirst而非Single,避免因Claim不存在抛出异常;
  • 刷新时机优化:建议在API返回401过期错误时触发令牌刷新,或提前检查Access Token过期时间主动刷新,减少无效请求。

内容的提问来源于stack exchange,提问作者Divyang Vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:54:32