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

.NET 6 Identity Server用户令牌无法存储到数据库的问题求助

问题描述

在.NET 6项目中实现Identity Server时,希望将刷新令牌持久化到数据库的AspNetUserTokens表,但当前使用UserManager相关方法时,令牌仅存储在内存中——调用GetAuthenticationTokenAsync能正常获取令牌,但数据库里完全看不到记录。现有配置及代码如下:

服务配置代码

services
    .AddIdentity<MyUser, MyRole>()
    .AddEntityFrameworkStores<MyDbContext>()
    .AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<MyUser>));

令牌生成与存储代码

var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);

令牌获取代码

var token = await _userManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
解决方法
  • 确认DbContext配置正确性
    确保MyDbContext继承自IdentityDbContext<MyUser, MyRole>(如果使用自定义主键类型,需对应传入泛型参数),并且在OnModelCreating方法中调用base.OnModelCreating(modelBuilder)。这一步是让EF Core自动配置AspNetUserTokens等Identity核心表的映射关系,否则数据库不会生成对应表结构。

  • 补充数据库保存操作
    SetAuthenticationTokenAsync方法仅会在内存中更新用户实体的令牌数据,不会自动提交到数据库。必须在调用该方法后,手动触发保存操作:

    var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
    await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);
    // 关键:将内存中的更改同步到数据库
    var updateResult = await _userManager.UpdateAsync(user);
    if (!updateResult.Succeeded)
    {
        // 这里可以添加更新失败的处理逻辑,比如日志记录或错误返回
    }
    
  • 验证数据库迁移状态
    确保已经生成并应用了Identity相关的数据库迁移,AspNetUserTokens表已正确创建。可以通过以下.NET CLI命令完成:

    # 生成Identity表结构的迁移文件
    dotnet ef migrations add AddIdentityTokenTables
    # 将迁移应用到数据库
    dotnet ef database update
    
  • 检查令牌参数一致性
    确保GenerateUserTokenAsync、SetAuthenticationTokenAsync、GetAuthenticationTokenAsync三个方法中使用的**提供者名称("MyApp")和令牌名称("RefreshToken")**完全一致,大小写、拼写都不能出错,否则会导致令牌无法正确存储或读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:43:27