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



我正在运行一个带有AspNet Mvc Core RC1网站的生产服务器(Windows server 2012)。

我在日志中看到以下内容:

用户配置文件和HKLM注册表都不可用。使用临时密钥存储库。应用程序退出时,受保护的数据将不可用。

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

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

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

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

顺便说一句:运行内存中存储库来存储密钥的结果会导致它们在应用程序退出时被回收,这非常令人讨厌,甚至不适合在生产环境中使用。

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

打开IIS,右键单击"应用程序池",然后单击"高级设置"。并将"加载用户配置文件"设置为true。重新启动你的应用程序,它应该可以完美工作。

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

对于独立的IIS安装,可以对ASP.NET Core应用程序使用的每个应用程序池使用Data Protection PowerShell脚本。这些键将被保留在注册表中。

正如日志中明确指出的那样,由于Data Protection查找的注册表配置单元不存在,因此密钥将不会持久化到磁盘。相反,它们将是短暂的,只存在于记忆中。

在web场场景中,可以将应用程序配置为使用UNC路径来存储其数据保护密钥环。默认情况下,数据保护密钥不加密。您可以在每台机器上部署一个x509证书来加密密钥环。

有关更多信息,请参阅有关数据保护的官方ASP.NET Core文档

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\serversharedirectory"));
}

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

从DataProtection Git存储库中查看

简言之,IIS中存在一个可能永远无法更正的错误,该错误会阻止DataProtection密钥的正确注册表设置。有一个powershell脚本可以手动正确设置注册表,使其适用于AspNet Core。为AspNet Core应用程序使用的每个应用程序池运行脚本后,这些应用程序将按预期工作。

相关内容

  • 没有找到相关文章

最新更新