ASP.NET Core 身份声明与属性(效率角度)

myn*_*eff 6 asp.net entity-framework claims-based-identity asp.net-identity asp.net-core

我已阅读有关该主题的所有教程和问题,但它们相互矛盾

声明(userclaims 和 roleclaims)被序列化到 cookie 中(以及您通过覆盖原理工厂指定的自定义身份用户属性),但它们不会被查询,而是存储在 cookie 中,这意味着用户的声明越多有,服务器和浏览器之间往返的数据就越多

默认情况下,自定义身份用户属性不会被序列化,而是从数据库中查询,因此每次您需要该数据时,它都会从数据库中查询它,如果您经常查询它,则每个请求都需要在数据库上做更多工作

那么哪个更有效,哪个更安全

例如

IsAdmin 应该是一个角色/声明吗?但是如果有人偷了cookie,不,cookie已经包含userid/username/securitystamp,所以即使它是一个属性,被盗cookie上的userid也会查询自定义身份用户属性,或者有什么可以阻止这个 cookie 被盗后会无法工作吗?

另一个例子

如果我有 20 个用户属性(名字、姓氏、地址 1、地址 2、邮政编码,无论是什么情况),我是否应该让用户稍等一下,以便发回更大、更慢的 cookie或者我应该使用自定义身份用户从数据库完成所有工作

但是,如果我删除或添加对用户的声明,如果没有被查询,它是否会在下一个请求时更新,或者安全标记是否验证此 cookie 仍然有效?

因为在Task AddClaimsAsyncefcore 的用户存储中,它只将声明添加到 dbset

我很抱歉,我知道有很多问题要问,但有关此事的资源不是很好,人们很容易在阅读身份来源时迷失方向

tra*_*max 4

经验法则 - 将经常添加的项目作为声明,其他所有内容都可以存储在数据库中并按需查询。即地址1、地址2不能在每个请求中都需要,因此将它们保留在数据库中。

另一方面IsAdmin(无论如何应该是一个角色)我可以想象每个请求都会被检查,所以它应该在 cookie 中而不必查询数据库。

如果您担心您的 cookie 被盗,请不要向任何人展示!设置SecurityStampValidator为进行频繁检查 - 例如每 5 分钟一次。这基本上使用数据库中的最新信息更新 cookie 并更改 cookie。所以即使cookie被盗,它也只能工作5分钟。