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分钟
我已经阅读了关于该主题的所有教程和问题,但它们相互矛盾
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分钟