Как получить IOptions в методе ConfigureServices или передать IOptions в метод расширения? - PullRequest
0 голосов
/ 10 сентября 2018

Я занимаюсь разработкой приложения asp .net core web api 2.1.

Я добавляю службу аутентификации JWT в качестве метода расширения в статический класс:

 public static class AuthenticationMiddleware
    {
        public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, string issuer, string key)
        {
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        // validate the server that created that token
                        ValidateIssuer = true,
                        // ensure that the recipient of the token is authorized to receive it
                        ValidateAudience = true,
                        // check that the token is not expired and that the signing key of the issuer is valid
                        ValidateLifetime = true,
                        // verify that the key used to sign the incoming token is part of a list of trusted keys
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = issuer,
                        ValidAudience = issuer,
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
                    };
                });

            return services;
        }
    }

, который я использую в методе ConfigureServices класса Startup следующим образом:

public void ConfigureServices(IServiceCollection services)
        {
            // adding some services here

            services.AddJwtAuthentication(Configuration["Jwt:Issuer"], Configuration["Jwt:Key"]);

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);           
        }

Теперь у меня есть требование использовать шаблон IOptions для получения данных аутентификации JWT из appsettings.json

Как я могу получить IOptions в методе ConfigureServices для передачи эмитента и ключа в метод расширения? Или как передать IOptions в метод расширения?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Для привязки данных от appsettings.json до Model вы можете выполнить следующие шаги:

  1. Appsettings.json content

    {
    "Logging": {
     "IncludeScopes": false,
     "LogLevel": {
        "Default": "Warning"
           }
     },      
     "JWT": {
          "Issuer": "I",
          "Key": "K"
        }
     }
    
  2. Параметры JWT

    public class JwtOptions
    {
        public string Issuer { get; set; }
        public string Key { get; set; }
     }
    
  3. Startup.cs

        public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<JwtOptions>(Configuration.GetSection("JWT"));
        var serviceProvider = services.BuildServiceProvider();
        var opt = serviceProvider.GetRequiredService<IOptions<JwtOptions>>().Value;
        services.AddJwtAuthentication(opt.Issuer, opt.Key);
        services.AddMvc();
    }
    
  4. Еще один вариант для прямой передачи JwtOptions.

        public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<JwtOptions>(Configuration.GetSection("JWT"));
        var serviceProvider = services.BuildServiceProvider();
        var opt = serviceProvider.GetRequiredService<IOptions<JwtOptions>>().Value;
        services.AddJwtAuthentication(opt);
    
        services.AddMvc();
    }
    
  5. Изменить метод расширения.

        public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, JwtOptions opt)
    
0 голосов
/ 11 сентября 2018

Еще один вариант - привязать конфигурации к классу с расширением Bind(). (IMO, это более чистое решение, чем IOptions)

public class JwtKeys
{
    public string Issuer { get; set; }
    public string Key { get; set; }
}

public void ConfigureServices(IServiceCollection services)
{
    var jwtKeys = new JwtKeys();
    Configuration.GetSection("JWT").Bind(JwtKeys);

    services.AddJwtAuthentication(jwtKeys);
}

public static IServiceCollection AddJwtAuthentication(this IServiceCollection services, JwtKeys jwtKeys)
{....}

Тогда, если вам нужны настройки JwtKeys в другом месте решения, просто зарегистрируйте класс в коллекции и добавьте его, где необходимо.

services.AddSingleton(jwtKeys);
0 голосов
/ 10 сентября 2018

Вы можете добавить свои опции в DI-контейнер в классе запуска следующим образом:

public class JwtOptions
{
    public string Issuer { get; set; }
    public string Key { get; set; }

}

public void ConfigureService(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<JwtOptions>(Configuration.GetSection("Jwt"));
}

Теперь вы можете использовать эти опции на этапе настройки или в методе расширения:

public void Configure(IApplicationBuilder app)
{
    var options = app.ApplicationServices.GetService<IOptions<JwtOptions>();
    // write your own code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...