我需要从本地数据库存储和检索敏感数据-Web应用程序使用此数据。

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

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

一切正常,直到我执行IISRESET为止-在这一点上,似乎出于ProtectedData类的目的更改了标识,并且留下了无法解密的数据-我遇到了Key not valid for use in specified state异常。

这是我正在使用的代码:

    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标识,则一切正常,并且在IISRESET之后DPAPI应该继续工作。但是,如果我将身份更改为AD中定义的特定用户,则在回收应用程序池后事情就变得一团糟。

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

关于c# - IIS应用程序上的ProtectedData.Unprotect-IISRESET后无法工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20998290/

10-09 18:18