在 IIS 中运行时,AspNet Core 使用内存存储库中的数据保护
Posted
技术标签:
【中文标题】在 IIS 中运行时,AspNet Core 使用内存存储库中的数据保护【英文标题】:AspNet Core using in memory repo for data protection when running in IIS 【发布时间】:2016-05-08 11:10:01 【问题描述】:我正在运行带有 AspNet Mvc Core RC1 网站的生产服务器 (Windows Server 2012)。
我在日志中看到以下内容:
Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.
查看DataProtection的源代码后,我将问题跟踪到以下方法调用:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
这可能由于某种原因在服务器上返回 null。我没有任何特殊的自定义配置,我已经阅读了docs,所以我认为默认配置会起作用。
我认为问题在于 IIS 网站未在特定用户的上下文中运行,但我不知道如何确认或解决此问题。我的网站配置了自己的池。
顺便说一句:运行内存存储库来存储密钥的结果会导致它们在应用程序退出时回收,这非常烦人,甚至不适合在生产环境中使用。
【问题讨论】:
您的应用程序身份是否设置为加载其用户配置文件? @TGlatzer 我认为这是问题所在(除了关于容器的问题)。当我可以访问服务器时,我会尝试丢失它。 【参考方案1】:应在 IIS 配置中加载用户配置文件。
打开 IIS,右键单击应用程序池,然后单击高级设置。并将“加载用户配置文件”设置为 true。重新启动您的应用,它应该可以正常运行。
【讨论】:
在我的 IIS 上,它已经设置为 true,这并不能为我解决此错误... 但是……为什么???现在才开始发生?有什么改变吗?我不明白。【参考方案2】:ASP.NET 应用程序使用的数据保护密钥存储在应用程序外部的注册表配置单元中。将您的应用程序作为 AppPool Identity 运行时,您必须为与 ASP.NET Core 应用程序一起使用的每个 AppPool 创建一个注册表配置单元。
对于独立的 IIS 安装,您可以使用 Data Protection PowerShell script for each application pool 与 ASP.NET Core 应用程序一起使用。密钥将保存在注册表中。
就像日志中明确指出的那样,由于 Data Protection 查找的注册表配置单元不存在,因此密钥不会持久保存到磁盘。相反,它们将是短暂的并且仅存在于内存中。
在网络场方案中,可以将应用程序配置为使用 UNC 路径来存储其数据保护密钥环。默认情况下,数据保护密钥未加密。您可以在每台机器上部署一个 x509 证书来加密密钥环。
查看official ASP.NET Core doc about data-protection了解更多信息
【讨论】:
这是正确的答案,基本上你需要告诉 IIS 在哪里存储密钥,以便它可以在会话之间重新访问。刚刚回答了一个类似的问题***.com/questions/46225867/… 如果您只是在开发机器上运行,这甚至会成为问题吗?【参考方案3】:那些在访问权限非常有限的托管环境中的人可以改用PersistKeysToFileSystem。 将以下清单添加到 Startup.cs 将解决您的问题:
public void ConfigureServices(IServiceCollection services)
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
您可以根据需要更改路径字符串。 如果您想通过调用任何 ProtectKeysWith* 配置 API 来配置系统以保护静态密钥,请同时检查 ProtectKeysWith。
【讨论】:
【参考方案4】:看看this from the DataProtection Git repository
简而言之,IIS 中存在一个可能永远无法更正的错误,它会阻止 DataProtection 键的正确注册表设置。有一个 powershell script 可以手动正确设置注册表,以便它适用于 AspNet Core。为您用于 AspNet Core 应用程序的每个应用程序池运行脚本后,这些应用程序将按预期工作。
【讨论】:
如果我在访问权限非常有限的托管环境中,我还能做什么。我既不能运行 powershell 脚本也不能更改应用程序池设置? 您的处境很艰难...我认为您应该检查是否有可能找到有权执行此操作的人。通常,如果有一些书面工作证明是合理的,您应该能够找到某人/程序来更改服务器配置。祝你好运!以上是关于在 IIS 中运行时,AspNet Core 使用内存存储库中的数据保护的主要内容,如果未能解决你的问题,请参考以下文章
System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务
在 WPF .net core 5 中运行时更改应用程序文化时如何更新属性绑定
从 IIS 上的 ASP.NET Core 应用程序请求超时