ASP.NET MVC Передача данных - PullRequest
4 голосов
/ 17 ноября 2010

Привет всем, я играю с ASP.NET MVC и Entity Framework. Мне было интересно, как лучше всего передать данные из контроллеров в представления, а затем обратно. Я объясню немного лучше:

У меня есть действие для создания нового объекта "Квитанция"

        [Authorize]
    public ActionResult CreateReceipt(int id)
    {
           //I create the receipt object
            Receipt newReceipt = new Receipt();
           // assign some information about the owner of the receipt 
           // and the group that it belongs to
            newReceipt.Group = group;
            newReceipt.Owner = user;
            //send off to the view to be displayed
            return View(newReceipt);
    }

Таким образом, я в основном создаю квитанцию ​​и предварительно заполняю некоторую информацию (включая информацию об авторизованном пользователе и некотором идентификаторе группы), затем я могу отправить ее в представление со всеми видами элементов формы, которые позволяют пользователю заполнить другую отсутствующую поля и отправить, чтобы добавить новый чек. Все это прекрасно работает, если все поля из объекта получения отображаются в форме.

Если я удаляю элементы формы для вещей, к которым пользователь не должен прикасаться (например, номер группы, идентификатор пользователя, которому принадлежит квитанция и т. Д ...) Затем, когда я отправляю форму и забираю ее в контроллере:

        [HttpPost]
    [Authorize]
    public ActionResult CreateReceipt(Receipt receipt)
    {

        if (ModelState.IsValid)
        {
            using (EntityFrameworkEntities context = new EntityFrameworkEntities)
            {
                context.AddToReceipts(receipt);
                context.SaveChanges();
            }
            return RedirectToAction("Index");
        }

        return View(receipt);
    }

Тогда вся эта удобная предварительно загруженная информация, которую я заполнил и отправил на просмотр, не возвращается с постом. Я знаю, что могу поместить UserID или GroupID в скрытое поле, а затем он вернется с POST, но это неправильно. Технически кто-то может войти, изменить скрытые значения и повторно отправить сообщение. Затем я мог бы проверить, чтобы все было там, где оно есть, но это было бы похоже на еще одну поездку в базу данных для получения информации, которую я уже однажды получил.

Если кто-нибудь может немного рассказать о том, каков стандартный способ передачи данных из модели в представление в контроллер, это было бы здорово. Спасибо за ваше время и помощь!

Ответы [ 2 ]

5 голосов
/ 17 ноября 2010

Если вы беспокоитесь о том, что кто-то может использовать скрытые значения полей для воздействия на другие записи, добавьте значение идентификатора и зашифруйте его в скрытом поле, а затем расшифруйте при обратной передаче.

3 голосов
/ 17 ноября 2010

Я только недавно добавил такую ​​функциональность в одно из моих существующих приложений.Это будет более подробно на ответе @Dave Swersky

Если предположить, что бизнес-объект

Receipt
ID
Cost
ShippingAddress

у меня будет ViewModel

ReceiptViewModel
ID
Cost
CostHash
ShippingAddress

Ваше представление будет иметьчто-то вроде

Html.HiddenFor(m => m.Id)
Html.HiddenFor(m => m.CostHash)
Html.LabelFor(m => m.Cost)
Html.LabelFor(m => m.ShippingAddress)

Тогда для отображения бизнес-объекта для представления модели все просто, за исключением CostHash, для которого требуется вычислить хэш Sha256 (или другой хеш) из Cost + Private Key + Predicable Salt Value (например,в качестве идентификатора самой квитанции).Причина, по которой вы хотите включить идентификатор объекта или какой-либо другой переменной, но известное значение, заключается в том, что пользователи вашей системы не могут обойти ваше хеширование.

Если бы вы использовали только исходное значение + закрытый ключ, если стоимость составляла 10 долларов, выходной код был бы одинаковым для 10 долларов каждый раз.Это позволило бы человеку легко перенести как значение Cost, так и значение CostHash из другой квитанции, однако, если вы добавите в идентификатор идентификатор, который будет частью соли, хэш для 10 долларов для квитанции 1 будет отличаться от 10 долларов для квитанции 2.Если у вас есть много одинаковых значений для защиты на том же объекте, что вы все еще беспокоитесь о том, что пользователи могут взять значения Cost и CostHash и переместить их, чтобы указать другую позицию, вам нужно будет добавить больше соли, например, имя свойстваэлемента и т. д.

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

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