【发布时间】:2017-05-24 15:31:36
【问题描述】:
我正在尝试访问 .Net Core Windows 服务中的用户机密。服务本身在服务帐户下运行,我为服务用户添加了用户密码。
将应用程序作为简单的控制台应用程序运行时,可以访问用户密码。但是,将应用程序作为 Windows 服务运行时,无法读取该设置。没有错误 - 只是没有获得值。该服务在与登录用户相同的用户帐户下运行 - 并且可以在运行控制台应用程序时获取密钥。
当我将 secrets.json 文件添加到托管可执行文件的位置并使用 AddJsonFile 方法读取它时,可以读取该值。这是一个代码sn-p:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
builder.AddEnvironmentVariables();
// does not work as a service
builder.AddUserSecrets("TestUserSecrets");
// works as a service when secrets.json is copied to exe directory
// builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "Secrets.json"));
Configuration = builder.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
}
public IConfigurationRoot Configuration { get; set; }
public void Configure(IApplicationBuilder app, ILoggerFactory logFactory)
{
// attempt to obtain secret config value
string secret = Configuration["Secret"];
Windows 服务访问用户密码(在 secret.json 文件中)是否存在问题?
是否打算将用户机密用于开发,因此在 Windows 服务中使用用户机密是行不通的?
【问题讨论】:
-
服务的运行时环境与控制台应用程序的运行环境完全不同。从 Directory.GetCurrentDirectory() 开始,通常是一个非常丑陋的全局变量,它只设置在您希望它偶然出现的位置,它不是您的应用所在的位置。 env.EnvironmentName 非常值得怀疑,服务不是 ASP.NET 应用程序。
-
内置的 usersecrets 配置提供程序目前无法在 IIS Express 之外的多个环境(包括常规 IIS,可能还有 Windows 服务)中从适当的基本目录构建。
%AppData%在这些情况下最终位于 windows 目录中,因此结果找不到 secrets.json。然后它默认在根程序目录中查找 secrets.json,当它找不到时不加载任何内容。我不想编写自定义提供程序,只是将环境变量用于开发机密。
标签: c# .net-core appsettings