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

时间:2014-01-08 14:24:10

标签: c# iis iis-7 dpapi

我需要存储和检索本地数据库中的敏感数据 - 这些数据由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时,为什么它会被改变?

2 个答案:

答案 0 :(得分:0)

虽然我不知道为什么会这样,但我更改了代码以使用AES加密 - 这样做工作正常。

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

修改

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

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

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

答案 1 :(得分:0)

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