【问题标题】:How to manage multiple calls to Membership.GetUser() efficiently如何有效地管理对 Membership.GetUser() 的多次调用
【发布时间】:2010-12-20 18:17:45
【问题描述】:

我多次调用 Membership.GetUser() 并且似乎找不到任何内置的东西来解决这个问题(没有多次访问数据库)。

我首先研究了静态变量,然后才意识到这不合适。我知道我可以使用会话,但我需要对用户 ID 进行散列/加密以使其安全,这很好,但我不想在不检查 .net 成员资格中是否有内置方式来执行此操作的情况下执行此操作提供者

是否有一种内置方法可以记住像 UserID 这样的值并为当前用户安全地存储该值?

【问题讨论】:

  • 如果你把它扔到会话中,为什么你需要加密用户ID?
  • 不能有人欺骗价值吗?是否所有会话数据都存储在服务器端并在客户端引用?
  • @Andi 会话对象只存在于服务器上。发送给客户端的唯一内容是会话 ID。
  • 我误解了这一点,认为它可能是基于 cookie 的(从我以前的 PHP 编码时代就有这个想法)感谢您清除它
  • 在单个请求期间,虽然会话没问题。

标签: c# .net asp.net-mvc-2 asp.net-membership


【解决方案1】:

我建议使用Singleton-per-Request pattern,它使用HttpContext.Items 属性。

public class UserPerRequest
{
    /// <summary>
    /// Returns the result of Membership.GetUser(), but will cache the results within the
    /// current request so it's only called once per request.
    /// </summary>
    public static MembershipUser Current
    {
        get
        {
            const string key = "UserPerRequest";

            if (HttpContext.Current.Items[key] == null)
                HttpContext.Current.Items[key] = Membership.GetUser();

            return (MembershipUser)HttpContext.Current.Items[key];
        }
    }
}

因此,无论您在哪里调用Membership.GetUser(),只需调用UserPerRequest.Current。在请求期间您仍然会多次调用数据库的唯一情况是Membership.GetUser() 返回 null。

【讨论】:

  • 我认为文章中的代码效率稍高一些,因为它不必在集合中查找新添加的项目,但我认为我的版本对于 SO 来说更容易阅读。跨度>
  • 对这种方法有任何 cmet 吗?
【解决方案2】:

Membership.GetUser() 是对 MembershipProvider 类方法的间接调用:

public abstract MembershipUser GetUser(string username, bool userIsOnline);

因此,您可以编写一个派生自您正在使用的 MembershipProvider 的类(例如 SqlMembershipProvider 或 ActiveDirectoryMembershipProvider,或自定义的),并使用一些巧妙的缓存机制覆盖此方法。

然后您需要更改 web.config 以声明这个新的 MembershipProvider 类:

<membership defaultProvider="MyProvider">
    <providers>
        <clear/>
        <add name="MyProvider" type="...MyProvider" ... />
    </providers>
</membership>

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 2016-12-26
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2010-10-04
    • 2013-09-14
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多