动态声明 asp.net 核心身份没有数据库持久性

Posted

技术标签:

【中文标题】动态声明 asp.net 核心身份没有数据库持久性【英文标题】:Dynamic claims asp.net core identity no DB persistence 【发布时间】: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?

【问题讨论】:

你可以使用事件处理系统docs.microsoft.com/en-us/sql/relational-databases/… @Sultan 我看不出 MSSQL 的调试工具将如何帮助我在我的 cookie 中坚持声明。我的问题完全是关于 .net-core 的。 【参考方案1】:

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

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

【讨论】:

我会接受这个答案,因为这是我在问题中设定的标准的一个很好的解决方案。但是,我意识到,如果自定义声明不在数据库中,则不存在自定义声明之类的东西。您必须将一列添加到 Users 表或使用 userManager 将其添加到 Claims 表。如果它是一个新的用户列,则更容易管理我的 organizationId 的生命周期。如果用户登录不同的浏览器并选择不同的组织来模拟,securityStamp 也应该失效,这对我的用例很有好处。

以上是关于动态声明 asp.net 核心身份没有数据库持久性的主要内容,如果未能解决你的问题,请参考以下文章

通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证

ASP.NET 核心 1.0。 Bearer Token,无法访问自定义声明

ASP .NET CORE 2.2 JWT 和声明网站的身份验证

ASP.NET 身份声明

如何在 cookie 上保留 ASP.NET 身份声明直到注销?

如何获取 asp.net 身份以从​​数据库中获取对声明的更改?