Подтвердить что ты не робот

Антенна анти-подделки не может быть расшифрована

У меня есть форма:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()...

и действие:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl, string City)
{
}

изредка (раз в неделю) я получаю сообщение об ошибке:

Токен против подделки не может быть расшифрован. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что на всех компьютерах установлена одна и та же версия веб-страниц ASP.NET и что в конфигурации указаны явные ключи шифрования и проверки. Автогенерация не может использоваться в кластере.

я пытаюсь добавить в webconfig:

<machineKey validationKey="AutoGenerate,IsolateApps"  
    decryptionKey="AutoGenerate,IsolateApps" />

но ошибка все равно иногда появляется

Я заметил, что эта ошибка возникает, например, когда человек пришел с одного компьютера, а затем пытается другой компьютер

Или иногда автоматическое значение, установленное с неверным типом данных, например, bool для целого числа в поле формы любым кодом jQuery, также проверьте это.

4b9b3361

Ответ 1

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

Ответ 2

validationKey = "AutoGenerate"

Это говорит ASP.NET о создании нового ключа шифрования для использования в шифровании таких вещей, как аутентификационные билеты и токены с опознавательным знаком, каждый раз, когда приложение запускается. Если вы получили запрос, который использовал другой ключ (до перезапуска, например), чтобы зашифровать элементы запроса (например, файлы cookie для подтверждения), что это исключение может произойти.

Если вы отодвигаетесь от "Автогенерации" и конкретно указываете его (ключ шифрования), запросы, зависящие от того, что ключ будет дешифрован правильно, и проверка будет работать из перезапуска приложения для перезагрузки. Например:

<machineKey  
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
               AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>

Вы можете прочитать ваше сердечное содержание на странице MSDN: Как настроить MachineKey в ASP.NET

Ответ 3

Просто сгенерируйте тег <machineKey .../> ссылку для вашей версии фреймворка и вставьте в <system.web><system.web/> в Web.config, если он не существует.

Надеюсь, что это поможет.

Ответ 4

Если вы попали сюда из Google для своей машины разработчика, указав эту ошибку, попробуйте очистить файлы cookie в браузере. Очистить файлы cookie браузера для меня.

Ответ 5

Я столкнулся с этой проблемой в области кода, где у меня было представление, вызывающее частичное представление, однако вместо того, чтобы возвращать частичное представление, я возвращал представление.

Я изменил:

return Вид (индекс);

to

вернуть PartialView (индекс);

в моем контроле и это исправило мою проблему.

Ответ 6

Я получаю эту ошибку, когда страница старая ('stale'). Обновление токена с помощью перезагрузки страницы устраняет мою проблему. Кажется, что существует некоторый период ожидания.

Ответ 7

Я получил эту ошибку на .NET Core 2.1. Я исправил это, добавив сервис Data Protection в Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection();
    ....
}

Ответ 8

Если вы используете Kubernetes и имеете более одного модуля для своего приложения, это, скорее всего, приведет к сбою проверки запроса, поскольку модуль, который генерирует RequestValidationToken, не обязательно является модулем, который будет проверять токен при отправке обратно в ваше приложение. Исправление должно состоять в том, чтобы сконфигурировать ваш nginx-контроллер или любой другой используемый вами входной ресурс и указать ему балансировку нагрузки, чтобы каждый клиент использовал один модуль для всех коммуникаций.

Обновление: мне удалось исправить это, добавив следующие комментарии к моему входу:

https://kubernetes.github.io/ingress-nginx/examples/affinity/cookie/

Name    Description Values
nginx.ingress.kubernetes.io/affinity    Sets the affinity type  string (in NGINX only cookie is possible
nginx.ingress.kubernetes.io/session-cookie-name Name of the cookie that will be used    string (default to INGRESSCOOKIE)
nginx.ingress.kubernetes.io/session-cookie-hash Type of hash that will be used in cookie value  sha1/md5/index