簡體   English   中英

.Net 控制台應用程序中的用戶機密問題

[英]Problems with user secrets in .Net console apps

我創建了一個.Net 6 控制台應用程序。 我添加了用戶機密,但我只獲得了 appsettings.json 文件中定義的值。 我使用 Visual Studio Professional 2022 版本 17.0.4。

初始步驟

  1. 從 Visual Studio 2022 的項目模板創建一個新的 .Net 6 控制台應用程序。
  2. 安裝 Microsoft.Extensions.Hosting nuget package(版本 6.0.0)。
  3. 安裝 Microsoft.Extensions.Configuration.UserSecrets nuget package(版本 6.0.0)。
  4. 添加 appsettings.json 文件並將復制到 Output 目錄設置為始終復制。
  5. 右鍵單擊項目和 select 管理用戶機密。

代碼

程序.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = Host.CreateDefaultBuilder()
                .ConfigureServices((context, services) => 
                {
                    services.Configure<GlobalSettings>(context.Configuration.GetSection("GlobalSettings"));
                    services.AddTransient<Worker>();
                })
                .Build();

var work = host.Services.GetRequiredService<Worker>();
await work.ExecuteAsync();

工人.cs

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

public class Worker
{
    private readonly ILogger<Worker> _logger;
    private readonly GlobalSettings _globalSettings;

    public Worker(ILogger<Worker> logger, IOptions<GlobalSettings> globalSettings)
    {
        _logger = logger;
        _globalSettings = globalSettings.Value;
    }

    public async Task ExecuteAsync()
    {
        _logger.LogInformation(_globalSettings.Foo);
        _logger.LogInformation(_globalSettings.Bar);
        await Task.CompletedTask;
    }
}

全局設置.cs:

public class GlobalSettings
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>disable</Nullable>
    <UserSecretsId>deedd476-f5d6-47f4-982e-1645c89789c7</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

appsettings.json:

{
    "GlobalSettings": {
        "Foo": "Normal Foo",
        "Bar": "Normal Bar"
    }
}

秘密.json:

{
    "GlobalSettings": {
        "Foo": "Secret Foo",
        "Bar": "Secret Bar"
    }
}

我試過的

  • 檢查 csproj 中的用戶密碼 ID 是否與文件夾匹配,它確實:C:\Users\Dennis\AppData\Roaming\Microsoft\UserSecrets\deedd476-f5d6-47f4-982e-1645c89789c7
  • 重建了項目。
  • 關閉 Visual Studio 2022 並以管理員身份再次運行。
  • 從頭開始創建一個新項目。
  • 將代碼與我同事的一個項目進行了比較。 我找不到任何區別,但他的代碼在我運行時有效。
  • 將 IOptionsSnapshot 更改為 IOptions 和 IOptionsMonitor。
  • 將 AddTransient 更改為 AddSingleton。
  • 做了相同的步驟,但使用了一個 .Net 5 項目。

謝謝。

我誤解了 Host.CreateDefaultBuilder 方法的工作方式。 根據文檔( docs ):

當 EnvironmentName 為“開發”時,使用入口程序集從用戶機密加載應用程序 IConfiguration

我的環境是生產環境(可能是后備值)。 它在我同事的項目中有效,因為它包含一個launchSettings.json 文件,其中 DOTNET_ENVIRONMENT 環境變量設置為 Development。

記得在 Builder 中調用 AssUserSecrets(...) 嗎?

https://makolyte.com/how-to-add-user-secrets-in-a-dotnetcore-console-app/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM