【问题标题】:asp.net custom membership provider many calls to GetUser() make the application slowasp.net 自定义会员提供程序对 GetUser() 的多次调用使应用程序变慢
【发布时间】:2012-11-21 10:02:51
【问题描述】:

我正在开发一个门户系统来共享信息和文档等。每个用户可以有多个配置文件。每个配置文件因此可以具有不同的角色和权限。现在一切正常,但我对 MembershipProvider 和 MembershipUser 有疑问。

我将自定义 MembershipProvider 和 MembershipUser 与 OpenAccess ORM 结合使用。

我非常依赖(CustomMembershipUser)Membership.GetUser()。例如,我构建了一个用户菜单,他们可以在其中查看他们登录的用户以及他们可以从哪些配置文件中选择。

要构建此菜单并收集当前配置文件的组、角色和权限,需要从代码中的不同位置多次调用Membership.GetUser()。我首先缓存了用户并根据 ProviderUserKey 返回了这个,但我被告知这是不安全的。所以我删除了缓存,但速度要快得多。是否有替代的最佳实践?

【问题讨论】:

  • 我正在考虑将 Membership.GetUser() 存储在 HttpContext.Items["MembershipUser"] 中,这将减少对每个请求的调用。不确定这是否是一个安全的解决方案。

标签: c# asp.net asp.net-membership telerik-open-access


【解决方案1】:

对于您的情况,没有 100% 的解决方案,您要么缓存结果,要么每次都计算它。折衷方案是非常小心地配置缓存策略,如果缓存会对您的应用程序造成风险。

Afaik,缓存在极少数情况下会导致风险,只有当您必须立即应用更改时。考虑使用一些高级缓存策略,例如cache dependency

【讨论】:

  • 感谢您为我指明方向。我将研究缓存依赖关系。
【解决方案2】:

根据您的描述,Session 是一个合适的解决方案。它足够安全。 HttpContext.Items["MembershipUser"] 仅将用户信息保留在一个 http 请求中,而会话保留信息直到会话到期。

缓存,但是是每个应用程序而不是每个用户

【讨论】:

  • 我知道 Context.Items 的生命周期。胜利将是对数据库的一次调用,而不是每个请求多次。我也会考虑会议。我会做一些测试用例。谢谢!
  • 啊,我记得我为什么从 Session 转移到 Cache。在 HttpModule 执行期间会话尚不可用。所以我返回缓存,并将跟随 Johnny_D 缓存依赖。我应该再次阅读我自己的文档。还是谢谢!
  • 感谢您的反馈。您提到您出于安全原因删除了缓存。我看不出使用缓存依赖如何提高安全性。
  • 对您无法访问会话感到困惑。我很确定使用自定义会员提供程序时会话可用。
  • 我理解你的困惑。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多