Является ли свойство идентификатора в модели привязки угрозой для избыточного размещения? - PullRequest
0 голосов
/ 24 апреля 2019

Я довольно новичок в MVC и не могу разобраться с возможной угрозой чрезмерного распространения.У меня есть модель «Событие», которая содержит свойство Id.Когда пользователь, например, хочет отредактировать существующее «событие», я использую это свойство для извлечения «события», которое мне нужно обновить из коллекции «событий».

Я попытался украсить свойство Id с помощью атрибута [BindNever] или [Editable], в результате чего свойство Id стало равным 0, поскольку свойство больше не связывается после публикации.Это, конечно, создает проблемы, когда я хочу использовать это свойство Id для извлечения «события» из коллекции.

Поэтому я оставляю свойство незадекорированным.Но это кажется неестественным, так как это свойство не должно редактироваться пользователем.Использование ViewModel не решает мою проблему, так как свойство Id все равно будет необходимо.

Во всех примерах, которые я нахожу в сети, свойство Id всегда является частью модели привязки.Представляет ли это угрозу возможной передозировки?Я предполагаю, что при работе с Entity Framework, например, свойство Id не является редактируемым, поскольку оно автоинкремментировано.Пользователь по-прежнему сможет изменить идентификатор, чтобы обновить другое «событие», но в случае моего приложения это не создает проблем, так как пользователь может редактировать любое «событие», которое он хочет

Модель:

public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Контроллер:

    [HttpGet]
    public IActionResult EditEvent(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }
        else
        {
            var eventToEdit = _events.GetEvent(id.Value);
            return View(eventToEdit);
        }
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult EditEvent(Event postedEvent)
    {
        if (ModelState.IsValid)
        {
            if (postedEvent == null)
            {
                return NotFound();
            }
            else
            {
                var eventToUpdate = _events.GetEvent(postedEvent.Id);
                eventToUpdate = _events.EditEvent(postedEvent, eventToUpdate);
                return RedirectToAction(nameof(EventDetails), new { id = eventToUpdate.Id });
            }
        }
        else
        {
            return View(postedEvent);
        }
    }

1 Ответ

0 голосов
/ 24 апреля 2019

Является ли свойство идентификатора в модели привязки угрозой для избыточного размещения?

Да, если вы используете этот идентификатор в качестве поиска для редактирования, вам нужно написать проверку, которая гарантирует, что пользователю разрешено выполнять редактирование данных.

public IActionResult EditEvent(Event postedEvent)
{
    //Make sure the current user can edit the posted event
    if(!CanUserEditEvent(postedEvent.Id, User.GetUserId()) return Forbid();

    //User can edit this event so continue normally
    if(ModelState.IsValid)
        ...
}

Кроме того, убедитесь, что другие «доступные только для чтения» или неиспользуемые свойства вашей модели, отображаемые в представлении и действии, не будут использоваться для поиска или сохранения. Модель представления может помочь с этим, позволяя вам определить подмножество свойств вашей модели домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...