我有以下方法
[Authorize]
public async Task<IActionResult> Edit(int? id)
{
if (id == null) return NotFound();
//EF bug workaround
var activities = (await _context.Activities.AsNoTracking().ProjectTo<ProgramActivityViewModel>()
.Where(m => m.Id == id).ToListAsync()).SingleOrDefault();
if (activities == null) return NotFound();
if (activities.ActivityCoverageArea.Any())
activities.PhysicalLocation = activities.ActivityPhysicalLocation != null;
PopulateActivitiesModel(activities);
return View(activities);
}
当用户在浏览器URL中点击此方法时,他会看到此链接。
http://localhost:52580/Activity/Activity/Edit/117
我的问题是,如果用户在浏览器中手动输入ID 125而不是117,他可以看到与他无关的数据。我的意思是他可以看到同级的同行数据,可能正在向不同的经理报告。 如何限制用户执行此操作?
要传递的ID是活动ID而不是用户ID,一个用户可以有多个活动ID。问题是,她不应该看到其他用户的活动。
答案 0 :(得分:0)
您需要获取当前已登录用户的userId并针对您的数据进行测试。 如果数据不属于当前用户,则只需返回403或自定义错误页面。
如果您使用的是较新的内置MVC身份验证系统,则它应该很简单: User.Identity.GetUserId();
如果整个代码中都存在此类问题,那么我建议将userId存储在基本控制器中或以可轻松访问的视图状态,而不必每次都在数据库中遇到额外的请求。