使用EntityFrameworkCore搭配Identity Server4时,access_token存储于哪个表?
Access Token 在 IdentityServer4 + EF Core 中的存储位置
嘿,这个问题问到点子上了!当你把EntityFrameworkCore和IdentityServer4搭在一起开发时,access_token的存储位置得看你的配置和token类型,我给你掰扯清楚:
核心存储表:PersistedGrants
IdentityServer4通过EntityFrameworkCore实现持久化时,所有需要持久化的token(包括access_token、refresh_token、授权码等)都会存在PersistedGrants表中。这个表是IdentityServer4.EntityFramework包自带的,关键字段包括:
Key:token的唯一标识(主键)Type:用来区分token类型,比如access_token、refresh_token、authorization_codeSubjectId:token所属的用户IDClientId:请求token的客户端IDExpiration:token的过期时间
分情况讨论:不是所有access_token都会存在数据库里
这里要注意两种常见的token模式:
- 参考令牌(Reference Token)模式:这种模式下,返回给客户端的access_token只是一个短引用,实际的token数据会存在
PersistedGrants表中。每次客户端用这个引用请求资源时,IdentityServer会去数据库校验这个引用的有效性。 - JWT(JSON Web Token)模式:JWT是自包含的令牌,所有用户和权限信息都编码在token本身里。默认情况下,IdentityServer不会把JWT类型的access_token存在数据库中——除非你特意配置了持久化JWT(比如需要审计或者 revoke 功能),此时JWT数据才会写入
PersistedGrants表。
如何确认你的配置?
如果你在Startup类里配置了操作存储(Operational Store),就说明用了EF Core来持久化这些token,代码大概是这样的:
services.AddIdentityServer() .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseSqlServer("你的数据库连接字符串", sql => sql.MigrationsAssembly("你的迁移程序集名称")); // 可选:设置token的自动清理策略 options.EnableTokenCleanup = true; });
这段代码就是告诉IdentityServer用EF Core来管理PersistedGrants表(还有DeviceCodes表,用于设备流认证)。
内容的提问来源于stack exchange,提问作者Rakesh Kumar
相关产品推荐
相关产品推荐

