asp.net 核心身份声明与属性(效率观点)

asp.net core identity claims vs properties (efficiency point of view)

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

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

自定义身份用户 属性 默认情况下不会序列化,但会从数据库中查询,因此每次您需要该数据时,它都会从数据库中查询 这样工作量更大如果您经常查询数据库,则在每次请求时对数据库执行此操作

所以哪个更高效哪个更安全

例如

IsAdmin 应该是 role/claim?但是如果有人偷了 cookie,不,cookie 已经包含 userid/username/securitystamp,所以即使它是 属性,被盗 cookie 上的用户 ID 也会查询自定义身份用户 属性 ,或者有什么东西可以阻止这个 cookie 在被盗时工作?

另一个实例

如果我有 20 个 属性 用户(名字、姓氏、地址 1、地址 2、邮政编码,无论如何),我应该让用户稍等一下吗为了来回发送更大更慢的 cookie,或者我应该使用自定义身份用户

从数据库中完成所有工作

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

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

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

我认为这两种说法并不矛盾,这取决于你的配置。第二个语句提到 "by default".

您不需要在索赔中存储所有信息,也不需要一直需要所有信息。如果你想要个人资料信息,调用服务器一次并将信息存储在客户端,或者只在需要时获取。

如果您想根据权限显示/隐藏元素,授权也同样重要。这可能包括一个名为 "IsAdmin" 的标签。授权应该靠近资源。

如果您的客户端要刷新信息,只需调用服务器即可。索赔不会在每次请求期间更新。通常,用户必须注销并重新登录。所以 Claims 不灵活,因此不太适合可以(经常)更改的属性。

至于安全,客户端可以更改信息并不重要,只是为了显示。它不会更改后端的权限。

如果您要在每个页面中显示,您可以考虑在属性中添加显示名称之类的内容。您还可以考虑实施缓存以限制数据库调用。最后真的要看你的要求了。

至于被盗的 cookie,您需要对您的服务器实施额外的安全措施以检测可疑行为。您可能希望将 IP 地址包含在声明中。至于管理员,添加安全性,例如按 IP 地址过滤和/或使用通过电子邮件发送的附加代码。

经验法则 - 将经常添加的项目作为声明,其他一切都可以存在于数据库中并按需查询。 IE。地址 1,地址 2 不能在每个请求上都需要,所以将它们保存在数据库中。

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

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