我已经阅读了有关该主题的所有教程和问题,但它们相互矛盾
声明(用户声明和角色声明)被序列化到 cookie 中(以及通过重写主体工厂指定的自定义标识用户属性),但它们不会被查询,它们存储在 cookie 中,这意味着用户拥有的声明越多,服务器和浏览器之间往返的数据就越多
默认情况下,自定义标识用户属性不会被序列化,而是从数据库中查询,因此每次需要该数据时,它都会从数据库中查询它,如果您经常查询它,则在每个请求的数据库上要做更多工作
那么哪个更有效,哪个更安全
例如
管理员应该是一个角色/声明? 但是,如果有人偷了 cookie,不不,cookie 已经包含用户 ID/用户名/安全标记,所以即使它是一个属性,被盗 cookie 上的用户 ID 也会查询自定义身份用户属性,或者有什么东西会阻止这个 cookie 在被盗时工作?
另一个实例
如果我有 20 个用户属性(名字、姓氏、地址 1、地址 2、邮政编码,无论情况如何),我应该让用户稍等片刻,以便来回发送一个更大的慢速 cookie,还是应该使用自定义身份用户从数据库完成所有工作
但是,如果我删除或向用户添加声明,如果没有查询到它,它是否会在下一个请求中更新,或者安全标记是否验证此 cookie 仍然有效?
因为在 efcore 的用户存储Task AddClaimsAsync
,它只将声明添加到数据库集
我很抱歉,我知道这有很多问题要问,但关于这个问题的资源不是那么好,很容易迷失阅读身份来源
经验法则 - 将经常添加的项目作为声明,其他所有内容都可以存在于数据库中并按需查询。 即地址 1,地址 2 不能在每个请求中都需要,因此请将它们保存在数据库中。
另一方面,我可以想象IsAdmin
(无论如何都应该是一个角色)将在每个请求上检查,因此它应该在cookie中,而无需查询数据库。
如果你害怕你的饼干被偷,不要给任何人看!将SecurityStampValidator
设置为频繁检查 - 例如每 5 分钟一次。这基本上是使用数据库中的新信息更新cookie并更改cookie。因此,即使饼干被盗,它也只能工作 5 分钟。
我认为这两个陈述并不矛盾,这取决于您的配置。第二条声明提到"默认"。
您不需要将所有信息存储在索赔中,也不需要一直使用所有信息。如果需要配置文件信息,请调用服务器一次并将信息存储在客户端上,或者仅在需要时获取。
如果您想根据权限显示/隐藏元素,则授权也是如此。这可能包括一个名为"IsAdmin"的标签。授权应靠近资源。
如果您的客户端想要刷新信息,只需调用服务器即可。声明不会在每个请求期间更新。通常,用户必须注销并重新登录。因此,声明并不灵活,因此不适合可以(经常)更改的属性。
至于安全,客户端可以更改信息并不重要,它仅用于显示。它不会更改后端中的权限。
如果在每个页面中都显示显示名称,则可以考虑向属性添加类似显示名称的内容。您还可以考虑实现缓存来限制数据库调用。最后,这真的取决于您的要求。
至于被盗的cookie,您需要对服务器实施额外的安全性以检测可疑行为。您可能希望包含 IP 地址作为声明。至于管理员,添加安全性,例如按IP地址过滤和/或使用通过电子邮件发送的附加代码。