c# - .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 一起使用
解决方案
我在尝试以与使用 User Secrets 功能的 AppSettings 值相同的方式获取连接字符串时遇到了类似的问题。主要问题是连接字符串值的结构与 AppSettings 不同,因此无法以完全相同的方式填充它们。
关于文档,您可以通过三种模式从 UserSecrets 获取值。
Strict
和Greedy
模式适用于 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>
推荐阅读
- excel - VBA 在另一列中的列中搜索值,如果未找到,则显示哪个,如果找到,则将偏移值复制到偏移量输入
- java - 如何使用 Spring Batch 读取 CSV,对其进行处理并将其写入为 CSV,一行可以产生多行?
- javascript - Nuxt.js:如何使用特定路径值启动服务器?
- sql-server - 在 SQL Server 中,如果我对多个字段有 UNIQUE 约束,是否需要在其中一个字段上建立索引?
- gnuplot - Gnuplot:用循环绘制编号文件
- python - 如何将列添加到具有基于列值的范围填充的行的熊猫数据框中
- scala - 是否可以在 Iterable 上进行模式匹配
- javascript - 使用 laravel 从为 js 生成的动态 html 中获取值
- node.js - 在本地提供 Firebase 托管站点时获得“权限被拒绝”
- android - Leanback 创建不同的自定义行视图