首页 > 解决方案 > 带有“用户机密”的 ASP.NET Core 应用程序仅在 macOS 命令行上失败

问题描述

我将dotnet-user-secrets与 ASP.NET Core 2.1.4 应用程序一起使用。

需要明确的是,这个问题是关于从macOSdotnet run中的命令行调用;在 Windows 中调用相同的应用程序时不存在此问题。此外,从 Visual Studio 中运行应用程序在 macOS 和 Windows 上都可以正常工作。dotnet run

dotnet user-secrets list在命令行键入会返回预期的输出:

TokenProviderOptions:SecretKey = …
TokenProviderOptions:Issuer = …
TokenProviderOptions:Audience = …

我也可以按预期访问secrets.json文件夹中的文件:~/.microsoft/usersecrets/<userSecretsId>

{
  "TokenProviderOptions": {
    "SecretKey": "…",
    "Issuer": "…",
    "Audience": "…"
  }
}

这是我访问内部秘密的方式Startup.cs

// Configure tokens
var tokenOptions = Configuration
    .GetSection("TokenProviderOptions")
    .GetChildren()
    .ToList();
string
    secretKey = tokenOptions.Single(x => x.Key.Equals("SecretKey")).Value,
    issuer = tokenOptions.Single(x => x.Key.Equals("Issuer")).Value,
    audience = tokenOptions.Single(x => x.Key.Equals("Audience")).Value;

正如我之前提到的,这在 Windows 中的命令提示符和 Visual Studio 中运行没有问题。而且,从 macOS 中的 Visual Studio,我可以调试并查看tokenOptions包含三个项目的列表。但是,当我输入dotnet run终端时,我首先收到此错误.Single()

System.InvalidOperationException: Sequence contains no matching element

我是否缺少从 macOS 的命令行成功运行它的额外步骤?

标签: asp.net-core-2.0

解决方案


秘密管理器旨在仅用于开发。因此,它仅在您ASPNETCORE_ENVIRONMENT设置为Development. 这可以在您的环境变量中完成。

如果您不想修改环境变量,可以在 program.cs 文件中使用以下内容:

public static IWebHost BuildWebHost(string[] args)
{

    var config = new ConfigurationBuilder().AddUserSecrets("myid").Build();

    return WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(config)
            .UseStartup<Startup>()

推荐阅读