Я создаю одностраничное приложение и испытываю проблему с токенами защиты от подделки.
Я знаю, почему возникает проблема, я просто не знаю, как ее исправить.
Я получаю сообщение об ошибке, когда происходит следующее:
- Пользователь, не вошедший в систему, загружает диалоговое окно (с сгенерированным токеном защиты от подделки)
- Пользователь закрывает диалог
- Пользователь входит в систему
- Пользователь открывает тот же диалог
- Пользователь отправляет форму в диалоговом окне
Токен защиты от подделки предназначен для пользователя "", но текущий пользователь - "имя пользователя"
Причина, по которой это происходит, заключается в том, что мое приложение на 100% одностраничное, и когда пользователь успешно входит в систему через сообщение ajax /Account/JsonLogin
, я просто выключаю текущие представления с "аутентифицированными представлениями", возвращаемыми с сервера, но не перезагружаю стр.
Я знаю, что это причина, потому что, если я просто перезагружу страницу между шагами 3 и 4, ошибки не будет.
Так что кажется, что @Html.AntiForgeryToken()
в загруженной форме все еще возвращается токен для старого пользователя, пока страница не будет перезагружена.
Как я могу изменить, @Html.AntiForgeryToken()
чтобы вернуть токен для нового аутентифицированного пользователя?
Я впрыснуть новый GenericalPrincipal
с обычаем IIdentity
на каждый Application_AuthenticateRequest
так к тому времени @Html.AntiForgeryToken()
получает называется HttpContext.Current.User.Identity
, на самом деле мои пользовательский стиль с IsAuthenticated
набором свойств к истине , и все же до @Html.AntiForgeryToken
сих пор , кажется , чтобы сделать маркер для старого пользователя , если я не делаю перезагрузку страницы.
источник
Ответы:
Это происходит потому, что токен защиты от подделки включает имя пользователя как часть зашифрованного токена для лучшей проверки. Когда вы впервые вызываете
@Html.AntiForgeryToken()
пользователя, он не вошел в систему, поэтому токен будет иметь пустую строку для имени пользователя, после входа пользователя в систему, если вы не замените токен защиты от подделки, он не пройдет проверку, потому что первоначальный токен был для анонимный пользователь, и теперь у нас есть аутентифицированный пользователь с известным именем пользователя.У вас есть несколько вариантов решения этой проблемы:
Только на этот раз позвольте вашему SPA выполнить полный POST, и когда страница перезагрузится, у него будет токен защиты от подделки со встроенным обновленным именем пользователя.
Получите частичное представление сразу
@Html.AntiForgeryToken()
после входа в систему, выполните еще один запрос AJAX и замените существующий токен защиты от подделки ответом на запрос.Просто отключите проверку личности, которую выполняет проверка защиты от подделки. Добавьте следующую строку в ваш Application_Start метод:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.источник
Чтобы исправить ошибку, вам необходимо разместить
OutputCache
аннотацию к данным наActionResult
странице получения входа в систему как:источник
Это часто случается с моим приложением, поэтому я решил поискать его в Google!
Я нашел простое объяснение этой ошибки! Пользователь дважды щелкает кнопку для входа в систему! Вы можете увидеть, как другой пользователь говорит об этом по ссылке ниже:
MVC 4 предоставил токен защиты от подделки, предназначенный для пользователя "", но текущий пользователь - "пользователь"
Я надеюсь, что это помогает! знак равно
источник
У меня была та же проблема, и этот грязный хак исправил ее, по крайней мере, до тех пор, пока я не смог исправить ее более чистым способом.
...
источник
Сообщение появляется при входе в систему, когда вы уже аутентифицированы.
Этот помощник делает то же самое, что и
[ValidateAntiForgeryToken]
атрибут.Удалите
[ValidateAntiForgeryToken]
атрибут из контроллера и поместите этот помощник в метод действия.Поэтому, когда пользователь уже аутентифицирован, перенаправьте его на домашнюю страницу или, если нет, продолжите проверку действующего токена защиты от подделки после этой проверки.
источник
У меня такое же исключение, которое чаще всего возникает на производственном сервере.
Почему это происходит?
Это происходит, когда пользователь входит в систему с действительными учетными данными и после входа в систему и перенаправления на другую страницу, и после того, как они нажимают кнопку возврата, отображается страница входа, и он снова вводит действительные учетные данные, когда это исключение произойдет.
Как решить?
Просто добавьте эту строку и работайте идеально, без ошибок.
источник
У меня была довольно конкретная, но похожая проблема в процессе регистрации. Как только пользователь нажимал на отправленную ему ссылку электронной почты, он входил в систему и отправлялся прямо на экран сведений об учетной записи для ввода дополнительной информации. Мой код был:
Я обнаружил, что представление возврата («AccountDetails») выдавало мне исключение токена, я предполагаю, потому что функция ConfirmEmail была украшена AllowAnonymous, а функция AccountDetails имела ValidateAntiForgeryToken.
Изменение Return to Return RedirectToAction ("AccountDetails") решило проблему для меня.
источник
Вы можете проверить это, поставив точку останова в первой строке вашего действия Login (Get). Перед добавлением директивы OutputCache точка останова будет достигнута при первой загрузке, но после нажатия кнопки возврата в браузере этого не произойдет. После добавления директивы вы должны каждый раз получать точку останова, поэтому AntiForgeryToken будет corect, а не пустым.
источник
У меня была такая же проблема с одностраничным приложением ASP.NET MVC Core. Я решил это, установив
HttpContext.User
все действия контроллера, которые изменяют текущие утверждения идентичности (поскольку MVC делает это только для последующих запросов, как обсуждается здесь ). Я использовал фильтр результатов вместо промежуточного программного обеспечения для добавления файлов cookie для защиты от подделки к своим ответам, чтобы убедиться, что они были созданы только после возврата действия MVC.Контроллер (NB. Я управляю пользователями с помощью ASP.NET Core Identity):
Фильтр результатов для добавления файлов cookie для защиты от подделки:
Экстракт Startup.cs:
источник
Имеет проблему с проверкой токенов защиты от подделки в интернет-магазине: пользователи открывают множество вкладок (с товарами) и после входа в одну пытаются авторизоваться в другой и получают такое AntiForgeryException. Итак, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true мне не помог, поэтому я использовал такой уродливый хакфикс, может быть, кому-то это пригодится:
Думаю, было бы здорово, если бы можно было установить параметры генерации токенов защиты от подделки, чтобы исключить имя пользователя или что-то в этом роде.
источник