Мы наблюдаем странное поведение при попытке POST для действия «Забыли пароль» в контроллере учетных записей в Orchard.Users.
Важные детали
- Мы не используем исходный код Orchard напрямую, мы используем скомпилированные повторно распространяемые и сборочные модули, которые развертываются на хосте Redist, поэтому прямая отладка является проблемой.
- Мы попробовали это с ванильным Orchard 1.8.1 (версия нашего Redist), так что мы можем почти исключить любой код нашего модуля.
- При отправке формы мы получаем ответ 302 Moved с заголовком местоположения, установленным на /. Затем это приводит к root, а не к странице «Успех» или обратно к вводу нового пароля. Пароль пользователя не был успешно изменен.
- Глядя на Контроллер учетных записей в исходном коде, мы видим, что единственный результат, который явно возвращает корень, — это когда вызов IUserService.ValidateLostPassword(nonce) терпит неудачу и return Redirect("~/"); вызывается.
- Поскольку прямая отладка немного сложна, мы получили копию контроллера из исходного кода и переместили код действия и всю связанную логику вызова службы в команду Orchard для тестирования. Это удалось изменить пароль пользователя. и возврат без ошибок, используя NOnce, полученный из электронного письма сброса.
Таким образом, мы подозреваем, что это может быть ошибка в самом Orchard, хотя, скорее всего, в нашем экземпляре, и его конфигурация, поскольку «Невозможно изменить пароль», является довольно обширной проблемой.
Кто-нибудь может дать совет? Известные ошибки, которые могут применяться?
Обновление 1:
Спасибо, Бертран. Мы еще не пробовали это с Orchard 1.9, но нам удалось получить полностью чистую версию 1.8 (поскольку это версия, которую мы в настоящее время запускаем в дикой природе с одним из наших репозиториев. P.S. Знаете ли вы, что ваш репозиторий GitHub идут ветки 1.4.x, 1.5.x, 1.9.x? 1.8.x недоступна. Во всяком случае.) и это работал. Краткая версия: мы поигрались с тем, что может быть по-другому, и мы пришли к тому, что это работает, когда наша тема выключена, и не работает, когда она включена.
Небольшое копание показало, что наши ребята из FE перезаписали представление «Потерянный пароль», чтобы оно соответствовало нашему деловому виду. Вот что я нашел:
В представлении Orchard по умолчанию форма запускается с помощью:
@using (Html.BeginFormAntiForgeryPost()) {
и в итоге выглядит как
<form action="/OrchardLocal/Users/Account/LostPassword?nonce=Vc7ABvKcwfMO0jrRkJFxiBWoJzbdGAqQ7bbEgGySqlyAAKnHPTIkyhzG8nn%2FXJsqKkh6e9sreTnHx223BKFOs17gY%2FDWMggtCZw%2BSfz194Mviua5smhl5d%2FnACXCI%2BrdQaGcJj%2BjvoFE7m2OIiaX8w%3D%3D" method="post">
все хорошо и денди. Я предполагаю, что, поскольку одноразовый номер вошел в качестве параметра запроса при получении, он сохраняется в сообщении посредством вывода при вызове формы «Начало» по умолчанию без каких-либо дополнительных настроек.
Однако наше переопределение в настоящее время использует:
@using (Html.BeginFormAntiForgeryPost(Url.Action("LostPassword"), FormMethod.Post, new{ @class="form-lost-password"} ) ) {
Здесь мы указываем какой-то дополнительный класс для нужд нашей темы и на странице получаем:
<form action="/Users/Account/LostPassword" class="form-lost-password" method="post">
Нонс исчез (точнее, вообще не добавился, т.к. мы указываем конкретный маршрут). Таким образом, готовое решение — добавить одноразовый номер при использовании
Action(String, String, Object)
форму Url.Action(), чтобы указать его как значение маршрута.
Однако одноразовый номер не передается ни как член модели, ни через ViewBag (как минимальная длина пароля).
Я нашел этот этот предыдущий вопрос со времен Orchard 1.6/1.7, который предлагает обновление контроллера, чтобы добавить одноразовый номер в Viewbag, но мы используем предварительно скомпилированный повторный дистрибутив Orchard, поэтому это далеко не идеально для наших нужд.
Я буду использовать другие способы написания этой формы, используя то, что у нас есть, без обновления контроллера, но есть ли какой-либо план сделать одноразовый номер доступным для этого представления для использования?