【问题标题】:MVC EF keeps looking for userId which is costlyMVC EF 一直在寻找代价高昂的 userId
【发布时间】:2014-02-07 03:32:22
【问题描述】:

也许这是我的代码中的一些错误逻辑,但我首先在 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,而不是电子邮件。为什么它会继续尝试通过电子邮件获取它?所以我也打消了这个念头。

因此我无法找到它会被多次获取的原因。

最后,这些查询最多需要四分之一秒。添加几次,页面加载速度很慢。

【问题讨论】:

  • WebSecurity.CurrentUserId 的代码是什么?它可能每次都调用数据库。
  • @rikitikitik 嗯,我不知道,是系统带来的价值,我无权控制。
  • 如果是这种情况,您可能应该将获得的值存储到 Session 中,这样您就不会一直调用它。在不知道CurrentUserId 中发生了什么的情况下,我们无能为力。
  • @rikitikitik 我需要知道的最后一件事:将 CurrentUserId 存储到 Session 中是否安全?例如,我现在将使用新方法查询该用户的好友列表:会话中的值。它是否可以以某种方式被恶意更改,从而获得对该用户所有数据的访问权限,或者我可以通过每次需要时拉出 CurrentUserId 来相信它像以前一样安全?如果安全级别没有降低,请复制粘贴您在上一条评论中所说的内容,我很乐意接受此作为正确答案。

标签: c# sql-server asp.net-mvc performance entity-framework


【解决方案1】:

如果您拥有最新的 MVC + EF,这是否意味着您也在使用最新的身份框架 Microsoft.AspNet.Identity?

如果是这样,您可以像这样获取用户的 id:

User.Identity.GetUserId();

...其中 User 是您的 Controller、HttpContext 等上的 IPrincipal。我很确定您必须使用 OWIN 代替 FormsAuthentication 才能获得此功能。

这不会每次都访问数据库,因为用户 ID 是作为声明存储的; OWIN IPrincipals 是 ClaimsPrincipals。

【讨论】:

  • 你说得对,我没有使用 asp.net.identity,它似乎没有给出一个,而是更多关于如何开发我即将到来的项目的想法。我将很快使用信号器对其进行测试,这是我的应用程序的主要工具之一,希望它也可以与它一起使用 :) 谢谢你的回答 :)
  • 另一种选择是将用户 ID 写入加密的 cookie,SignalR 可以访问该 cookie,因为它随 Web 请求一起提供。但是我有一种强烈的感觉,如果你使用的是 OWIN + Microsoft.AspNet.Identity,你就不必这样做了。
  • 感谢您的回复,是的,我确实希望下一个我将使用该身份的项目,我会很好地使用 SignalR。但是,我一定会看看我当前的加密 cookie,因为我不会将它升级为身份。再次感谢。你真的很擅长为我指出重要的事情。
  • 是的,我终于找到了时间并进行了测试,SignalR 在新的身份系统上做得很好。谢谢。
【解决方案2】:

根据您提供的信息,看起来 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 以使会话安全性更加强大。

【讨论】:

  • 我尝试了基于会话的方法,它对某些应用程序非常有帮助,但它不适用于信号器集线器:/
  • 从技术上讲,如果您不进行自托管,您可以让会话与 SignalR 一起使用,尽管这既不简单也不推荐。
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
相关资源
最近更新 更多