我遇到以下问题:我具有事件模型,其中包含有关事件和组织者(创建事件的用户-用户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);
}
答案 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