【问题标题】:asp.net core identity claims vs properties (efficiency point of view)asp.net 核心身份声明与属性(效率观点)
【发布时间】:2017-10-27 23:40:17
【问题描述】:

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

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

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

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

例如

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

另一个实例

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

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

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

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

【问题讨论】:

    标签: asp.net entity-framework asp.net-core asp.net-identity claims-based-identity


    【解决方案1】:

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

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

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

    【讨论】:

    • 你能给我更多关于可以存储在声明中的示例吗?我仍然无法想象可以将什么作为声明,我也可以检查 cookie 最后一个 ip 是否更改为呈现此 cookie被偷了就没用了?
    • 正如我所说,任何经常需要的信息 - 将其放入 cookie 中。像PersonId(如果不同于userId),TeamId - 我在我的系统中使用它来决定权限。您也可以将 IP 放入 cookie 中并对 IP 进行过滤,但我不会这样做 - 想想那些 IP 地址可能经常更改的移动用户。只需每 2 分钟使用SecurityStampValidtor 刷新 cookie,就可以解决 cookie 被盗问题。
    【解决方案2】:

    我认为这两种说法并不矛盾,这取决于您的配置。第二个语句提到“默认”

    您不需要在索赔中存储所有信息,也不需要一直使用所有信息。如果您需要配置文件信息,请调用服务器一次并将信息存储在客户端上,或者仅在需要时获取。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2020-09-23
      • 2019-11-09
      • 2020-08-04
      • 2021-04-12
      • 2018-08-31
      • 2020-06-11
      • 1970-01-01
      • 2016-03-01
      相关资源
      最近更新 更多