ASP.NET MVC: работает ли AntiForgeryToken в моно?

Я пытаюсь использовать Html.AntiForgeryToken в ASP.NET MVC под Mono (XSP), и это не работает. Он выдает следующее исключение. Любые идеи?

System.ArgumentNullException: Argument cannot be null.
Parameter name: inputString
  at System.Web.UI.ObjectStateFormatter.Deserialize (System.String inputString) [0x00006] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/ObjectStateFormatter.cs:131 
  at System.Web.UI.HiddenFieldPageStatePersister.Load () [0x00007] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/HiddenFieldPageStatePersister.cs:57 
  at System.Web.UI.Page.LoadPageStateFromPersistenceMedium () [0x0000f] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1763 
  at System.Web.UI.Page.LoadPageViewState () [0x00000] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1769 
  at System.Web.UI.Page.RestorePageState () [0x00051] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1454 
  at System.Web.UI.Page.InternalProcessRequest () [0x001b9] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1433 
  at System.Web.UI.Page.ProcessRequest (System.Web.HttpContext context) [0x0005b] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1261 

Знаете ли вы какой-либо другой способ реализовать это?

Заранее спасибо.

Изменить: это код моего представления (частичное представление). Если я удаляю строку <%= Html.AntiForgeryToken() %>, все работает нормально, в противном случае выдает исключение, описанное выше.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Codice.Web.Client.Comment>" %>

<div class="comment" style="background-color: #009ACF">
 <div class="comment-meta">
  <p class="comment-author">
   <span class="avatarimage">
    <%= Html.AvatarFor(Model.CommentInfo.Owner) %>
   </span>
   <strong class="comment-author">
     <%= Html.Encode(Model.GetAuthorString()) %>
   </strong>
   says:
  </p>
  <p class="comment-date">
   <%= Html.TimeAgo(Model.CommentInfo.LocalTimeStamp) %>
  </p>
 </div>

 <div class="comment-body">
  <div class="formatted-content">
   <%= Html.Encode(Model.CommentInfo.Comment) %>
  </div>
  <div class="form-content">
   <% using(Html.BeginForm(
                   "EditComment",
                   "Comments",
                   new
                   {
        repository = Model.Repository,
        commentId = Model.CommentInfo.Id
       },
                   FormMethod.Post,
                   null))
       { %>
           <%= Html.AntiForgeryToken() %>
        <%= Html.TextBox("newComment", Model.CommentInfo.Comment) %>

        <div class="form-actions">
         <a class"edit-cancel minibutton" href="#">
          <span>Cancel</span>
         </a>
         <button class="minibutton" type="submit">
          <span>Update comment</span>
         </button>
        </div>
        <%
       }
   %>
  </div>
 </div>
</div>

person Daniel Peñalba    schedule 03.12.2010    source источник
comment
Вы проверили, что этот же код работает под MS .NET?   -  person Michael Shimmins    schedule 03.12.2010
comment
Я использую AntiForgeryToken в веб-приложении MVC, размещенном на apache с mod_mono, и он работает без проблем. Можете ли вы пройти код представления и контроллера?   -  person yojimbo87    schedule 03.12.2010
comment
@Tomi: Конечно, я обновляю сообщение, чтобы вставить код просмотра. Контроллер не проблема, только не удается скомпилировать представление во время выполнения.   -  person Daniel Peñalba    schedule 03.12.2010
comment
@Michael, нет, я не тестировал его под .NET   -  person Daniel Peñalba    schedule 03.12.2010


Ответы (1)


У вас установлен атрибут [ValidateAntiForgeryToken] для вашего действия контроллера, которое обслуживает глагол POST?

Редактировать: Возможное решение этой проблемы, вероятно, заключается в использовании новейшего моно из ветки master, потому что эта проблема может быть воспроизведена в более старых версиях моно (например, tarball от 22 апреля вызывает такое же исключение).

Редактировать 2: Что, вероятно, действительно необходимо для того, чтобы это заработало, так это установка действительного элемент machineKey в файле web.config. Ключи можно сгенерировать, например, с помощью этой утилиты.

person yojimbo87    schedule 03.12.2010
comment
@Tomi: Да, проблема в частичном представлении. На самом деле, если я удаляю Html.AntiForgeryToken() из представления, контроллер работает нормально, выдавая исключение (необходимый токен защиты от подделки не найден...). - person Daniel Peñalba; 03.12.2010
comment
Хм, это выглядит странно. Можете ли вы пропустить сгенерированный источник html, чтобы увидеть, присутствует ли токен защиты от подделки в скрытом поле под вашей формой? - person yojimbo87; 03.12.2010
comment
@Tommy: Есть идеи? Какую версию Mono вы используете? - person Daniel Peñalba; 04.12.2010
comment
@Daniel: у меня моно версия 2.9 (из мастера github, загруженного 20 ноября). XSP и mod_mono также относятся к одной и той же основной ветке даты. Можете ли вы попробовать запустить свое веб-приложение через apache с помощью mod_mono? - person yojimbo87; 04.12.2010
comment
Вы получили это работает в XSP? Я только что столкнулся с этим сообщением об ошибке и хотел бы знать, как это было решено? Для справки: я использую OpenSUSE 11.3, Mono 2.8.1, ASP.NET 4, ASP.NET MVC 2.0 и использую Mono Develop 2.4.2. - person Alan Savage; 21.01.2011