Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET core 2.2 web api记录与数据保护密钥相关的警告:我们应该如何处理此问题?_C#_Iis_Asp.net Core_Data Protection - Fatal编程技术网

C# ASP.NET core 2.2 web api记录与数据保护密钥相关的警告:我们应该如何处理此问题?

C# ASP.NET core 2.2 web api记录与数据保护密钥相关的警告:我们应该如何处理此问题?,c#,iis,asp.net-core,data-protection,C#,Iis,Asp.net Core,Data Protection,我们有一个ASP.NET core 2.2 web应用程序,它公开了一些web api控制器。 我们的应用程序没有任何类型的身份验证机制,所有公开的端点都可以由匿名用户调用 当我们在IIS下托管应用程序时,在应用程序启动时会收到三条奇怪的警告消息。以下是我们得到的日志: 使用内存存储库。密钥将不会持久化到存储 用户配置文件和HKLM注册表均不可用。使用临时密钥存储库。应用程序退出时,受保护的数据将不可用 没有配置XML加密程序。密钥{GUID}可以以未加密的形式持久化到存储器中 所有这些日志都将

我们有一个ASP.NET core 2.2 web应用程序,它公开了一些web api控制器。 我们的应用程序没有任何类型的身份验证机制,所有公开的端点都可以由匿名用户调用

当我们在IIS下托管应用程序时,在应用程序启动时会收到三条奇怪的警告消息。以下是我们得到的日志:

  • 使用内存存储库。密钥将不会持久化到存储
  • 用户配置文件和HKLM注册表均不可用。使用临时密钥存储库。应用程序退出时,受保护的数据将不可用
  • 没有配置XML加密程序。密钥{GUID}可以以未加密的形式持久化到存储器中
  • 所有这些日志都将Microsoft.AspNetCore.DataProtection作为日志上下文,并由ASP.NET核心框架内部编写

    这些日志的含义对我来说似乎非常清楚:有一个“键”(无论它是什么意思)将被持久保存在内存中,因为没有提供注册表存储(当然,当应用程序退出时,它将丢失)。还有一个警告指出,如果保留此密钥,将不会以任何方式进行加密

    在这一点上,我想问以下问题:

    • 名为“key”的日志中报告的GUID是什么?它的用途是什么
    • 是否存在与此警告相关的安全风险
    • 我应该采取行动吗
    一些补充资料:

    一些在线博客建议此类数据保护警告与ASP.NET标识的使用有关,但我们在应用程序中不使用标识(我们没有启用身份验证)。其他博客建议设置宿主应用程序池以加载用户配置文件:我已经尝试过了,但警告仍然存在

    重要更新2019年4月2日 多亏了asp.net核心开发团队的帮助,我解决了这个问题。 有关完整的参考资料,请参阅

    简单地说,这个问题与我的开发机器上的IIS配置有关。为了使ASP.NET核心数据保护按预期工作,IIS和宿主应用程序池()有一些特定的配置

    更新日期:2019年9月13日 对于那些在ASP.NET core 2.2 web应用程序中有相同警告的应用程序,我建议您看看这个

    我们现在已经在产品中添加了cookie身份验证,我们需要支持kubernetes主机。在具有cookie身份验证的kubernetes中,此stackoverflow问题中讨论的警告是相关的,因为您必须为ASP.NET core提供一个存储ASP.NET core数据保护系统所需密钥的位置


    我们选择在MongoDB中实现持久密钥环。可以找到一些细节。我不能在这里显示代码(该项目不是开源的),但我们基本上从官方开始,用注入的
    IMongoCollection
    替换了entity framework db上下文的所有用法。我们还通过删除Id属性进行了修改(我们更喜欢让MongoDB生成自己的对象Id)

    数据保护由各种组件用于在运行时加密数据,例如:

    • 验证cookies
    • 身份密码重置令牌
    您可以在文档中了解更多信息:

    您正确理解了警告,它已创建了一个密钥,但无法决定将密钥存储在何处。 因此,如果应用程序重新启动,它将丢失。 如果您不使用身份验证cookies等,则可以忽略这些警告。
    您还可以在应用程序文件夹外配置存储位置。

    如果您未使用任何身份验证机制(例如:使用此类型密钥的ASP.NET Core Identity),并且如果您未在其他地方使用DataProtection API,您现在就可以使用了

    那里发生了什么事?

    您输入了用于存储密钥的回退机制(内存存储)。当应用程序重新启动时,您将丢失密钥

    您可以面对哪些问题?

    示例:如果您使用的是身份验证机制,那么最终会出现错误的身份验证cookie、电子邮件验证令牌、重置密码令牌等

    您现在可以做什么?

    如果您想要(经得起未来考验的解决方案),您可以将密钥存储在某个位置(例如:Redis)


    进一步阅读:

    ASP.Net core DataProtection将密钥存储在主目录(/root/.aspnet/DataProtection密钥)中,因此当容器重启密钥丢失时,可能会导致服务崩溃

    这可以通过在

    • 在永久位置(卷)上保留密钥并装载该卷 装卸集装箱
    • 在外部密钥存储(如Azure或Redis)中保留密钥
    有关ASP.NET数据保护的更多详细信息:

    使用以下命令将外部卷(C:/temp kyes)装载到docker容器卷(/root/.aspnet/DataProtection key)

    docker run -d -v /c/temp-keys:/root/.aspnet/DataProtection-Keys container-name
    
    此外,您需要更新Starup.cs-ConfigureServices以配置数据保护策略

    services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"C:\temp-keys\"))
                    .UseCryptographicAlgorithms(new AuthenticatedEncryptorConfiguration()
                    {
                        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
                        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
                    });
    

    您所说的cookie是ASP.NET identity使用的cookie,用于序列化主体并在请求之间维护用户标识?是的,我正在谈论这些:)我们不使用任何身份验证,甚至不在启动类中调用app.UseAuthentication()。也就是说,我想我们可以根据您的解释安全地忽略警告是的,只是注意与数据保护相关的异常,以防您使用的某些东西在您不知情的情况下使用数据保护。因此,如果我理解得很好,在您不需要授权cookie的情况下,电子邮件地址验证和/或密码重置(换句话说,ASP.NET identity提供的一组功能),您可以安全地忽略警告。它是