关于AddDataProtection,SetApplicationName实际上是做什么的?

3
考虑这个示例代码:这个示例代码
services.AddDataProtection()
    .SetApplicationName("TestingApp");

文档似乎表明,像这样设置应用程序名称将允许两个服务器知道它们应该使用相同的 cookie 密钥(假设还使用类似于 PersistKeysToDbContext 的东西进行持久化)。
然而,当我查看持久化的密钥时,在文档中并没有看到共享的应用程序名称。
<key id="c34df9c6-bf38-49e8-97cf-dda5f8bc141c" version="1">
  <creationDate>2021-03-23T21:47:20.4615267Z</creationDate>
  <activationDate>2021-03-23T21:47:19.4492298Z</activationDate>
  <expirationDate>2021-06-21T21:47:19.4492298Z</expirationDate>
  <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=3.1.13.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
    <descriptor>
      <encryption algorithm="AES_256_CBC" />
      <validation algorithm="HMACSHA256" />
      <masterKey xmlns:p4="http://schemas.asp.net/2015/03/dataProtection" p4:requiresEncryption="true">
        <!-- Warning: the key below is in an unencrypted form. -->
        <value>eNZoh1a2DEiEi03ae1aklP9dM3z____FAKE_____Pgy8bcVpkOI+q/I9d9iELvy+ptOW54Q==</value>
      </masterKey>
    </descriptor>
  </descriptor>
</key>

该关键字的“友好名称”似乎是GUID。
“SetApplication”实际上会导致持久化XML中有什么变化?

1
不确定是否直接去源头可能会有所帮助 https://source.dot.net/#Microsoft.AspNetCore.DataProtection/DataProtectionBuilderExtensions.cs,f42f99201351fd19 - undefined
1
在反伪造中找到了它的使用位置:https://source.dot.net/#Microsoft.AspNetCore.Antiforgery/Internal/AntiforgeryOptionsSetup.cs,17 - undefined
1
添加数据保护使用名称创建(延迟)保护器 https://source.dot.net/#Microsoft.AspNetCore.DataProtection/DataProtectionServiceCollectionExtensions.cs,100 - undefined
1个回答

1

SetApplicationName 不会导致持久化 XML 发生任何更改。实际上,在生成 XML 后,您可以随时更改应用程序名称。

应用程序名称用作 IDataProtectionProvider 的主要 Purpose 字符串。

请考虑以下代码示例:

// Startup.cs
services.AddDataProtection().SetApplicationName( "My application name" );

// ExampleConsumer.cs
public ExampleConsumer( IDataProtectionProvider protectionProvider )
{
    var dataProtector = protectionProvider.CreateProtector( "My protector" );
}

如果您在调试器中运行此代码,并检查其目的,它将如下所示:
protectionProvider.Purposes: ["My application name"]  
dataProtector.Purposes: ["My application name", "My protector"]

有关目的的更多信息,请参见目的层次结构


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接