我正在尝试实现一个后端换前端 .NET Core 3.1 项目,其中从 Identity Server 检索到的令牌存储在 SQL 缓存中。BFF 基于SpaHost-GitHub的实现。在项目中,我使用了应管理令牌生命周期和缓存的IdentityModel.AspNetCore 。
为了将令牌存储在缓存中,表BffTokenCache是使用以下模式创建的
CREATE TABLE [dbo].[BffTokenCache](
[Id] [nvarchar](900) NOT NULL,
[Value] [varbinary](max) NOT NULL,
[ExpiresAtTime] [datetimeoffset](7) NOT NULL,
[SlidingExpirationInSeconds] [bigint] NULL,
[AbsoluteExpiration] [datetimeoffset](7) NULL
CONSTRAINT [PK_BffTokenCache] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
在我删除的 SpaHost 项目的Startup.cs类中
services.AddDistributedMemoryCache();
并将其替换为
services.AddDistributedSqlServerCache((options) =>
{
options.ConnectionString = Configuration.GetConnectionString("ConnectionString_BffTokenCache");
options.SchemaName = "dbo";
options.TableName = "BffTokenCache";
});
为了验证连接字符串和表是否适用于缓存服务,我在Startup.csConfigure()
类的函数中添加了一行代码来获取注入的对象并将值写入表中。那行得通,但是当我运行我的项目时,我从来没有看到任何令牌被写入缓存。我希望一旦用户通过身份验证,IdentityModel.AspNetCore库就会将令牌写入表中。IDistributedCache
我尝试将services.AddDistributedSqlServerCache()
线路移动到调用之前和之后,AddAccessTokenManagement()
以防有人可以覆盖调用AddClientAccesTokenManagement()
函数中的调用,AddDistributedMemoryCache()
但这似乎并不重要。
--UPDATE 我对 IdentityModel.AspNetCore库的理解似乎不正确。只有客户端信息似乎是一个可缓存的对象,此时我没有这样做。当请求刷新令牌而不是缓存时,用户令牌数据被添加到字典中。所以我原来的问题是无关紧要的。