asp.net核心数据保护:反序列化令牌时抛出异常

时间:2017-04-30 02:21:07

标签: c# caching asp.net-core stackexchange.redis kestrel-http-server

我使用redis作为数据保护存储在webfarm上运行asp.net核心。

我的应用程序负载很重,所以我不断地从redis中得到以下错误:

  

超时执行EVAL,inst:9,队列:1448,qu:0,qs:1448,qc:0,   wr:0,wq:0,in:65536,ar:0,clientName:xxxx

使用microsoft recommendation在startup.cs初始化redis的方式是

var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
    .PersistKeysToRedis(redis, "DataProtection-Keys");

所以最后阅读一些关于不是redis线程安全的文章我将redis初始化更改为线程安全,如azurehere

所示
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
    return ConnectionMultiplexer.Connect("mycache.redis.cache.windows.net,abortConnect=false,ssl=true,password=...");
});

public static ConnectionMultiplexer Connection {
    get {
        return lazyConnection.Value;
    }
}

但现在的问题是每隔一秒左右就会出现以下错误:

  

无法解密防伪令牌。 ---&GT;   System.Security.Cryptography.CryptographicException:键{xxxxxxx}   在钥匙圈里找不到。

  

反序列化令牌时抛出异常。

  

取消保护会话cookie时出错。

  

System.Security.Cryptography.CryptographicException:键{xxxxx}   在钥匙圈里找不到。

问题是什么,我该怎么办?

我应该再次更改初始化吗?但是app会在重负荷下停止。

更新

更多信息:

我不小心为redis使用了错误的连接字符串,并再次将其更改为正确的。

当然可能会有其他错误导致此错误。

我现在如何处理和缓解此错误?

错误很明显,可能无法在另一个开发环境中重现。

但应该有办法处理这种错误。

1 个答案:

答案 0 :(得分:1)

为避免数据保护错误,您可以运行PowerShell脚本。 https://raw.githubusercontent.com/aspnet/DataProtection/dev/Provision-AutoGenKeys.ps1。您只需要以管理员身份运行脚本并提供应用程序池名称