【问题标题】:How to extend the asp.net User.Identity Property?如何扩展 asp.net User.Identity 属性?
【发布时间】:2010-07-30 22:34:17
【问题描述】:

我不是在谈论 asp.net 会员资格。

对于每个登录的用户,我想从数据库中缓存一些属性,例如状态或好友请求的数量。

我可以创建自定义类,但我认为扩展现有的 User.Identity 属性会更好。
像这样的:

Label1.Text = User.Identity.Status;

有可能吗?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    可以通过定义您自己的IIdentity(也可能还有IPrincipal)并在为HTTP 请求创建IPrincipal 时构造它。我相信这样做的正确位置是在引发 PostAuthenticateRequest 事件时。

    另一个 stackoverflow 问题的答案解释了如何做到这一点 - ASP.NET set custom identity or principal(它表示 MVC,但都经过相同的处理管道)。

    【讨论】:

      【解决方案2】:

      根据您的示例,我认为您应该在会话数据中缓存状态和好友请求数量等内容。

      使用 Identity 进行缓存的可能缺点是,如果我没记错的话,每个请求都会导致创建一个新的 Identity 实例。因此,对于每个请求,您都需要从某个地方重新填充这些 Identity 值,无论是数据库还是您已经缓存了数据的某个地方。

      【讨论】:

      • 感谢您的回复。所以我应该简单地创建自己的类来缓存这些属性?什么会更好的会话或服务器缓存?
      • @Adir,取决于您的要求。当会话到期时,您不再需要缓存的数据,因此它将随会话自动清理。此外,如果您的目标是网络场,会话将在服务器之间迁移(假设您使用的是外部会话状态),并且缓存数据将在您需要时可用。服务器缓存当然可以很好地工作,但是生命周期将独立于会话生命周期,这确实具有刷新缓存的逻辑非常简单的优点,如果数据不在缓存中,则重新读取它,例如。每 10 分钟一次。
      • 每个请求确实从 FormsAuthentication 票证中重构了 IPrincipal 和 IIdentity。你可以有一个IIdentity,它的方法简单地从一个源检索朋友请求的数量,无论是在会话中还是从另一个数据源,这样,你就不会在实际的身份验证cookie中存储任何数据。
      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多