如何动态添加对用户的声明?

时间:2016-11-07 01:59:48

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

我希望在登录后或登录期间保存一些关于用户的小信息(例如,用户的设备ID)。这个数据是动态的,我希望查找速度非常快(没有数据库命中),因为我需要在许多控制器中使用它。我尝试将其添加到用户的声明中:

((ClaimsIdentity)User.Identity).AddClaim(new Claim("UserDeviceId", userDeviceId));

随后在任何控制器中检索它:User.FindFirstValue("UserDeviceId")。但似乎请求之间不存在数据!它在另一个HTTP请求上返回NULL。

我使用标准的SingInManager.PasswordSignIn()来签署用户。我根本没有声明存储 - 我不使用默认的身份EF实现,我提供自己的存储(IUserStore,IUserPasswordStore和IUserRoleStore实现) )。但即使我这样做,这些数据也是动态的,根本不应该保存到存储器中/从存储器中检索。登录时可以获得数据(基本上是客户端应用程序发送硬件ID)。

根据我的理解,动态添加的声明会被删除,因为它永远不会被注入到cookie中,当我将它添加到User.Identity时,它只会添加到内存中的实例,这会被下一个cookie覆盖请求。 (或者至少这是我最好的猜测)。

这个问题有解决办法吗?我真的很想避免设置Session机制,我只需要在请求中保持单个小值,即使严格来说它可能不完全符合“用户声明”,它(概念上)非常接近 - 它是用户当前连接的设备ID。

我在我的控制器中使用User.FindFirstValue(ClaimTypes.NameIdentifier)来获取userId而不会对性能产生任何影响,并且非常方便。这显然是由身份本身设置的。我想为另一个标识符设置类似的机制,最好不要重写Asp.Net Identity的一半:)这是可行的吗?如果没有,那么我最好的选择是什么(除了设置会话存储或在每个请求中提供值)?

0 个答案:

没有答案