如何访问 Azure Function Independent Worker 服务配置中的用户密钥值?

nmp*_*uls 1 dependency-injection asp.net-core azure-functions

在我的函数应用程序(.NET 7.0,独立工作线程)中,我有一个使用 API 密钥的特定依赖项,该依赖项需要放入秘密存储中。我正在使用用户机密进行本地开发,但在配置依赖注入服务时,我一直困惑于如何访问这些机密值:

// secrets.json

{
  "apiKey": "1234567890"
}
Run Code Online (Sandbox Code Playgroud)
// Program.cs

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(s =>
    {
        string apiKey = ???;  // how to access user secrets here?
        s.AddScoped<IMyDependency>(sp => new MyDependency(apiKey));
    });
    .Build();
}

host.Run();
Run Code Online (Sandbox Code Playgroud)

Microsoft 提供了有关使用用户机密的指南:

但是这些解决方案都没有提供我所需要的,这是在设置依赖项注入时访问用户秘密值的一种方法。相反,推荐的解决方案使配置值本身注入依赖项,这是我无法使用的。

我尝试过的事情:

Har*_*tha 5

我已按照您提供的相同MSDoc来设置 UserSecrets。

感谢 @damienbodSOThread提供的代码。

我的.csproj文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UserSecretsId>****-d46c-****-9752-04-****</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.10.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.7.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup> 
   
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

Program.cs文件:

 Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureAppConfiguration(con =>
    {      
        con.AddUserSecrets<Program>(optional:true,reloadOnChange:false);
    })
    .ConfigureServices(s =>
    {
        var config = s.BuildServiceProvider().GetService<IConfiguration>();
        string apiKey = config.GetValue<string>("apiKey");
    })
    .Build();
host.Run();
Run Code Online (Sandbox Code Playgroud)

[编辑] - 我想向其他搜索者澄清并补充一点,虽然这看起来很明显,但 AddUserSecrets() 格式是使其适用于较新的 Program.cs 构造的唯一方法。Startup 示例无处不在,并且 AddUserSecrets() 似乎在不指定的情况下隐式工作,但仅适用于 Startup 样式。但我在互联网上找不到任何提及。程序是隐式的,因为不再有实际的 Startup 类。

如果不在用户 sercets id 中进行硬编码,我就无法让 User Secrets 为我服务,这显然是不可接受的。

输出:

在此输入图像描述