在我的代码中可能是一些错误的逻辑,但我在C#中首先拥有最新的MVC EF代码。当我查看sql profiler和昂贵的查询时,我注意到它正在获取这样的查询:
exec sp_executesql N'SELECT [UserId] FROM [Users] WHERE (UPPER([Email]) = @0)',
N'@0 nvarchar(71)',@0=N'myRegisteredEmail@someDomain.com'
这是因为我经常要求WebSecurity.CurrentUserId
吗?我认为这需要一次,这一切都很好吗? (但我在一个页面中看到多个电话)。也许每个WebSecurity.CurrentUserId
的请求也会导致系统从数据库中获取ID,并将Email
作为识别用户的主要情况(我不希望这样)?
我有查询,其中一些外键是用户,但同样,Users
表的主键是UserId
,而不是电子邮件。为什么它会继续尝试通过电子邮件获取它?所以我也抓了那个想法。
因此,我无法追踪它会多次获取的原因。
最后,这些查询需要花费四分之一秒。添加几次,页面加载速度很慢。
答案 0 :(得分:1)
根据您提供的内容,WebSecurity.CurrentUserId似乎每次都会调用数据库。为了最小化数据库调用,您应该将值存储到Session变量中。查看how safe is it to use session variables - asp.net / c#以查看之前关于会话安全性的讨论。
如果您的应用程序中的安全性最高,例如在银行Web应用程序中,您可以查看http://msdn.microsoft.com/en-us/library/ms178201(v=vs.90).aspx以使会话安全性更加强大。
答案 1 :(得分:1)
如果你有最新的MVC + EF,这是否意味着你也在使用最新的身份框架Microsoft.AspNet.Identity?
如果是这样,您可以像这样获得用户的ID:
User.Identity.GetUserId();
...其中User是你的Controller,HttpContext等的IPrincipal。我很确定你必须使用OWIN代替FormsAuthentication才能得到它。
每次都不会访问数据库,因为用户ID存储为声明; OWIN IPrincipals是ClaimsPrincipals。