我们在具有2台服务器的Web场上运行ASP.NET MVC Core 1.1应用程序,并在用户尝试上载文件时遇到这些异常。我们认为这种情况正在发生,因为get请求来自一个服务器,他们的帖子可能会转到另一个Web服务器,导致密钥不匹配?
有办法解决这个问题吗?
错误1:无法解密防伪令牌。
在Microsoft.AspNetCore.Antiforgery.Internal的Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.DeserializeTokens(HttpContext httpContext,AntiforgeryTokenSet antiforgeryTokenSet,AntiforgeryToken&cookieToken,AntiforgeryToken&requestToken)。 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d__9.MoveNext()中的DefaultAntiforgery.ValidateTokens(HttpContext httpContext,AntiforgeryTokenSet antiforgeryTokenSet)---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.ExceptionServices上。 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.d__3.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的ExceptionDispatchInfo.Throw()---来自先前位置的堆栈跟踪结束,其中异常是抛出---在System.Runtime.Exc Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的eptionServices.ExceptionDispatchInfo.Throw()---来自先前位置的堆栈跟踪结束,其中异常是抛出---在Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)上的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()---栈尾从抛出异常的先前位置追踪---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.d__4.MoveNext( )---从前一个位置的堆栈跟踪结束
错误2:无法解密防伪令牌。
在Microsoft.AspNetCore.Antiforgery.Internal的Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.DeserializeTokens(HttpContext httpContext,AntiforgeryTokenSet antiforgeryTokenSet,AntiforgeryToken&cookieToken,AntiforgeryToken&requestToken)。 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d__9.MoveNext()中的DefaultAntiforgery.ValidateTokens(HttpContext httpContext,AntiforgeryTokenSet antiforgeryTokenSet)---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.ExceptionServices上。 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.d__3.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的ExceptionDispatchInfo.Throw()---来自先前位置的堆栈跟踪结束,其中异常是抛出---在System.Runtime.Exc Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的eptionServices.ExceptionDispatchInfo.Throw()---来自先前位置的堆栈跟踪结束,其中异常是抛出---在Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)上的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()---栈尾从抛出异常的先前位置追踪---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.d__4.MoveNext( )---从前一个位置的堆栈跟踪结束
您是否定义了机器密钥(请参阅:Adding machineKey to web.config on web-farm sites)?两台服务器都应具有相同的machineKey配置条目(可以在IIS中或通过在线工具生成)。
<machineKey
validationKey="GENERATED VALUE"
decryptionKey="GENERATED VALUE"
validation="SHA1"
decryption="AES" />
对于在IIS上运行的DotNet Core Apps,如果您的应用程序池设置为使用App Pool Identity,则需要确保在“应用程序池高级设置”中将“加载用户配置文件”设置为“True”。
- 如果用户配置文件可用,则密钥将持久保存到%LOCALAPPDATA%\ ASP.NET \ DataProtection-Keys文件夹。如果操作系统是Windows,则使用DPAPI对密钥进行静态加密。