【问题标题】:How to get ConnectionString from Secrets.json in Asp.Net Core 6?如何从 Asp.Net Core 6 中的 Secrets.json 获取 ConnectionString?
【发布时间】:2022-06-16 04:07:45
【问题描述】:

我是 Asp.Net Core 和 EF 的新手。我正在从数据库端开发一个简单的 CRUD,使用 Secrets.json 文件隐藏我的连接字符串凭据。

但我不知道如何使用 AddDbContext() 引用文件。

到目前为止我的代码:

 public class Startup
    {
        public Startup(IConfigurationRoot configuration)
        {
            Configuration = configuration;
        }
        public IConfigurationRoot Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<POTS.myDBContext>(options => 
                options.UseSqlServer(Configuration.GetConnectionString("myConxStr")));
            services.AddControllers();
        }

代码运行时,AddDbContext&lt;&gt; 行出现此错误

System.ArgumentNullException HResult=0x80004003 消息=值 不能为空。 (参数'connectionString')
Source=Microsoft.EntityFrameworkCore.SqlServer StackTrace: 等等等等

我认为这是因为代码正在寻找appsettings.json 文件中的参数,我不希望连接字符串在该位置。

我错过了什么?

【问题讨论】:

  • 你确定是 ASP.NET Core 6 而不是 5?您在项目中使用 Startup.cs。
  • @Rena 基于教程,我自己手动添加了 setup.cs。我知道不需要。还在学习中。
  • 嗨@Fandango68,知道了。无论如何,我在下面分享了两种情况。你可以检查一下。

标签: entity-framework asp.net-core connection-string secretsmanager


【解决方案1】:

在 ASP.NET 6 之前

您可以在Startup.cs 的配置参数中添加额外的Secrets.json 文件,如下所示:

public class Startup
{
    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        configuration = new ConfigurationBuilder().SetBasePath(env.ContentRootPath)
        .AddJsonFile("Secrets.json")
        .Build();

        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }
    //...
}

或者在Program.cs中添加:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var env = hostingContext.HostingEnvironment;

        config.SetBasePath(env.ContentRootPath)
            .AddJsonFile("Secrets.json", optional: true, reloadOnChange: true);

    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    });

在 ASP.NET 6 中

您可以将其添加到Program.cs,如下所示:

var builder = WebApplication.CreateBuilder(args);
builder.Configuration
    .SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("Secrets.json");

builder.Services.AddDbContext<POTS.myDBContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("myConxStr")));

// Add services to the container....
var app = builder.Build();
//....

然后确保您的 json 文件(Secrets.json) 必须如下所示

{
  "ConnectionStrings": {
    "myConxStr": "xxxxxxx"
  }
}

【讨论】:

  • 实际上,除了您上次建议将“ConnectionString”一词放在secrets.json 文件中之外,我不需要做任何事情。所以是的,这对我有用。谢谢!
  • 不客气! :)
  • Rena,我又回到了这个问题,因为在部署到 IIS 时,它不起作用。我没有显示任何数据。
  • 由于我使用的是 EF,我读到 SQL Server 数据库登录必须具有管理员访问权限并且能够创建表,因为 EF 尝试创建与连接到它相关的资源表.我知道很奇怪。我正在尝试使用只读 SQL 登录名进行部署,因为我没有写回数据库。
  • 另外,上面通过直接引用 secrets.json 失败,因为它是一个连接的服务资源。项目的根文件夹中没有实际的 secrets.json 文件。这将破坏隐藏连接字符串的目的。
【解决方案2】:

在 MS 文档中有一个完整的演练app secrets。值得注意的是,甚至 MS 也暗示这是用于非生产用途。

ASP.NET Core 6.0 的基本步骤(参考上面的链接):

  1. 通过cli初始化项目目录中的secrets,将在projectName.csproj文件的PropertyGroup中创建一个'UserSecretsId':

    dotnet 用户密码初始化

  2. 创建新的秘密:

    dotnet 用户密码集“MyDbPassword”“SuperSecretPassword123”

  3. 创建了一个 secrets.json 文件:

    • Windows:%APPDATA%\Microsoft\UserSecrets\secrets.json
    • Mac/Linux:~/.microsoft/usersecrets//secrets.json

要在您的情况下在 Program.cs 中使用 ConnectionStrings,请在文档中向下滚动到“字符串替换为机密”

var conStrBuilder = new SqlConnectionStringBuilder(
    builder.Configuration.GetConnectionString("MyDbConnectionWithoutPassword"));
conStrBuilder.Password = builder.Configuration["MyDbPassword"];
var connection = conStrBuilder.ConnectionString;

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多