AntiForgeryToken и сохранение данных между запросами
От: pumpurumer  
Дата: 15.03.18 06:54
Оценка:
Помогите найти название функции mvc framework, или это где-то в коде написано?
есть проект на mvc framework, в котором работа с данными выглядит примерно так:

[HttpGet]
public ActionResult Edit(Guid? id, Guid? ownerId)
{
    // заполнение modeldata, даже в случае если это новый элемент
    // например modelData.Owner = new Owner(){ id = ownerId };
    return View(modelData);
}


[HttpPost]
public ActionResult Edit(ModelType1 data)
{
    bool updating = data.ID != Guid.Empty;
    data.ID = dbService.CreateOrUpdateModelType1(data);

    return Json(data, updating);
}


на вьюхе, ничего про modelData.Owner нету, но есть @Html.AntiForgeryToken()
так вот, когда вызывается POST Edit — data — Owner заполнен данными, которые указаны в GET
подскажите, куда копать? это какая-то магия? я не смог найти этому название в гугле.
Re: AntiForgeryToken и сохранение данных между запросами
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 15.03.18 06:57
Оценка: 32 (1)
Здравствуйте, pumpurumer, Вы писали:

P>на вьюхе, ничего про modelData.Owner нету, но есть @Html.AntiForgeryToken()

P>так вот, когда вызывается POST Edit — data — Owner заполнен данными, которые указаны в GET
P>подскажите, куда копать? это какая-то магия? я не смог найти этому название в гугле.

Это ровно оно и есть https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx
http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/ — тут пример не в разоре, а ASP.NET MVC, но то же самое
Re[2]: AntiForgeryToken и сохранение данных между запросами
От: pumpurumer  
Дата: 15.03.18 10:43
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Здравствуйте, pumpurumer, Вы писали:


P>>на вьюхе, ничего про modelData.Owner нету, но есть @Html.AntiForgeryToken()

P>>так вот, когда вызывается POST Edit — data — Owner заполнен данными, которые указаны в GET
P>>подскажите, куда копать? это какая-то магия? я не смог найти этому название в гугле.

W>Это ровно оно и есть https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx

W>http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/ — тут пример не в разоре, а ASP.NET MVC, но то же самое


а что нужно сделать чтобы это заработало с нуля? и где это хранится? в сессии?
взял тестовый проект mvc framework, добавил такое:
        [HttpGet]
        public ActionResult TestPage()
        {
            var model = new AFTTestViewModel() { Displayed = "public", Hidden = "private" };

            return View(model);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult TestPage(AFTTestViewModel model)
        {
            // ValidateAntiForgeryToken - работает
            // в model.Hidden - пусто.
            return View(model);
        }

    [Serializable]
    public class AFTTestViewModel
    {
        public string Displayed { get; set; }

        public string Hidden { get; set; }
    }


на вьюхе вот так:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">
        <h4>AFTTestViewModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Displayed, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Displayed, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Displayed, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}
Re[3]: AntiForgeryToken и сохранение данных между запросами
От: Klikujiskaaan КНДР  
Дата: 15.03.18 11:05
Оценка:
Здравствуйте, pumpurumer, Вы писали:

P>а что нужно сделать чтобы это заработало с нуля? и где это хранится? в сессии?

P>взял тестовый проект mvc framework, добавил такое:
  Код
P>
P>        [HttpGet]
P>        public ActionResult TestPage()
P>        {
P>            var model = new AFTTestViewModel() { Displayed = "public", Hidden = "private" };

P>            return View(model);
P>        }

P>        [HttpPost]
P>        [ValidateAntiForgeryToken]
P>        public ActionResult TestPage(AFTTestViewModel model)
P>        {
P>            // ValidateAntiForgeryToken - работает
P>            // в model.Hidden - пусто.
P>            return View(model);
P>        }

P>    [Serializable]
P>    public class AFTTestViewModel
P>    {
P>        public string Displayed { get; set; }

P>        public string Hidden { get; set; }
P>    }
P>


P>на вьюхе вот так:


P>
P>@using (Html.BeginForm())
P>{
P>    @Html.AntiForgeryToken()
    
P>    <div class="form-horizontal">
P>        <h4>AFTTestViewModel</h4>
P>        <hr />
P>        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
P>        <div class="form-group">
P>            @Html.LabelFor(model => model.Displayed, htmlAttributes: new { @class = "control-label col-md-2" })
P>            <div class="col-md-10">
P>                @Html.EditorFor(model => model.Displayed, new { htmlAttributes = new { @class = "form-control" } })
P>                @Html.ValidationMessageFor(model => model.Displayed, "", new { @class = "text-danger" })
P>            </div>
P>        </div>

P>        <div class="form-group">
P>            <div class="col-md-offset-2 col-md-10">
P>                <input type="submit" value="Save" class="btn btn-default" />
P>            </div>
P>        </div>
P>    </div>
P>}
P>


Собственно уже работает

MVC's anti-forgery support writes a unique value to an HTTP-only cookie and then the same value is written to the form. When the page is submitted, an error is raised if the cookie value doesn't match the form value.

Если хотите получать поле модели Hidden в контроллере в pоst запросе, то нужно Hidden и во вьюху добавить, хотя бы вот так :
@Html.HiddenFor( model => model.Hidden)
Re[4]: AntiForgeryToken и сохранение данных между запросами
От: pumpurumer  
Дата: 15.03.18 11:15
Оценка:
Здравствуйте, Klikujiskaaan, Вы писали:

K>Собственно уже работает

K>

K>MVC's anti-forgery support writes a unique value to an HTTP-only cookie and then the same value is written to the form. When the page is submitted, an error is raised if the cookie value doesn't match the form value.

K>Если хотите получать поле модели Hidden в контроллере в pоst запросе, то нужно Hidden и во вьюху добавить, хотя бы вот так :
K>
K>@Html.HiddenFor( model => model.Hidden)
K>


про @Html.HiddenFor понятно, я говорю о том, что в исследуемом проекте это работает прозрачно и я не могу найти где это написано.
т.е. если тоже-самое сделать в целевом проекте — данные там будут. (т.е. в исследуемом проекте в hidden данные будут, без @Html.HiddenFor)
у меня возник вопрос — это какая-та фича mvc framework, или искать в проекте код который это делает ?
дело в том что в проекте очень много IOC и прочего, так в лоб найти не смог место котое бы сохраняло/восстанавливало модель, магия какая-то.
вопрос в том — это магия фрэймворка, или таки есть где-то код который это делает?
Re[5]: AntiForgeryToken и сохранение данных между запросами
От: pumpurumer  
Дата: 15.03.18 11:56
Оценка:
все, отбой.
код найден, психбольница для меня отменяется.
Re[5]: AntiForgeryToken и сохранение данных между запросами
От: Слава  
Дата: 15.03.18 13:20
Оценка: +2
Здравствуйте, pumpurumer, Вы писали:

P>дело в том что в проекте очень много IOC и прочего, так в лоб найти не смог место котое бы сохраняло/восстанавливало модель, магия какая-то.


Вот именно за это я IoC очень не люблю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.