토큰을 deserializing하는 동안 예외가 throw되었습니다 .An exception was thrown while deserializing the token. 위조 방지 토큰은 .Net Core 2.2 애플리케이션에서 해독 할 수 없습니다 .The antiforgery token could not be decrypted in .Net Core 2.2 application
내 로그에 오류가 발생합니다. 나는 하루의 대부분을 솔루션을 찾는 데 보냈지 만 내 요구 사항을 충족하는 솔루션을 찾지 못했습니다.
다음은 로그 오류입니다.
심각도 = [오류], ipaddress = xxxx, subprocess = Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description = 토큰을 역 직렬화하는 동안 예외가 발생했습니다. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException : 위조 방지 토큰을 해독 할 수 없습니다. ---> System.Security.Cryptography.CryptographicException : 키 링에 {xxxxxxxxxx} 키가 없습니다. Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (Byte [] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus & status)에서 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect (ByteMigration, Boolean & ignore [] protectedData, Boolean & ignore [] protectedData, Boolean & ignore [] ) Microsoft.AspNetCore.DataProtection.KeyManagement.Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize (String serializedToken)의 KeyRingBasedDataProtector.Unprotect (Byte [] protectedData) at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Antiforgery.AspNetCore.Deserialize (String serializedToken) 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