在.NET 6 中加载连接字符串

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

我有一个 webAPI 应用程序,我正在尝试保护其与数据库的连接字符串。在连接字符串中,我用占位符替换了服务器、用户和密码。占位符是密钥,其值是加密的服务器、用户和密码,如下所示。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*", 
  "ConnectionStrings": {
    "DefaultConnection": "Server=[SV];Initial Catalog=BILLING;Persist Security Info=False;User ID=[UI];Password=[PW];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;",
    "SV": "zkyj5mpIrHFTW7G6TCn7VriSRFzTakIVwGmMwME1kw", 
    "UI": "PSEQqm6qj9cx944FzhIrdQ==",
    "PW": "NpfObfbydTZK+pmAsVlFn8xoj8L4irtVd988+emYyw="

  }

}

在program.cs中我有以下内容:

using System.Text;
using System.Text.Json.Serialization;

var builder = WebApplication.CreateBuilder(args);


builder.Services.AddScoped<ISecurity, Security>();
builder.Services.AddScoped<ConnectionSecurity>();

var conn = builder.Configuration.GetConnectionString("DefaultConnection");
var server = builder.Configuration.GetConnectionString("SV");
var pass = builder.Configuration.GetConnectionString("PW");
var user = builder.Configuration.GetConnectionString("UI");

var sec = new ConnectionSecurity(new Security());
var connectionString = sec.BuildConnectionString(conn,server,user,pass); 



builder.Services.AddDbContext<DBContextBilling>(x => x.UseSqlServer(connectionString));

ConnectionSecurity 类具有以下方法。

public string BuildConnectionString(string con,string Server,string User,string Pass)
        {
            string connString = con;

            Server = DecryptCredentials(Server);
            User = DecryptCredentials(User);
            Pass = DecryptCredentials(Pass);

            connString = connString.Replace("[SV]", Server);
            connString = connString.Replace("[UI]", User);
            connString = connString.Replace("[PW]", Pass);


            return connString;
        }

应用程序编译良好,连接字符串中的占位符被正确解密和替换。传递给

x.UseSqlServer(connectionString)
的连接字符串是正确的。 当我向数据库中的某个项目发出请求时,问题出现了,事件查看器中捕获到以下错误:

1.RequestPath: /api/v1/AccessRight/GetProfileCategories
ActionId: XXXXXXXXXXXXXXXXXXXXXXXX
ActionName: BillingWebAPI.Controllers.AccessRightController.GetProfileCategories (BillingWebAPI)

An error occurred using the connection to database 'BILLING' on server '[SV]'.

2.Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

即使我将传递的connectionSting替换为空字符串,

x.UseSqlServer("")
,我仍然收到上述错误。我已经多次清理和重建应用程序,但仍然出现错误。如果连接字符串是纯文本,包含服务器、用户和密码,则请求将通过,我将从数据库中获取结果。 请帮助我了解连接字符串在应用程序中的加载位置和方式?还有其他保护连接字符串的方法吗?

c# .net database-connection connection-string
1个回答
0
投票

@NotFound 已找到答案,我没有在 DBContext 中看到方法重写,

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
,它重新选择连接字符串。 谢谢你

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