У меня следующая проблема: у меня есть модель событий, которая содержит данные о событии и организаторе (пользователь, который его создал - идентификатор пользователя).Я хочу сделать возможность Редактировать / Удалить это событие только создателем.Я не знаю, как сравнить идентификатор пользователя из базы данных с идентификатором реального пользователя, который хочет выполнить действие.
Должен ли я добавить авторизацию в методах редактирования / удаления в Event Model Controler или есть другой способпроверить этот идентификатор?
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>
На данный момент,Только создатель может видеть опции Edit и Delete в списке событий, но у всех есть доступ к этим методам.
ОБНОВЛЕНИЕ
Мое окончательное решение: я добавил метод "getUser" в EventsModel.Когда пользователь хочет вызвать метод Edit или Delete - я проверяю текущий идентификатор пользователя с идентификатором, записанным в объекте.
Фрагмент 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);
}