【问题标题】:User Secrets in .NET 4.7 connectionstrings format.NET 4.7 连接字符串格式的用户机密
【发布时间】:2024-01-13 14:35:01
【问题描述】:

我已经挖掘了几个小时并不断提出有关 .NET Core 的信息,但几乎没有任何关于 .NET 4.7 完整框架的信息。我想出了如何将用户机密添加到我的 Web API 解决方案的主项目中。我得到了基本的 secrets.xml 文件,我需要在其中存储我的数据库用户名和密码或我的连接字符串。我发现的每篇文章都谈到了您需要对 web.config 进行的更改。但是,在 secrets.xml 文件中没有显示如何处理我的连接字符串、如何格式化它。我可以创建一个名称/值对,但这似乎没有任何作用,我的应用无法连接到数据库。

我的 Web.config 中有这个:

  <configBuilders>
    <builders>
    <add name="Secrets" userSecretsId="5c65f7eb-a7e1-46cc-bff4-a526678005f2" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=1.0.0.0, Culture=neutral" /></builders>
  </configBuilders>

  <connectionStrings configBuilders="Secrets">
    <add name="ShopAPDbConnectionString" connectionString="" providerName="System.Data.SqlClient" />
  </connectionStrings>

我的 secrets.xml 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <secrets ver="1.0">
    <secret name="ShopAPDbConnectionString" value="Server=SQLDEV01;Database=ShopAP; Integrated Security=True;" />
  </secrets>
</root>

如何正确格式化并使其正常工作?

【问题讨论】:

  • 我对这个话题了解不多,但是在网上阅读后,我觉得使用自定义名称的配置文件似乎并不容易,例如secrets.config
  • 您是否曾经成功使用过 UserSecretsConfigBuilder?我和你在同一个地方。
  • 你的两个文件看起来都很好 - 和我的几乎一模一样。

标签: asp.net .net web-config connection-string asp-net-config-builders


【解决方案1】:

这是我根据https://github.com/aspnet/MicrosoftConfigurationBuilders 能够开始工作的内容

Web.config

<configuration>
    <configSections>
        <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
    </configSections>
    <configBuilders>
        <builders>
            <add name="Secrets" userSecretsFile="~/../../../SecretsTest/secrets.xml" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            <add name="Json" jsonFile="${JSONConfigFileB}" optional="true" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </builders>
    </configBuilders>
    <!--...-->
    <appSettings configBuilders="Secrets">
        <!--...-->
    </appSettings>
    <!--...-->
    <connectionStrings configBuilders="Json">
        <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="dummy.value.required" />
    </connectionStrings>
    <!--...-->
</configuration>

secrets.xml

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <secrets ver="1.0">
    <secret name="usersecret1" value="dogodog" />
    <secret name="usersecret2" value="secretbar" />
    <secret name="JSONConfigFileB" value="C://Users//xxx//Documents//xxx//xxx//SecretsTest//settings.json" />
  </secrets>
</root>

settings.json

{
  "DefaultConnection": "Server=666.66.666.6;Database=BigToe;User ID=FireBall;Password=BunniesAreSoft",
}

【讨论】:

  • 这适用于我们团队的大多数成员,但不适用于一个人,我们不知道为什么。它的行为就好像根本没有 UserSecrets 配置一样。 @gregory-mertens,您或其他人是否有过同样的经历并找到任何解决方法?
【解决方案2】:

您的两个文件看起来都不错 - 与我的几乎完全相同。 你是如何创建你的秘密文件的?您是否使用右键单击 Web 项目和管理用户机密? 这将在 %APPDATA% 中的文件夹位置创建一个文件,当您在 Visual Studio 中按 F5 时应该拾取该文件(调试 > 开始调试)。但是,如果您编译然后浏览到 localhost,IIS 将看不到。即使您将 inetmgr 中的 App Pool Identity 更改为在您的帐户下运行,并设置 Load User Profile - 它仍然找不到它。

要找到此案例中机密的正确位置,请运行您的网络应用并获取结果

string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

并将机密文件复制到匹配的子文件夹 Microsoft\UserSecrets\(guid)\

例如 C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\5c65f7eb-a7e1-46cc-bff4-a526678005f2\secrets.xml

您可能需要一次性在资源管理器中获取访问权限,并创建 UserSecrets 文件夹及以下文件夹。

如果您以后编辑它,请记住更新这两个副本。

【讨论】:

    【解决方案3】:

    我正在尝试做同样的事情,但不幸的是,我认为这仅适用于 .Net Framework/Web.config 的 appSettings。

    【讨论】:

    • 是什么让你怀疑?你有没有得到确认?
    • user2654850 - 见我上面的回答
    • 老实说,我现在不记得了,因为这是不久前的事了,但似乎一切都明确地面向 appSettings。
    • 现在,任何部分都可以处理,connectionStrings 开箱即用。检查github.com/aspnet/…
    最近更新 更多