- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我网站的用户昨天遇到了一些奇怪的行为(我第一次看到这个问题),不幸的是我没有太多的错误日志来试图弄清楚发生了什么。该网站同时在线的人数高于正常水平,尽管在宏伟的计划中人数并不多(可能有 50 到 100 名用户都在尝试执行类似的功能)。我无法在我的开发环境中重现该问题,以前从未见过,也不知道为什么会这样。
问题的症结在于用户可以注册或登录成功,但少数用户可以看到其他用户的数据。
网站是 ASP.NET MVC 3。
用户正在登录,我设置了身份验证 cookie - 这是登录操作:
[HttpPost]
public ActionResult LogOn(AccountLogOnViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (!Membership.ValidateUser(model.UserName, model.Password))
{
ModelState.AddModelError("login-message", "Incorrect username or password");
}
}
if (ModelState.IsValid)
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
Session.Remove("MenuItems");
return Redirect(returnUrl ?? Url.Action("Index", "Home"));
}
else
{
model.ReturnUrl = returnUrl;
return View(model);
}
}
AccountLogOnViewModel 是一个简单的对象,具有两个字符串属性,UserName 和 Password。
据我所知,这很好 - 如果您以 NickW 身份登录,然后正确地执行 User.Identity.Name 之类的操作,您就会得到“NickW”(当用户看到其他用户的数据时,他们报告说“Welcome , NickW"屏幕上的文本向他们显示了正确的值 - 这是使用 User.Identity.Name 写出的)
该网站还使用自定义成员(member)资格提供商。它覆盖 ValidateLogin 方法和 GetUser 方法。 ValidateLogin 似乎工作正常,所以我并不担心。
重写的GetUser方法如下:
public override MembershipUser GetUser(string username, bool userIsOnline)
{
User user = _userRepository.Users.FirstOrDefault(u => u.UserName == username);
MembershipUser membershipUser = null;
if (user == null)
return membershipUser;
membershipUser = new MembershipUser(this.Name,
user.UserName,
user.Id,
user.Email,
null,
user.Comments,
user.IsActivated,
user.IsLockedOut,
user.CreatedDate,
user.LastLoginDate,
user.LastLoginDate,
user.LastModifiedDate,
Convert.ToDateTime(user.LastLockedOutDate));
return membershipUser;
}
所以我试图从我的数据库中检索一个 User 对象,并使用它来创建一个新的 MembershipUser 对象。我的数据库用户表在成员(member)提供者所需的列之上有额外的列 - 例如姓名、地址、电话号码等
在网站其余部分的不同位置(例如,如果您转到个人资料页面),我从数据库中检索一个用户对象并使用它来填充屏幕。我用来检索用户对象的行是:
User user = userRepository.Users.FirstOrDefault(u => u.UserName == Membership.GetUser().UserName);
这是 userRepository 的简化版本(即只删除不相关的代码)。
public class SqlUserRepository : IUserRepository
{
private Table<User> usersTable;
private string _connectionString;
public SqlUserRepository(string connectionString)
{
_connectionString = connectionString;
usersTable = (new DataContext(connectionString)).GetTable<User>();
}
public IQueryable<User> Users
{
get { return usersTable; }
}
public void CreateUser(AccountRegisterViewModel user)
{
User newUser = new User();
newUser.UserName = user.UserName;
newUser.Salutation = user.Salutation;
newUser.PhoneNumber = user.PhoneNumber;
newUser.SecondaryPhoneNumber = user.SecondaryPhoneNumber;
newUser.FirstName = user.FirstName;
newUser.LastName = user.LastName;
newUser.PasswordSalt = CreateSalt();
newUser.Password = CreatePasswordHash(user.Password, newUser.PasswordSalt);
newUser.Email = user.Email;
newUser.CreatedDate = DateTime.UtcNow;
newUser.Comments = "Created from web registration";
newUser.LastModifiedDate = DateTime.UtcNow;
newUser.LastLoginDate = DateTime.UtcNow;
newUser.IsActivated = true;
newUser.IsLockedOut = false;
newUser.MayContact = user.MayContact;
usersTable.InsertOnSubmit(newUser);
usersTable.Context.SubmitChanges();
}
}
所以在我看来,我设置的身份验证 cookie 没问题,但要么:当我第一次进入成员提供者的 GetUser() 方法时,它从数据库中检索了错误的记录,因此使用错误的用户名设置了一个 MembershipUser 对象;随后,当我在数据库中查找“这个”用户时,我实际上是在寻找错误的用户名。
或者:当我执行 userRepository.FirstOrDefault(x => x.UserName == Membership.GetUser().Name) 时,它会间歇性地检索到错误的记录。
或者:我没有想到的其他错误。
正如我所说,这似乎是站点负载不足时的问题,所以我想知道这是否是某处的某种缓存问题?但我真的不知道。
我的一个想法是更改我检索用户的方式,以防问题出在成员(member)提供者身上,并改用它:
userRepository.FirstOrDefault(x => x.UserName == User.Identity.Name)
// or HttpContext.Current.User.Identity.Name if not within a controller
但实际上我什至不确定发生了什么,所以不知道这是否能解决问题。可能是某个地方的缓存问题吗?看起来(但我不能 100% 确定)当用户 A 可以看到用户 B 的详细信息时,用户 B 总是在系统中处于事件状态(或者在过去 20 分钟内处于事件状态)。
我知道这是不可能的,但有谁知道这是怎么发生的吗?显然这是一个主要问题,需要紧急修复,但不知道为什么会发生,我无法修复它!
在此先感谢您的帮助,尼克
最佳答案
一些需要考虑的事情:
不使用 FirstOrDefault
,而是使用 SingleOrDefault
。 FirstOrDefault
假定将有超过 1 条数据记录与您的查询相匹配。由于您是按用户名查询,因此应该只有 1 个匹配行,对吗?在这种情况下,请改用 SingleOrDefault
。当有多行匹配查询时,SingleOrDefault
会抛出异常。
要获取用户名,请使用 User.Identity.Name
而不是调用 Membership.GetUser().UserName
。 MVC Controller 上的 User
属性引用一个 IPrincipal
,它应该与用户的表单例份验证 cookie 值相匹配。由于您有一个自定义成员资格提供程序,这应该有助于消除其方法作为问题的根源。
如果您为 MVC 项目设置了缓存,则可能会出现缓存问题。您是否在任何 Controller 或操作方法上使用了 OutputCacheAttribute
([OutputCache]
)?您是否在 global.asax 文件中将其设置为全局过滤器?还是您认为可能存在某种基于 SQL 的缓存?
查看您重写的 GetUser
方法,我发现它应该采用 2 个参数:string username
和 bool isOnline
。但是,当您使用 Membership.GetUser().UserName
调用它时,您没有传递任何参数。您是否有另一个不带参数的此方法的覆盖重载?它是什么样子的?它是否使用 System.Threading.CurrentPrincipal.Identity.Name
在未传递任何用户名时嗅探出当前用户名?
关于c# - 用户能够看到其他人的详细信息。 FirstOrDefault 返回错误的记录?还是缓存问题?帮助! :),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100574/
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!