IIS - AddDataProtection PersistKeysToFileSystem没有创建

时间:2017-06-23 06:25:32

标签: iis asp.net-core dpapi

我正在开发一个asp.net核心应用程序来远程上网,我正在使用“AddDataProtection”来保护静态的密钥加密,就像文档建议的那样,但是当我部署我的应用程序并直接运行时从具有AppPool标识的IIS中,永远不会创建密钥,并且我在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设置为以管理员的身份运行来使其工作,但显然这是不行,我只是想确保这是某个权限问题。

是否有人面临同样的问题?

此致 安德烈

1 个答案:

答案 0 :(得分:0)

您的问题很可能是您试图将密钥存储在一起使用环境路径(例如%LOCALAPPDATA%)的文件夹路径中(或者甚至通过使用AddDataProtection提供的默认路径)。示例:“%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。