MVC自定义授权属性

时间:2018-07-20 16:02:00

标签: authentication model-view-controller

我有以下方法

[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。问题是,她不应该看到其他用户的活动。

1 个答案:

答案 0 :(得分:0)

您需要获取当前已登录用户的userId并针对您的数据进行测试。 如果数据不属于当前用户,则只需返回403或自定义错误页面。

如果您使用的是较新的内置MVC身份验证系统,则它应该很简单: User.Identity.GetUserId();

如果整个代码中都存在此类问题,那么我建议将userId存储在基本控制器中或以可轻松访问的视图状态,而不必每次都在数据库中遇到额外的请求。