【问题标题】:error The antiforgery token could not be decrypted. The key {guid} was not found in the key ring错误 无法解密防伪令牌。在密钥环中找不到密钥 {guid}
【发布时间】:2018-06-01 04:40:40
【问题描述】:

当用户尝试上传文件时,我们在具有 2 个服务器的网络场上运行 ASP.NET MVC Core 1.1 应用程序并遇到这些异常。我们认为这是因为 get 请求来自一台服务器,而他们的帖子可能会发送到另一台 Web 服务器,导致密钥不匹配?

有没有办法解决这个问题?

错误 1: 防伪令牌无法解密。

在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String 序列化令牌)在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.DeserializeTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet, AntiforgeryToken& cookieToken, AntiforgeryToken& requestToken) 在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet) 在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d__9.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.d__3.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.d__4.MoveNext() --- 堆栈跟踪从上一个异常位置结束

错误 2:无法解密防伪令牌。

在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(字符串 序列化令牌)在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.DeserializeTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet, AntiforgeryToken& cookieToken, AntiforgeryToken& requestToken) 在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet) 在 Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d__9.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.d__3.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.d__4.MoveNext() --- 堆栈跟踪从上一个异常位置结束

【问题讨论】:

    标签: asp.net-mvc asp.net-core


    【解决方案1】:

    您是否定义了机器密钥(参见:Adding machineKey to web.config on web-farm sites)?两台服务器应该有相同的machineKey 配置条目(可以在 IIS 中或通过在线工具生成)。

    <machineKey  
      validationKey="GENERATED VALUE"           
      decryptionKey="GENERATED VALUE"
      validation="SHA1"
      decryption="AES" />
    

    【讨论】:

      【解决方案2】:

      对于在 IIS 上运行的 DotNetCore 应用程序,如果您的应用程序池设置为使用 AppPoolIdentity,那么您需要确保在应用程序池高级设置中将“加载用户配置文件”设置为“真”。

      见:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/default-settings?view=aspnetcore-2.1

      1. 如果用户配置文件可用,密钥将保留在 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹中。如果操作 系统是 Windows,密钥使用 DPAPI 进行静态加密。

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 2017-07-21
        • 2023-03-30
        • 2020-03-09
        • 2019-03-26
        • 2017-11-20
        • 2015-09-13
        • 2016-03-23
        相关资源
        最近更新 更多