0
votes

.net Core Worker Service (BackgroundService) ne peut pas charger les secrets utilisateur

Avoir un service de travail de base .net avec .net core version 3.1.8 et asp.net core version 3.1.8 Je rencontre un problème pour charger le secret utilisateur à partir du service worker, mais le même fonctionne dans le projet principal asp.net.

Méthode commune appelée à la fois depuis asp.net core et .net core worker service

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config => config.AddUserSecrets(Assembly.GetExecutingAssembly()))
                .ConfigureServices((hostContext, services) =>
                {
                    // simplified
                    

                    services.AddSingleton<IApplicationSettings>(applicationSettings =>
                    {
                        var appSettings = new ApplicationSettings
                        {
                            FioApiKey = config.GetFioApiKey()
                        };

                        
                        return appSettings;
                    });

                    services.AddHostedService<Worker>();
                });
    }

csproj du service des travailleurs

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>8d19c97d-a2fb-4a51-a694-9635b9c0c42c</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.8" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.8" />
  </ItemGroup>
</Project>

startup.cs du service de travail

public static string GetFioApiKey(this IConfiguration configuration)
            => configuration["PaymentServiceSecrets:FioApiKey"];

trouvé ce lien vers le problème de github, a essayé d'appliquer la solution de contournement mais ne fonctionne toujours pas


1 commentaires

Attention, les user-secrets ne sont censés être utilisés que pendant le développement ( docs.microsoft.com/en-us/aspnet/core/security/… )


3 Réponses :


0
votes

tu devrais essayer ça

public static YourConfigObject GetFioApiKey(this IConfiguration configuration)
            => configuration.GetSection("PaymentServiceSecrets").Get<YourConfigObject>();


1 commentaires

pourquoi configuration["PaymentServiceSecrets:FioApiKey"]; fonctionnerait dans le projet de l'API Web de base asp.net et non dans le projet de travail? votre code PaymentServiceSecrets simplement fortement PaymentServiceSecrets , sinon c'est le même



0
votes

en mettant la ligne ci-dessous dans Program.cs j'ai pu récupérer la valeur du secret utilisateur

hostContext.Configuration.GetSection("PaymentServiceSecrets:FioApiKey").Value


0 commentaires

0
votes

Un "piège" ici qui n'est pas mentionné est l'exigence que, dans WorkerServices, la variable d'environnement "DOTNET_ENVIRONMENT" doit être définie sur "Développement", sinon les Secrets d'utilisateurs n'essaieront même pas de se charger. Cela contraste avec la variable d'environnement "ASPNETCORE_ENVIRONMENT" utilisée dans les projets ASP.Net.

Ie, dans Properties / launchSettings.json

{
  // .. Ommitted
  "profiles": {
    "MyWorkerService": {
      "commandName": "Project",
      "environmentVariables": {
        "DOTNET_ENVIRONMENT": "Development"
      }
    }
  }
}

Habituellement, les nouveaux modèles de projet ont cela en place pour vous, mais dans mon cas, lors de la conversion de projets ASP.Net (qui n'avaient pas besoin de capacités de serveur Web) en services de travail, le profil launchSettings.json définit le "ASPNETCORE_ENVIRONMENT" sur " Développement "qui est effectivement inutile dans WorkerServices.


0 commentaires