3

我正在开发一个 asp.net 核心应用程序以在网络上进行调优,并且我正在使用“AddDataProtection”来保护静态密钥加密,就像文档建议的那样,但是当我部署我的应用程序并直接从 IIS 运行时AppPool 身份,从未创建密钥,并且我在 DpapiNG Windows 日志中收到错误。

我的代码如下:

services.AddDataProtection(opt => opt.ApplicationDiscriminator = ApplicationConfig.dataProtectionApplicationDiscriminator)
            .PersistKeysToFileSystem(new DirectoryInfo(encKeyPath))
            .ProtectKeysWithDpapiNG(string.Format("CERTIFICATE=HashId:{0}", ApplicationConfig.dataProtectionCertThumbprint),
                flags: DpapiNGProtectionDescriptorFlags.None);

从 Visual Studio 调试,一切运行良好,但我在管理员权限下运行 VS,所以这里的权限不是问题。

我已经尝试将 AppPool App 用户的权限添加到它直接从 MMC 自己获得的私钥,但它没有工作,甚至授予了对该位置的完整路径的权限,如果密钥应该按照此处所述https:/ /docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview(检查第一条评论)但它也没有奏效。

我只能通过将 AppPool 设置为以管理员身份运行来使其工作,但显然这是不行的,我只是想确保这是某个地方的权限问题。

有没有人遇到同样的问题可以提供帮助?

问候,安德烈

4

1 回答 1

1

您的问题很可能是您试图将密钥存储在您正在拼凑在一起的文件夹路径中的某个位置(甚至使用 AddDataProtection 提供的默认路径),该路径使用诸如 %LOCALAPPDATA% 之类的环境路径。示例:“%LOCALAPPDATA%\ASP.NET\DataProtection-Keys”。通常,默认情况下,IIS 不会使用环境路径变量(例如 %LOCALAPPDATA%)设置您的应用程序池帐户。该值最终为空,然后您的应用程序会尝试将密钥写入错误的文件夹(例如 \ASP.NET\DataProtection-Keys 而不是 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys)。

修复:在 %WINDIR%\System32\inetsrv\config\applicationHost.config 中设置 setProfileEnvironment=true。我认为你也必须重新启动 IIS。

于 2019-02-09T17:04:40.217 回答