首页 > 解决方案 > .Net framework 4.8 User Secret - 在 Membership Provider 中访问 ConnectionString

问题描述

我正在尝试在带有 .Net 框架 4.8 的 Asp.net MVC 中使用 UserSecret。我在通过 UserSecret 访问ConnectionString时遇到问题,原因是我也在使用Membership 提供程序Entityframework edmx文件。我用来访问连接字符串的以下代码

<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" mode="Greedy" userSecretsId="b503099f-e1d9-4700-9e50-cf4081a700e3" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </builders>
  </configBuilders>

<connectionStrings configBuilders="Secrets">
    <remove name="LocalSqlServer" />
    <add name="LocalSqlServer" connectionString="" providerName="System.Data.SqlClient" />
    <add name="HIPAADbEntities" connectionString="" providerName="System.Data.EntityClient" />
  </connectionStrings>

在我运行应用程序时编写上述代码后,我遇到以下错误

在此处输入图像描述

这些是用 web.config 编写的代码行,这给了我错误

<membership userIsOnlineTimeWindow="120">
      <providers>
        <remove name="AspNetSqlMembershipProvider" />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="true" enablePasswordReset="false" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="false" passwordFormat="Encrypted" maxInvalidPasswordAttempts="25" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
        <add name="MyMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="true" enablePasswordReset="false" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="false" passwordFormat="Encrypted" maxInvalidPasswordAttempts="25" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
      </providers>
    </membership>

UserSecret文件如下

<?xml version="1.0" encoding="utf-8"?>
<root>
  <secrets ver="1.0">
    <secret name="LocalSqlServer" value="Data Source=.;Initial Catalog=TestDB;Integrated Security=True"></secret>
  </secrets>

</root>

如何访问有权访问连接字符串的会员标签中的 UserSecret?没有 UserSecrets 它工作正常。但我需要让它与 Usersecret 一起使用

标签: c#asp.net.netasp.net-mvcasp-net-config-builders

解决方案


我在尝试以与使用 User Secrets 功能的 AppSettings 值相同的方式获取连接字符串时遇到了类似的问题。主要问题是连接字符串值的结构与 AppSettings 不同,因此无法以完全相同的方式填充它们。

关于文档,您可以通过三种模式从 UserSecrets 获取值

关于三种可用模式的图像

StrictGreedy模式适用于 AppSettings 但不适用于连接字符串。

我发现解决该问题的方法是仅对 ConnectionStrings 部分使用扩展模式。您应该在构建器中创建两个条目,它们都指向同一个文件,主要区别在于其名称和模式。

这是我所说的一个例子。

Web.config 文件

...
<configBuilders>
<builders>
    <add name="AppSettings_Secrets" userSecretsId="STRING_UNIQUE_ID" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <add name="ConnectionStrings_Secrets" mode="Expand" userSecretsId="STRING_UNIQUE_ID" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</builders>
</configBuilders>
<appSettings configBuilders="AppSettings_Secrets">
    <add key="MY_KEY_01" value="xxx" />
    <add key="MY_KEY_02" value="xxx" />
</appSettings>
<connectionStrings configBuilders="ConnectionStrings_Secrets">
    <add name="defaultConnection" connectionString="${CONNECTION_STRING}" />
</connectionStrings>
...

请记住,如果要管理同一文件 secrets.xml 中的所有机密,则必须userSecretsId="STRING_UNIQUE_ID"对两个构建器使用相同的值。

秘密.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<root>
  <secrets ver="1.0">
    <secret name="MY_KEY_01" value="Key value 01" />
    <secret name="MY_KEY_02" value="Key value 02" />
    <secret name="CONNECTION_STRING" value="Connection string value" />
  </secrets>
</root>

推荐阅读