【问题标题】:Dynamic claims asp.net core identity no DB persistence动态声明 asp.net 核心身份没有数据库持久性
【发布时间】:2019-11-09 20:49:05
【问题描述】:

我正在建立一个系统,用户登录后,他可以选择代表某个组织行事。用户会看到一个组织列表,他可以选择要“模拟”的组织。

此信息是动态的,可以在登录之间更改,因此它不能保留在数据库中。

我发现我可以尝试向用户添加额外的声明。我已经用它来存储一些信息。我通过实现自己的 UserClaimsPrincipalFactory 来实现这一点,这非常简单,因为该信息保留在用户中并且不会更改。

为了添加我的 organizationId 声明,我尝试了不同的方法,但都没有奏效。

直接在 User.Identity 中添加新声明不会在下一个请求中保留它。

添加新声明并使用 httpContext 登录也会在下一个请求中丢失。

我认为这完全是因为我的 UserClaimsPrincipalFactory。

我发现如何为会话持久保存它的唯一方法是使用 userManager。

await userManager.AddClaimAsync(user, new System.Security.Claims.Claim("organizationId", "myOrganization"));

然而,userManager 将数据保存在数据库中,正如我在开始时所说,这些数据是动态的,并且在登录之间会发生变化,它不能保留在数据库中。

我在这个主题上发现了这个问题:Store data in cookie with asp.net core identity

但不幸的是,解决方案将数据保存在数据库中。

这个问题与我的用例类似,但没有得到回答 How to add claim to user dynamically?

【问题讨论】:

标签: c# asp.net asp.net-core cookies asp.net-identity


【解决方案1】:

我建议您使用自定义响应标头值或 cookie 来为给定会话保留此值。 看看这个问题是否有帮助:How to add a custom header

添加一个与会话过期相同过期的cookie,如本文所述:Create a cookie 希望这些帮助。

【讨论】:

  • 我会接受这个答案,因为这是我在问题中设定的标准的一个很好的解决方案。但是,我意识到,如果自定义声明不在数据库中,则不存在自定义声明之类的东西。您必须将一列添加到 Users 表或使用 userManager 将其添加到 Claims 表。如果它是一个新的用户列,则更容易管理我的 organizationId 的生命周期。如果用户登录不同的浏览器并选择不同的组织来模拟,securityStamp 也应该失效,这对我的用例很有好处。
猜你喜欢
  • 2017-10-27
  • 2018-06-23
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2011-01-25
  • 2018-08-31
相关资源
最近更新 更多