JwtBearerOptions 配置方法未执行

san*_*tro 2 c# visual-studio-2019 asp.net-core-3.1

我有 asp.net core 3.1 web api 项目,代码如下:

启动.cs

public virtual void ConfigureServices(IServiceCollection services) =>
    services
    .AddFrameworkServices()
    .AddApplicationInsights(this.configuration)
    .AddResponseCompression()
    .AddCustomConfigureOptions();
Run Code Online (Sandbox Code Playgroud)

CustomServiceCollectionExtensions.cs

public static IServiceCollection AddCustomConfigureOptions(this IServiceCollection services) =>
  services
    .ConfigureOptions<ConfigureAuthenticationOptions>();
    .ConfigureOptions<ConfigureJwtBearerOptions>();
Run Code Online (Sandbox Code Playgroud)

配置身份验证选项.cs

public class ConfigureAuthenticationOptions : IConfigureOptions<AuthenticationOptions>
{
   public void Configure(AuthenticationOptions options) =>
      options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}
Run Code Online (Sandbox Code Playgroud)

配置JwtBearerOptions

public class ConfigureJwtBearerOptions : IConfigureOptions<JwtBearerOptions>
{
    private readonly IConfiguration configuration;
    public ConfigureJwtBearerOptions(IConfiguration configuration) => this.configuration = configuration;
    public void Configure(JwtBearerOptions options)
    {
        options.Authority = configuration[C.AppKeys.AADInstance] + configuration[C.AppKeys.AADTenantID];
        options.Audience = configuration[C.AppKeys.AADAudience];
    }
}
Run Code Online (Sandbox Code Playgroud)

在调试时我发现ConfigureJwtBearerOptions.cs文件的Configure方法没有被触发

任何人都可以帮助我指导解决这个问题

Jea*_*eau 5

我正在使用 .Net Core 6 并遇到同样的错误。这里的巧妙之处在于 .AddJwtBearer() 使用命名选项委托。

不实现 IConfigureOptions,而是实现 IConfigureNamedOptions

配置JwtBearerOptions.cs

public class ConfigureJwtBearerOptions : IConfigureNamedOptions<JwtBearerOptions>
{
    private readonly JwtOptions config;
    private readonly ILogger<ConfigureJwtBearerOptions> logger;
   
    /// <summary>
    /// Configure JWT auth
    /// </summary>
    /// <param name="jwtOptions"></param>
    /// <param name="logger"></param>
    public ConfigureJwtBearerOptions(JwtOptions jwtOptions, ILogger<ConfigureJwtBearerOptions> logger)
    {
        config = jwtOptions;
        this.logger = logger;
    }

    /// <inheritdoc/>
    public void Configure(JwtBearerOptions options)
    {
        Configure(JwtBearerDefaults.AuthenticationScheme, options);
    }

    public void Configure(string name, JwtBearerOptions options)
    {
        options.Authority = config.Authority;
        options.Audience = config.Audience;

        logger.LogInformation("OAuth authority: {0}", config.Authority);
        logger.LogInformation("OAuth audience: {0}", config.Audience);
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,您仍然需要在 Startup.cs 中调用 AddAuthentication()

启动.cs

//...
services.AddAuthentication().AddJwtBearer();
Run Code Online (Sandbox Code Playgroud)