2010-11-18 141 views
1

我创建了自定义会员供应商,对我来说,在MembershipUser.ProviderUserKey而不是UserName上操作更方便。因此,要检索ProviderUserKey我执行这样的代码:ASP.NET User.Identity.Name替代方案?

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

然而,当执行GetUser()方法,用户必须将数据从数据库中检索,这是窃听我。这对于服务器时间来说是不必要的浪费,不管这段时间有多短,我都想避免它。

有没有其他方法可以以更方便的方式获得ProviderUserKey,例如在User.Identity.Name的情况下?

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

谢谢。

回答

5

成员API正在击中数据库,因为它是存储此信息的唯一位置。 User.Identity.Name正从每个请求发送的cookie中获取登录的用户名。您可以实施自定义通用委托人并将必要信息存储到在Cookie中加密的身份验证票证的userData部分中。以下是涵盖此主题的article

+0

谢谢,你能指点我一些相关的信息如何做到这一点?我发现的所有问题都涉及.NET 1.1,我希望在3.5版本的框架中做到这一点。 – Wodzu 2010-11-18 11:10:03

+0

这是[一篇文章](http://www.xoc.net/works/tips/forms-authentication.asp),它演示了如何使用GenericPrincipal并在Cookie中存储附加信息。这个想法是用这个自定义主体替换HttpContext.Current.User,以便它可以在任何地方访问。 – 2010-11-18 11:12:21

+0

谢谢,但据我了解这个例子是基于自己的控制。我将不得不重写标准行为......如果我正在使用标准登录控件,该怎么办?我不能扩展某些类以公开一个属性,以稍后在我的应用程序中以方便的方式进行修改吗? – Wodzu 2010-11-18 11:20:06

3

从数据库中读取ProviderUserKey当他们第一次登录并将其存储在用户的会话集合中时?在随后的请求中,您可以在不访问数据库的情况下从会话中获取它。

+0

我在想同样的事情,但更优雅的方式是扩展某种身份类... – Wodzu 2010-11-18 12:28:43

+0

扩展身份类的问题是您无法让用户拥有您的身份类而不是它自己的身份类,所以你必须创建自己的IPrincipal。在这一点上,你必须考虑到所有这些自定义代码的潜在问题超过了非常小的性能增益。 – Greg 2010-11-18 14:37:45