我正在开发一个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设置为以管理员的身份运行来使其工作,但显然这是不行,我只是想确保这是某个权限问题。
是否有人面临同样的问题?
此致 安德烈
答案 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。