IIS应用程序上的ProtectedData.Unprotect – 在IISRESET之后无法工作

我需要从本地数据库存储和检索敏感数据 – 这些数据由Web应用程序使用。

为了保护所述数据,我选择使用ProtectedData类。

IIS应用程序正在使用特定的AD用户(“高级设置”中的“标识”属性)运行。

一切正常,直到我执行IISRESET – 此时,似乎为ProtectedData类的目的更改了标识,并且我留下了无法解密的数据 – 我得到的Key not valid for use in specified stateexception。

这是我正在使用的代码:

  static public string Encrypt(string data) { var encryptedData = ProtectedData.Protect(System.Text.Encoding.UTF8.GetBytes(data), entropy, DataProtectionScope.CurrentUser); return Convert.ToBase64String(encryptedData); } static public string Decrypt(string base64string) { var encryptedData = Convert.FromBase64String(base64string); return System.Text.Encoding.UTF8.GetString(ProtectedData.Unprotect(encryptedData, entropy, DataProtectionScope.CurrentUser)); } 

对我的应用来说, entropy显然是静态的。

这是怎么回事? 我的印象是DataProtectionScope.CurrentUser将使用,顾名思义,当前用户 – 据我所知,应该是应用程序池标识。 当我执行IISRESET时,为什么它会被改变?

虽然我不知道为什么会这样,但我更改了代码以使用AES加密 – 这很好用。

虽然不是每个问题的答案,但我认为这是一个值得一提的有效解决方法。

编辑

我想我已经找到了造成这个问题的原因(我仍然不知道为什么会发生这种情况,但我今天确实注意到了一些事情)。

如果Web应用程序正在使用ApplicationPool标识,那么一切都很好并且DPAPI应该在IISRESET之后继续工作。 但是,如果我将身份更改为AD中定义的特定用户,那么在应用程序池被回收后,事情就会变得混乱。

幸运的是在这种特殊情况下,我不再需要特定的AD用户,并且主加密基于AES(当负载平衡进入等式时,DPAPI不​​能用于访问共享资源),DPAPI仅用于加密AES密钥的本地副本。

使用ASP.NET Core Data Protection API时出现确切错误,对于有此错误的人,请确认已为应用程序池用户启用了LoadUserProfile。