我正在开发一个 asp.net 核心应用程序来调谐网络,并且我正在使用“AddDataProtection”来保护静态 key 加密,就像文档建议的那样,但是当我部署我的应用程序并直接运行时从具有 AppPool 身份的 IIS 中,从未创建 key ,并且我在 DpapiNG 窗口日志中收到错误。
我的代码如下:
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,所以这里权限不是问题。
我已经尝试直接从 MMC 向 AppPool 应用程序用户添加权限到它自己的私钥,但它没有用,甚至授予了该位置的完整路径的权限, key 应该像此处所述那样创建https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview (检查第一条评论)但它也没有用。
我只能通过将 AppPool 设置为以管理员身份运行来使其工作,但显然这是不行的,我只是想确保这是某个地方的权限问题。
是否有人面临同样的问题可以提供帮助?
问候, 安德烈
最佳答案
您的问题很可能是您试图将 key 存储在您正在拼凑的文件夹路径中的某个位置(或者甚至通过使用 AddDataProtection 提供的默认路径),该文件夹路径使用诸如 %LOCALAPPDATA% 的环境路径。示例:“%LOCALAPPDATA%\ASP.NET\DataProtection-Keys”。 通常,默认情况下 IIS 不会使用 %LOCALAPPDATA% 等环境路径变量设置您的应用程序池帐户。该值最终为空,然后您的应用会尝试将 key 写入错误的文件夹(例如\ASP.NET\DataProtection-Keys 而不是 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys)。
修复:在 %WINDIR%\System32\inetsrv\config\applicationHost.config 中设置 setProfileEnvironment=true。我认为您还必须重新启动 IIS。
关于IIS - AddDataProtection PersistKeysToFileSystem 未创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44714438/