通过数据库中记录的ID对用户进行身份验证

时间:2019-04-08 21:39:45

标签: c# asp.net-mvc

我遇到以下问题:我具有事件模型,其中包含有关事件和组织者(创建事件的用户-用户ID)的数据。我想只允许创建者编辑/删除此事件。我不知道如何将数据库中的用户ID与想要采取行动的真实用户的ID进行比较。

我应该在Events Model Controler的Edit / Delete方法中添加授权,还是有其他方法来检查此ID?

EventsModelController:

        [HttpPost]
        public async Task<IActionResult> Index(string placeString, string nameString, DateTime data, DateTime time)
        {
            if(HttpContext.User.Identity.IsAuthenticated) ViewBag.userID = HttpContext.User.Identity.Name.ToString();
            var events = from e in _context.EventsModel
                         select e;
            return View(await events.ToListAsync());
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("id,event_type,date,place,name,hour,tickets,tickets_per_person,organisator")] EventsModel eventsModel)
        {
            var userID = HttpContext.User.Identity.Name;
            eventsModel.organisator = userID;
            if (ModelState.IsValid)
            {
                _context.Add(eventsModel);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(eventsModel);
        }

我正在使用ViewBag显示要删除/删除(查看索引)的选项:

             <td>
                @if (ViewBag.userID == item.organisator)
                 {
                    <a asp-action="Edit" asp-route-id="@item.id">Edit</a> 
                 }
                | <a asp-action="Details" asp-route-id="@item.id">Details</a> |
                @if (ViewBag.userID == item.organisator)
                 {
                    <a asp-action="Delete" asp-route-id="@item.id">Delete</a>
                 }
            </td>

目前,只有创建者可以在事件列表中看到选项“编辑”和“删除”,但是每个人都可以使用此方法。

更新

我的最终解决方案: 我在EventsModel中添加了名为“ getUser”的方法。当用户想调用“编辑”或“删除”方法时-我正在检查当前用户ID与写入对象的ID。

EventsModelsController的片段:

        [Authorize]
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var eventsModel = await _context.EventsModel.FindAsync(id);
            if (eventsModel.getUser() != HttpContext.User.Identity.Name.ToString())
            {
                return RedirectToAction(nameof(Index));
            }
            if (eventsModel == null)
            {
                return NotFound();
            }
            return View(eventsModel);
        }

1 个答案:

答案 0 :(得分:0)

简单的答案是,有很多方法可以做到这一点。这取决于您希望视图的外观,但是如果您只想限制路由,则可以为该身份验证创建一个角色,例如

[Authorize(Roles = "organisator")]

中间件,也可以在这里使用。您应该能够通过添加要使用的策略和处理程序来检查上下文,以查看用户是否是所述事件的组织者,从而仅使用身份验证中间件。但是,如果您的项目不允许这样做,那么自定义可以达到相同的效果。

 services.AddAuthorization(options =>
        {
            options.AddPolicy("PolicyOrganisator", policy =>...);
        });

...猎人

if (context.User.userID == context.Request... ) 
{
    context.Succeed();
}

您也可以像在问题中提到的那样仅检入控制器。在模型中追加额外数据以标记此用户是否可以获取。

calss EventsModel {
 ...
 bool canEdit { get => userID == item.organisator; } 
}

如果这是您要限制的唯一途径,那么我看不出在方法顶部添加if语句以检查是否应重定向的问题。我在页面底部添加了链接,因为这些示例将改变对项目设置方式的依赖。

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2

https://docs.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes