C# 断断续续;密钥在指定状态下无效;在IIS中使用DPAPI和在CurrentUser中使用ASP.NET MVC时出现异常

C# 断断续续;密钥在指定状态下无效;在IIS中使用DPAPI和在CurrentUser中使用ASP.NET MVC时出现异常,c#,asp.net-mvc,iis,dpapi,C#,Asp.net Mvc,Iis,Dpapi,我们有两台服务器在IIS下运行相同的ASP.NET MVC应用程序。服务器A正在Windows Server 2008 R2标准版6.1版本7601 SP1上运行IIS 7.5。服务器B正在Windows Server 2012 R2 v 6.3 build 9600上运行IIS 8.5 应用程序池在同一个windows用户下运行 webapp使用ProtectedData.Protect和Unprotect with DataProtectionScope CurrentUser,并将加密值存

我们有两台服务器在IIS下运行相同的ASP.NET MVC应用程序。服务器A正在Windows Server 2008 R2标准版6.1版本7601 SP1上运行IIS 7.5。服务器B正在Windows Server 2012 R2 v 6.3 build 9600上运行IIS 8.5

应用程序池在同一个windows用户下运行

webapp使用ProtectedData.Protect和Unprotect with DataProtectionScope CurrentUser,并将加密值存储到单独的数据库中(两台服务器之间根本没有交互)

服务器A已经运行了一年多,有两三次无法解密(错误为解密失败:密钥在指定状态下无效)。我们不理解这样做的原因,只是通过应用程序重新加密了这些值。因为这是一件罕见的事情,我们决定接受它

服务器B已运行约3周,在此期间,同一问题已发生五次。我们无法接受这一点,因此我提出了这个问题

IIS advanced settings中的Load User Profile设置在两台服务器上均为true,并且已在整个过程中进行了验证

我们最初的想法是,应用程序池身份的用户可能正在发生变化。但我们已经排除了这种可能性,因为这两个应用程序都在同一个用户下运行,而且当服务器B中断时,服务器A继续工作,即使在IISRESET和重新启动之后也是如此

就我们所知,这两台服务器上的设置是相同的(尽可能,因为它们是不同的操作系统和IIS版本)

有人能想出发生这种情况的原因吗?提前感谢。

请确保在iis应用程序池高级设置中将“加载用户配置文件”设置为true

编辑:

只有本地操作系统可以访问此机器密钥,此密钥对于每个安装都是唯一的。Windows支持使用此密钥保护数据的DPAPI。使用此API时,您无法直接访问密钥。您可以要求系统使用机器密钥加密或解密某些内容。通过这种方式,应用程序可以通过DPAPI加密它使用的密钥,.NET Framework支持System.Security.Cryptography.ProtectedData类

  • 如果要使用ProtectedData类保护敏感信息,应添加对System.Security.dll程序集的引用,并导入System.Security.Cryptography命名空间。可能的作用域是LocalMachine和CurrentUser

  • 要使用机器密钥时,可以选择本地机器

  • 当您想要使用为当前登录的用户配置文件生成的密钥时,可以选择CurrentUser。如果Active Directory漫游配置文件允许在Active Directory域内的多台Windows计算机上重用Windows用户配置文件,则此密钥与计算机无关

  • 机器管理员可以通过编写调用前一个函数的程序来解密数据

  • 如果用户不是管理员并且没有使用DPAPI的权限,则他/她无法解密使用机器密钥加密的数据

  • 不应使用DPAPI加密数据库中的信息,因为如果使用DataProtectionScope.LocalMachine设置,则加密数据将绑定到计算机。如果机器崩溃,您必须在另一台机器上恢复数据,您将丢失所有加密信息

  • 如果如前所述使用DPAPI加密密钥,则应在另一个安全位置备份密钥

  • 如果要在web场方案中使用DPAPI,必须在域用户帐户下运行应用程序,并使用为用户配置文件(DataProtectionScope.CurrentUser)创建的密钥。您应该为web场创建一个单独的域,这样您就不必使用公司内部域网络的域用户

参考链接:


谢谢@Jalpa Panchal。我已经修改了这个问题,说明我们确实已经将LoadUserProfile设置为true。我们在web配置中没有提到机器密钥。我们应该这样做吗?在使用CurrentUser作用域时,我不知道机器密钥web.config设置与ProtectedData有关。你能给我指一下这方面的文件吗?Thanks@SJC尝试清除浏览器cookie和历史记录。请查看编辑后的帖子。谢谢,但是你的回答没有解决我在文章中解释的问题detail@SJC尝试将数据保护模式设置为LocalMachineThanks。这无疑会起作用,但会损害安全模型,因为从那时起,任何获得机器访问权限的人都可以解密。我们使用CurrentUser,因此只有应用程序池用户才能解密。