在 DotNet 8 中使用 Secrets

问题描述 投票:0回答:1

当我将连接字符串硬编码到我的项目中时,它工作得很好,而且,Azure Key Vault 在发布模式下运行时工作得很好。但是,当我尝试使用 Secrets.json 时,某些端点仍然有效,但其他端点返回此错误:

System.InvalidOperationException: The ConnectionString property has not been initialized.
   at Microsoft.Data.SqlClient.SqlConnection.PermissionDemand()
   at Microsoft.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
   at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
   at Microsoft.Data.SqlClient.SqlConnection.InternalOpenAsync(CancellationToken cancellationToken)

正如我提到的,对 URL 进行硬编码可以正常工作,并且在发布版本中运行也可以正常工作,

这是我的 Program.cs 中的内容:

var builder = WebApplication.CreateBuilder(args);

#if DEBUG
builder.Configuration.AddUserSecrets<Program>();

#else
var vaultUri = Environment.GetEnvironmentVariable("VaultUri");
var keyVaultEndpoint = new Uri(vaultUri);
builder.Configuration.AddAzureKeyVault(keyVaultEndpoint, new DefaultAzureCredential());
#endif

在我的数据库上下文中:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {

#if DEBUG
        string connectionString = _configuration.GetConnectionString("HomeDatabase");

#else
        string connectionString = _configuration.GetConnectionString("AzureDatabase");
        
#endif
        optionsBuilder.UseSqlServer(connectionString);

    }

我尝试设置断点,似乎出于某种原因,在调试时,字符串设置正确,但出于某种原因,在点击步骤一千次后,它跳回“string connectionString = _configuration.GetConnectionString( “主页数据库”);“在该行,connectionString 突然变为 null...

补充一下,简单的端点似乎可以工作,但是如果我的 dbcontxt 被第二次调用,那么连接字符串就会变为空。

如果有人有任何想法,我将非常感激。

谢谢你。 :)

编辑~~~~~~~~~~~~~~~~~~~

在尝试了更多之后,不厌其烦地使用新的数据库上下文创建一个新数据库来处理令牌。一旦我添加了秘密,我再次收到空错误...

这些秘密似乎一直保留到使用它们的上下文完成为止。

asp.net-web-api app-secret
1个回答
0
投票

最后我想通了。我的授权处理程序和中间件存在冲突。通过删除中间件并让自定义授权处理程序处理所有事情来修复它。

© www.soinside.com 2019 - 2024. All rights reserved.