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

Duende IdentityServer 6.2会话与设备数据未存入数据库的解决问询

解决Duende IdentityServer 6.2会话与设备信息未存入数据库的问题

一、配置服务器端会话保存到ServerSideSessions表

要让会话持久化到数据库的ServerSideSessions表,需完成以下配置:

  1. 启用服务器端会话并绑定EF存储
    在ConfigureServices的IdentityServer配置链中添加相关代码,确保会话存储关联到PersistedGrantDbContext:

    services.AddIdentityServer()
        // 保留原有配置(如AddConfigurationStore、AddInMemoryClients等)
        .AddServerSideSessions()
        .AddServerSideSessionStore<EntityFrameworkServerSideSessionStore>()
        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = b => b.UseSqlServer(/* 你的数据库连接字符串 */);
            // 可选:开启自动清理过期会话的机制
            options.EnableTokenCleanup = true;
        });
    

    EntityFrameworkServerSideSessionStore是Duende官方提供的基于EF的会话存储实现,默认已关联PersistedGrantDbContext,若使用自定义DbContext,需确保包含ServerSideSessions对应的DbSet。

  2. 更新数据库迁移
    ServerSideSessions是新增表,需生成并应用EF迁移以创建表结构:

    dotnet ef migrations add AddServerSideSessions -c PersistedGrantDbContext
    dotnet ef database update -c PersistedGrantDbContext
    
  3. 客户端会话支持配置
    客户端需开启离线访问权限,且请求令牌时携带offline_access scope,才会触发会话持久化:

    new Client
    {
        // 其他客户端配置
        AllowOfflineAccess = true,
        AllowedScopes = { "openid", "profile", "offline_access" }
    };
    

二、配置设备信息存入DeviceCodes关联的Devices表

设备信息存储依赖设备授权流程的正确配置:

  1. 确保操作存储已配置
    只要已配置AddOperationalStore,Duende会自动处理DeviceCodes和Devices表的存储逻辑,若数据库中无这两张表,需执行迁移命令补全结构。

  2. 客户端启用设备流
    客户端配置需指定设备授权为允许的授权类型:

    new Client
    {
        ClientId = "device_flow_client",
        ClientName = "设备流客户端",
        AllowedGrantTypes = GrantTypes.DeviceFlow,
        ClientSecrets = { new Secret("client_secret".Sha256()) },
        AllowedScopes = { "openid", "profile", "api1" },
        AllowOfflineAccess = true
    };
    
  3. 使用设备授权流程请求令牌
    只有通过设备授权流程(先调用/connect/deviceauthorization获取设备码,再轮询/connect/token)获取令牌时,设备信息才会被写入Devices表并关联到DeviceCodes,其他授权流程不会生成设备记录。

三、关于ISessionManagementService的作用

ISessionManagementService不是用来实现会话持久化的,它是Duende提供的会话管理接口,用于执行以下操作:

  • 查询系统内的活跃会话列表
  • 根据用户ID、会话ID终止指定会话
  • 批量撤销用户的所有会话或关联令牌

当完成会话存储配置后,会话会自动持久化到数据库,此时可注入ISessionManagementService实现会话的后台管理功能(如管理面板的会话终止操作)。

内容的提问来源于stack exchange,提问作者Абай Саякбаев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:50:33