Это не настоящий ответ на первоначальный вопрос. Однако я очень доволен этим решением.
После нескольких часов копания в исходном коде AspNetCore я обнаружил, что JwtBearerOptions добавляются в DI в качестве именованных опций . Это означает, что вы не можете предоставить конфигурацию из файла конфигурации без написания кода. Однако я нашел приемлемое решение, которое будет работать в большинстве случаев.
У меня нет списка всех доступных ключей, и в приведенном здесь примере показаны только два из них. Вы можете проверить открытые свойства JwtBearerOptions и добавить их в appsettings.json. Они будут выбраны и использованы каркасом.
См. Код ниже и комментарии там, чтобы узнать, как это работает:
appsettings.json
{
"Cronus": {
"Api": {
"JwtAuthentication": {
"Authority": "https://example.com",
"Audience": "https://example.com/resources"
}
}
}
}
Startup.cs
public class Startup
{
const string JwtSectionName = "Cronus:Api:JwtAuthentication";
private readonly IConfiguration configuration;
public Startup(IConfiguration configuration)
{
this.configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Gets the settings from a configuration section. Notice how we specify the name for the JwtBearerOptions to be JwtBearerDefaults.AuthenticationScheme.
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, configuration.GetSection(JwtSectionName));
// OR
// Gets the settings from a configuration. Notice how we specify the name for the JwtBearerOptions to be JwtBearerDefaults.AuthenticationScheme.
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, configuration);
services.AddAuthentication(o =>
{
// AspNetCore uses the DefaultAuthenticateScheme as a name for the JwtBearerOptions. You can skip these settings because .AddJwtBearer() is doing exactly this.
o.DefaultAuthenticateScheme = Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer();
}
}