首页 > 解决方案 > Identity Server 4 - 多次调用 GetProfileDataAsync,导致多个数据库条目

问题描述

我有一个相当不同的用例,我必须跟踪登录历史记录,并跟踪它们我在 IProfileService 中创建一个新的 GUID 并将其添加到声明中以及 DB 中,以继续前端任务。

问题是我通过一次登录单击获得多个数据库条目,每次登录开始显示两条记录。

GUID 用于跟踪当前登录会话。(我们有并发登录场景)

问题 1 - 在这个函数中创建 GUID 是否正确,如果不是在哪里做?

问题 2 - IDSvr 是否为每次登录提供唯一 ID,以便我可以在声明中使用它。

问题 3- 我如何停止/最小化由于多次调用而进行的其他数据库调用。

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
       {
           var user = DataBaseUserRetrive();
           var claims = new List<Claim>
           {
                        //All Claims from user
           };
               string deviceIdGuid = Guid.NewGuid().ToString();
               Claim deviceId = new Claim("device_id", deviceIdGuid ,ClaimValueTypes.String);
               claims.Add(deviceId);
               await databaseCall(user,deviceIdGuid );
          context.IssuedClaims = claims;
       }

PS :- 我对 Identity Server 很陌生

标签: c#authenticationasp.net-identityidentityserver4identityserver3

解决方案


为了扩展我对 OP 的评论 - 我认为 IUserSession 的自定义实现(或继承和覆盖 DefaultUserSession 中的虚拟方法)可能是拦截会话相关事件并添加自定义行为和逻辑的正确位置。

默认实现在这里:https ://github.com/IdentityServer/IdentityServer4/blob/3.0.2/src/IdentityServer4/src/Services/Default/DefaultUserSession.cs

查看方法EnsureSessionIdCookieAsync()- 这可能是连接任何自定义逻辑的好地方。

此会话 ID 是发送给客户端的内容,并构成协议的一部分 - 特别是前端通道注销和会话监控规范。


推荐阅读