AspNet Core在IIS中运行时使用内存repo进行数据保护

mra*_*hal 33 iis data-protection iis-8 asp.net-core

我正在运行一个带有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.
Run Code Online (Sandbox Code Playgroud)

在检查DataProtection的源代码,我将问题跟踪到以下方法调用:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这可能在服务器上返回null.我没有任何特殊的自定义配置,我已经阅读了文档,所以我认为默认设置是有效的.

我认为问题是IIS网站没有在某个用户的上下文中运行,但我不知道如何确认或修复此问题.我的网站配置了自己的池.

另外:运行内存存储库以存储密钥的结果导致它们在应用程序退出时进行回收,这非常烦人,甚至不打算在生产环境中使用.

mra*_*hal 29

应在IIS配置中加载用户配置文件.

打开IIS,右键单击Application Pools,然后单击Advanced Settings.并将"加载用户配置文件"设置为true.重新启动你的应用程序,它应该完美.

  • 在我的IIS上它已经设置为true,这不能解决我的错误... (2认同)
  • 但是......为什么??? 它现在才开始发生?有什么变化吗?我不明白. (2认同)

Sou*_*tti 10

ASP.NET应用程序使用的数据保护密钥存储在应用程序外部的注册表配置单元中.将应用程序作为AppPool Identity运行时,必须为与ASP.NET Core应用程序一起使用的每个AppPool创建一个注册表配置单元.

对于独立IIS安装,您可以将Data Protection PowerShell脚本 用于与ASP.NET Core应用程序一起使用的每个应用程序池.密钥将保留在注册表中.

就像在日志中明确说明的那样,因为Data Protection查找的注册表配置单元不存在,所以密钥不会持久保存到磁盘.相反,它们将是短暂的,只存在于记忆中.

在Web场方案中,可以将应用程序配置为使用UNC路径来存储其数据保护密钥环.默认情况下,数据保护密钥未加密.您可以将x509证书部署到每台计算机以加密密钥环.

有关更多信息,请参阅官方ASP.NET核心文档


vah*_*hid 5

位于访问权限非常有限的托管环境中的用户可以改用PersistKeysToFileSystem。将以下列表添加到 Startup.cs 将解决您的问题:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
}
Run Code Online (Sandbox Code Playgroud)

您可以根据需要更改路径字符串。如果您想通过调用任何 ProtectKeysWith* 配置 API 将系统配置为保护静态密钥,另请检查ProtectKeysWith 。