在 asp 身份声明和会话数据之间进行选择

Posted

技术标签:

【中文标题】在 asp 身份声明和会话数据之间进行选择【英文标题】:choose between asp identity claims and sessions data 【发布时间】:2016-05-15 20:10:54 【问题描述】:

我正在尝试在将用户特定数据作为身份声明或会话数据存储在我的 MVC 应用程序中之间做出选择,以减少请求时数据库往返的次数和频率。但是,考虑到性能、安全性和其他最佳实践方面的考虑,我不知道该走哪条路。

我将不胜感激任何关于此的建议。

【问题讨论】:

会话会阻止并发的 ajax 请求,而身份不会。 这在 asp.net 核心中发生了变化,它不使用锁。但是,对于会话 LoadAsync() 的异步加载,必须在访问会话值之前调用。 docs.microsoft.com/en-us/aspnet/core/fundamentals/… 【参考方案1】:

根据我对声明、cookie 和存储规则的了解,IMO(这只是我的观点):

性能方面,我从未见过 Claims 和 Session 存储之间的区别(除非 cookie 因大量声明而变大),就速度而言,它们似乎都具有相同的性能影响(它们都必须去从某个地方查找数据(CLaims = cookie,会话 = 服务器驱动器存储)作为最佳实践,您需要存储多少数据。

根据我的经验(如果我错了,请纠正我),但会话数据存储在服务器的磁盘上,基本上只有您的服务器硬盘驱动器可用空间用于大小限制等,而 cookie 确实有一个硬编码数据大小限制和存储的声明越多,cookie 就越大,因此如果您说最大化该 cookie,客户端可能会看到性能下降,因为它在 每个中发送整个 cookie 数据> 对站点的请求,与 Session 一样,服务器在本地查找数据,浏览器发送的数据较少。

所以我对最佳实践的看法是,如果您保存数据库查找的持久数据占用空间很小,那么真的没有最佳实践,只需使用您喜欢的任何内容,但是如果您存储一个 lot 位,尤其是字符串,然后会话在我看来是最佳实践,因为它可以节省客户端/服务器之间的数据往返,并且没有您可能在某个时候遇到的大小限制,然后拉出你的头发想知道为什么你的数据不存在(过去我自己这样做过,因为如果 cookie 太大,客户端会默默地拒绝它并花了 3 天时间才弄清楚它是 cookie 的大小)

【讨论】:

【参考方案2】:

如何为应用存储用户数据在很大程度上取决于应用本身。但作为指导,使用基于声明的身份验证并将声明存储在会话 cookie 中是一种非常常见的方法。看看 asp.net 身份 - http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

您应该能够优化存储在会话 cookie 中的数据。例如: - 如果您的应用程序总是需要在每个页面上显示用户的名称,您可以在会话 cookie 中声明名称。但是,如果您只需要在一个“用户资料”页面中显示其他用户信息,如地址、公司等...,您可以使用会话 cookie 中存储的“名称标识符”声明在数据库中查询这些详细信息。如果您查看 ASPNET 身份,您会发现您不需要直接使用会话 cookie,因为 cookie 身份验证中间件确保声明可通过 MVC 控制器的用户属性(或 ClaimsPrinciple.Current)获得。您应该通过 User 属性决定哪些声明应可用于所有请求,以及应通过某些 userInformation 数据库查询哪些用户属性。当然,您应该将密钥(名称标识符或电子邮件)存储到声明中的 userInformation 数据库中,以便您可以随时查询数据库。

【讨论】:

感谢您的回复。但是,我已经阅读了链接,但它没有回答我的问题。我已经知道索赔。我在我的项目中使用声明,但我也知道那些存储为声明的用户特定属性也可以存储在会话中,并且在这两种情况下都可以保存到数据库的往返行程。但是,我的问题是澄清哪种方法在最佳实践和性能方面更好*。 **您发布的链接没有回答这个问题 我会尝试解释更多。查看更新的答案 我完全理解您所解释的概念,尽管我很想赞扬您出色的解释技巧。但是,这不是我感到困惑的领域。因此,我需要澄清的是:考虑到最佳实践和应用程序性能,将该用户名存储为new Claim(ClaimTypes.UserName,"username"); 和将其存储为Session[UserName]="username" 有什么区别? 对不起,我想我还是没明白你的问题。您将声明 new Claim(ClaimTypes.UserName,"username"); 存储在哪里?总的来说,我认为Session[userName] = "username" 不是最佳做法。 我和 Uche Ndukwe 在一起。你的答案根本不清楚。您可以使用 CLAIMS 或使用 SESSION 存储来自用户的数据。最好的方法是什么?为什么?

以上是关于在 asp 身份声明和会话数据之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 身份会话 cookie 的安全性如何?

Asp.Net MVC 2中会话超时时的确认

在ASP.NET Core中轻松使用JwtBeare进行身份验证

ASP.NET 标识和声明

选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?

asp.net cookie、身份验证和会话超时