【问题标题】:ASP.NET User.Identity.Name alternative?ASP.NET User.Identity.Name 替代方案?
【发布时间】:2010-11-18 10:57:48
【问题描述】:

我已经创建了自定义会员提供程序,并且我使用MembershipUser.ProviderUserKey 而不是用户名更方便。所以,要检索ProviderUserKey,我执行这样的代码:

if (User.Identity.IsAuthenticated)
{
  int UserID = (int)Membership.GetUser(User.Identity.Name).ProviderUserKey;
}

但是,当执行GetUser() 方法时,必须从数据库中检索用户数据,这让我很烦恼。这是对服务器时间的不必要的浪费,不管这个时间有多短,我都想避免它。

有没有其他方法可以更方便地获取ProviderUserKey,例如User.Identity.Name 的情况?

我想听听你的想法。您如何在您的网页上解决此问题?

谢谢。

【问题讨论】:

    标签: asp.net membership-provider membershipuser


    【解决方案1】:

    Membership API 正在访问数据库,因为它是存储此信息的唯一位置。 User.Identity.Name 正在从每次请求时发送的 cookie 中获取记录的用户名。您可以实现自定义通用主体并将必要的信息存储到身份验证票证的userData 部分,该部分在 cookie 中加密。这是涵盖此主题的article

    【讨论】:

    • 谢谢,你能给我一些相关的信息吗?我发现的所有问题都涉及 .NET 1.1,我想在 3.5 版本的框架中执行此操作。
    • 这里是an article,它说明了如何使用 GenericPrincipal 并将附加信息存储在 cookie 中。这个想法是用这个自定义主体替换 HttpContext.Current.User 以便它可以在任何地方访问。
    • 谢谢,但据我了解,此示例基于制作自己的 loign 控件。我将不得不覆盖标准行为......如果我使用标准登录控件怎么办。我不能扩展某个类以公开一个更多属性,以便稍后在我的应用程序中以一种方便的方式引用它吗?
    • 登录控件的作用并不大,而且很容易替换。或者,您可以使用msdn.microsoft.com/en-us/library/… 事件来执行此操作。
    【解决方案2】:

    当他们第一次登录时从数据库中读取ProviderUserKey并将其存储在用户的会话集合中?在后续请求中,您可以直接从会话中获取它,而无需进入数据库。

    【讨论】:

    • 我也在考虑同样的问题,但更优雅的方法是以某种方式扩展 Identity 类...
    • 扩展 Identity 类的问题是你无法让 User 拥有你自己的身份类而不是它自己的,所以你必须创建自己的 IPrincipal。此时,您必须考虑到所有这些自定义代码的潜在问题都超过了非常小的性能提升。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多