我是一个小型练习项目Web应用程序的管理员,AngularJS前端从C#/ .NET WebAPI中提取其后端数据,我正在使用SimpleMembershipProvider处理安全性。
我怀疑我实现所述安全性的方式不是最好的(我告诉ASP.NET身份现在要走的路?)但这完全是另一个问题。
我非常困惑的问题是我偶尔会报告在给定页面上加载以显示特定用户的数据,它会返回其他人的数据。重新加载页面可以解决问题(显然)并且我无法自己复制场景,或者在发生这种情况的用户中找出特别一致的内容。
所显示的信息都不具备所有敏感性(应用程序只是已经公开的第三方API的友好前端)所以我对此没有处于恐慌模式,但我既关心又困惑并希望它得到修复。
以下是我的API控制器端点之一:
[Authorize]
public class UserController : ApiController
{
private static int _userId;
private readonly IUserProfileRepository _userProfileRepository;
public UserController()
{
_userProfileRepository = new UserProfileRepository(new DatabaseContext());
_userId = WebSecurity.GetUserId(User.Identity.Name);
}
public UserProfileDto Get()
{
return _userProfileRepository.GetUserProfileById(_userId).ToDto();
}
}
我非常感谢任何关于我可能在哪里出错或者可能导致间歇性不一致的反馈。 (如果处理这个问题的方式非常糟糕,笑声也可以接受。:P)
答案 0 :(得分:2)
更改Get
以检索用户ID而不是静态变量:
public UserProfileDto Get()
{
return _userProfileRepository.GetUserProfileById(WebSecurity.GetUserId(User.Identity.Name)).ToDto();
}
答案 1 :(得分:2)
静态类字段由同一AppDomain的所有实例/线程共享(在您的情况下 - 进程)。并行运行的线程处理不同的http请求。 [几乎]同时运行的任何两个线程可能(将)更改_userId
的值。您正在控制器的构造函数中分配_userId
,并为UserController
要响应的每个http请求创建此控制器的新实例。因此,此分配将多次发生。
您将很难复制此问题,因为您是测试代码的单个用户,因此没有重叠的请求线程。
从控制器类的static
字段声明中删除_userId
说明符。
注意:确保DatabaseContext
被处置掉。可以用于此的一个地方是覆盖Controller.Dispose
。