IIS-AddDataProtection文件系统未创建

IIS-AddDataProtection文件系统未创建,iis,asp.net-core,dpapi,Iis,Asp.net Core,Dpapi,我正在开发一个asp.net核心应用程序,以便在web far上进行tun,并且我正在使用“AddDataProtection”来保护静态密钥加密,如文档所建议的,但当我部署应用程序并直接从具有AppPool标识的IIS运行时,从未创建密钥,并且我在DpapiNG windows日志中出现错误 我的代码如下: services.AddDataProtection(opt => opt.ApplicationDiscriminator = ApplicationConfig.dataProt

我正在开发一个asp.net核心应用程序,以便在web far上进行tun,并且我正在使用“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);
从VisualStudio调试,一切运行正常,但我在管理员权限下运行VS,所以权限在这里不是问题

我曾尝试将AppPool应用程序用户的权限直接从MMC添加到私钥中,但它不起作用,甚至在该位置的完整路径上授予了权限,如果密钥应该像此处所述那样创建(检查第一条注释),但它也不起作用

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

有没有人面对同样的问题能够提供帮助

问候,,
André

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


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

如果您只需要执行services.AddDataProtection().PersistKeyStoreFileSystem(sharedDataProtectionDirInfo);我想它起作用了?只有对DPAPI的调用没有足够的凭据?请看,您是否尝试过protectToLocalMachine:true?是的,通过删除DPAPI创建了密钥,但正如文档所述,这是不可能的:“警告:如果更改密钥持久性位置,系统将不再自动加密静止的密钥,因为它不知道DPAPI是否是合适的加密机制。“关于protectToLocalMachine,ProtectKeysWithDpapiNG对此没有重载,只有ProtectKeysWithDpapi有重载。我知道这是不可能的,只是为了准确地隔离您的问题,我可能在未来几天内必须处理这个问题,我会看看是否遇到相同的问题。如果您使用Simple.ProtectKeysWithDpapiNG()(无参数,因此它使用您的广告帐户),是否正常工作?虽然已创建密钥,但仍会收到错误:取消密钥保护操作失败。加密参数:保护器名称:SID收件人类型:对称密钥加密标志:0x40失败信息:返回代码:0x80070005取消密钥保护操作失败。加密参数:标志:0x40失败信息信息:返回代码:0x8009002虽然很晚,但不是这样。我将其存储在“D:\IIS\keys”下,因此它不是系统目录。