c# - 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 很陌生
解决方案
为了扩展我对 OP 的评论 - 我认为 IUserSession 的自定义实现(或继承和覆盖 DefaultUserSession 中的虚拟方法)可能是拦截会话相关事件并添加自定义行为和逻辑的正确位置。
查看方法EnsureSessionIdCookieAsync()
- 这可能是连接任何自定义逻辑的好地方。
此会话 ID 是发送给客户端的内容,并构成协议的一部分 - 特别是前端通道注销和会话监控规范。
推荐阅读
- python - 使用 Python Selenium 打开 EDGE Chromium
- python - 我不明白这段代码如何对这个 python list() 进行排序,以及如何用向量在 C++ 中重现它
- javascript - `chalk` 库在使用 webpack 打包后不打印彩色文本
- javascript - 外部组件正在全面查看 [ReactJS]
- ios - 如何在 swift 5 中限制文本字段中的共享?
- javascript - 使用来自 getJSON 的数据创建表
- c# - 如何使用 HTML Agility Pack 从多个页面获取数据
- c# - 如何克服 Mono WASM 运行时中缺少的时区实现
- powershell - 如何以用户 XYZ 的身份执行 powershell 命令?
- azure-active-directory - 以编程方式加入 AzureAD