动态声明 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 和声明网站的身份验证