При десериализации токена возникла исключительная ситуация. Токен защиты от подделки не может быть расшифрован в приложении .Net Core 2.2.
Я получаю сообщение об ошибке в моем журнале. Я потратил большую часть своего дня на поиски решения, но не смог найти то, которое соответствует моим требованиям.
Вот ошибка журнала
severity = [ERROR], ipaddress = xxxx, subprocess = Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description = Исключение при десериализации токена. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: не удалось расшифровать маркер защиты от подделки. ---> System.Security.Cryptography.CryptographicException: ключ {xxxxxxxxxx} не найден в связке ключей. на Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (байт [] protectedData, булевой allowOperationsOnRevokedKeys, UnprotectStatus и статус) в Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect (байт [] protectedData, Boolean, Boolean ignoreRevocationErrors & requiresMigration, Boolean & wasRevoked ) в Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect (Byte [] protectedData) в Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize (String serializedToken) в Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokerity.Internal.DefaultAntiforgeryTokerry DefaultAntiforgery.GetCookieTokenDoesNotThrow (HttpContext httpContext)
"Certificates": {
"StoreName": "My",
"StoreLocation": "LocalMachine"
"SerialNumber": "xxxxxxxxxxxx"
},
private X509Certificate2 LCertificate()
{
var storeName = Configuration["Certificates:StoreName"];
var storeLocation = Configuration["Certificates:StoreLocation"];
string serialNumber = Configuration["Certificates: SerialNumber"];
using(X509Store store = new X509Store(storeName,storeLocation))
{
var certificates = store.Certificates
.Find(X509FindType.FindBySerialNumber,
serialNumber,
acceptValidCertOnly);
return certificates[0];
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer
.AddSigningCredential(new X509Certificate2(LCertificate()))
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel model)
{
Ответы
Если
- ваше приложение размещено на нескольких серверах
- не настроил защиту общих данных
- вы не используете липкие сессии
это произойдет, когда пользователь запросит страницу с формой с сервера A, а затем отправит форму на сервер B.
Это также может произойти на одном сервере IIS, если
- пользователь запрашивает страницу с формой
- вы перезагружаете сервер
- пользователь отправляет форму
Причина в том, что при перезапуске в память загружается новая связка ключей, а ключ защиты от подделки внутри формы больше не проверяется.
Последний случай можно исправить в IIS, проверив «загрузить профиль пользователя» в пуле приложений.
Больше информации: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1