Использование Antiforgery в ASP.NET Core и ошибка: токен Antiforgery не может быть расшифрован

В мое приложение ASP.Net Core MVC добавлено промежуточное ПО Antiforgery, как показано ниже:

startup.cs

services.AddMvc();
services.AddSession();
services.AddCaching();
services.AddSession(o =>
{
  o.IdleTimeout = TimeSpan.FromMinutes(120);
});
services.AddAntiforgery();

Я добавил ниже в представлении и контроллере

Посмотреть:

<form action="/Home/Login" method="post" id="staff-login" autocomplete="off">

@Html.AntiForgeryToken()

 ......

контроллер

[HttpPost, ValidateAntiForgeryToken] 
public IActionResult Login(IFormCollection formCollection) 
{...}

Проблема в том, что пользователи всегда опускаются ниже, когда пользователи сталкиваются с разными формами.

System.InvalidOperationException: маркер защиты от подделки не может быть расшифрован. ---> System.Security.Cryptography.CryptographicException: ключ {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} не найден в кольце для ключей.

Я нашел решение, которое предлагает установить статическую пару ключей проверки / дешифрования в web.config, но кажется, что это решение предназначено только для классического приложения asp.net. Как я должен делать в ядре ASP.Net?

7 ответов

У меня была именно эта ошибка в основном приложении ASP .net, размещенном в контейнере Linux.

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

Сначала произошла ошибка с настройкой по умолчанию.
Затем я добавил конкретную конфигурацию для ключей в файловой системе:

            services.AddDataProtection()
                .PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/my-af-keys/"));

Это также не решило проблему, я должен был установить имя приложения:

            services.AddDataProtection()
                .SetApplicationName("fow-customer-portal")
                .PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/dpkeys/"));

Я не подтвердил, но его возможная природа хостинга LXC означает, что ядро ​​.net не может сохранять идентичность приложения.

У меня было это, потому что я начал использовать приложение на локальном порту, а затем пытался использовать его в докере с тем же портом. К тому времени у меня были файлы cookie, в которых указывался ключ, сгенерированный моей машиной, поэтому он не работал на докере.

TL; DR очистить ваши куки, если вы когда-либо использовали этот домен / порт с других машин.

У AWS, Azure и Google Cloud есть библиотеки для использования своих хранилищ данных.

Azure, а также использовать Redis:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-6.0&amp;amp;tabs=visual- студия

AWS: https://aws.amazon.com/blogs/developer/aws-ssm-asp-net-core-data-protection-provider/

      services
.AddDataProtection()
.PersistKeysToAWSSystemsManager("/App/DataProtection")
.UseCryptographicAlgorithms(
    new AuthenticatedEncryptorConfiguration
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
    }
);

Что сработало для меня, так это использование новой учетной записи пользователя вместо NETWORK SERVICE, поскольку сообщение об ошибке включало следующее:

System.UnauthorizedAccessException: доступ к пути C:\Windows\system32\config\systemprofile запрещен.

Для меня (в среде DEV) работали, чтобы очистить данные просмотра. До очистки я смог зайти на страницу с этой ошибкой только через браузер в режиме инкогнито.

У меня возникла эта проблема, когда я пытался разместить свое приложение на локальном хосте Docker. Подключение к приложению через порт 80 (http) приведет к ошибке в запросах POST/PUT/DEL при использовании браузера Chrome .

Если вы просто пытаетесь увидеть результат и находитесь в стадии разработки, используйте вместо этого FireFox .

У меня возникла аналогичная проблема в контейнере linux, в котором запущено приложение .net core 5 на лазурном сервере, и открытие моего браузера в частном режиме решило эту проблему.

Другие вопросы по тегам