Каков наилучший способ поделиться объектом конфигурации, используемым в ASP. NET Core 3.1 Запуск и контроллеры - PullRequest
1 голос
/ 01 апреля 2020

Каков наилучший способ совместного использования объекта конфигурации между классом запуска ASP. NET Core 3.1 и контроллерами?

Я видел несколько примеров использования DI, и это кажется хорошей идеей , но мне нужно использовать зависимость внутри public void ConfigureServices(IServiceCollection services).

Кроме того, объект зависит от Microsoft.Extensions.Configuration.IConfiguration экземпляра.

Объект будет использоваться в Startup.cs, в пределах сам по себе ConfigureServices, а также в Controllers.

Будет ли работать DI? Или это решение Singleton с параметрами?

Вот конкретный c код, который необходимо передать:

// openssl rand -hex 16 => 256 bits when read
var jwt_key = Configuration.GetSection("JwtOption:IssuerSigningKey").Value;
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwt_key));

var tokenValidationParameters = new TokenValidationParameters
{
    // The signing key must match!
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = signingKey,

    // Validate the JWT Issuer (iss) claim
    ValidateIssuer = true,
    ValidIssuer = "some host name",

    // Validate the JWT Audience (aud) claim
    ValidateAudience = true,
    ValidAudience = "web_intranet",

    // Validate the token expiry
    ValidateLifetime = true,

    // If you want to allow a certain amount of clock drift, set that here:
    ClockSkew = TimeSpan.Zero
};

Этот объект используется следующим образом в методе public void ConfigureServices(IServiceCollection services)

services
    .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {                
        options.TicketDataFormat = new CustomJwtDataFormat(
            SecurityAlgorithms.HmacSha256,
            tokenValidationParameters);
    });

Ответы [ 2 ]

4 голосов
/ 01 апреля 2020

Старайтесь не передавать IConfiguration вокруг. Общий код может быть выполнен при запуске, а модель заполнена и добавлена ​​в контейнер

. Вы можете зарегистрировать экземпляр непосредственно в контейнере в Startup.ConfigureServices

void ConfigureServices(IServiceCollection services) {
    var jwt_key = Configuration.GetSection("JwtOption:IssuerSigningKey").Value;
    var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwt_key));

    var tokenValidationParameters = new TokenValidationParameters {
        //...code omitted for brevity
    }

    services.AddSingleton(tokenValidationParameters);

    //...can still use tokenValidationParameters

    services
        .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {                
            options.TicketDataFormat = new CustomJwtDataFormat(
                SecurityAlgorithms.HmacSha256,
                tokenValidationParameters);
        });
}

и вставить его явно, где необходимо

//ctr
public MyController(TokenValidationParameters tokenParameters) {

    //...

}

Или вы можете использовать шаблон параметров

Ссылка Шаблон параметров в ASP. NET Ядро

void ConfigureServices(IServiceCollection services) {
    //...code omitted for brevity
    var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwt_key));

    services.Configure<TokenValidationParameters>(options => {    
        // The signing key must match!
        options.ValidateIssuerSigningKey = true;
        options.IssuerSigningKey = signingKey;

        // Validate the JWT Issuer (iss) claim
        options.ValidateIssuer = true;
        options.ValidIssuer = "some host name";

        // Validate the JWT Audience (aud) claim
        options.ValidateAudience = true;
        options.ValidAudience = "web_intranet";

        // Validate the token expiry
        options.ValidateLifetime = true;

        // If you want to allow a certain amount of clock drift, set that here:
        options.ClockSkew = TimeSpan.Zero;
    });

    //...

    //Use DI services to configure cookie options
    var scheme = CookieAuthenticationDefaults.AuthenticationScheme;
    services.AddOptions<CookieAuthenticationOptions>(scheme)
        .Configure<IOptions<TokenValidationParameters>>((options, token) => {
            options.TicketDataFormat = new CustomJwtDataFormat(
                SecurityAlgorithms.HmacSha256,
                token.Value); //<--
        });

    services
        .AddAuthentication(scheme)
        .AddCookie();
}

Ссылка Используйте службы DI для настройки параметров

и Inject IOptions<TokenValidationParameters>, где это необходимо

//ctr
public MyController(IOptions<TokenValidationParameters> options) {

    TokenValidationParameters tokenParameters = options.Value;

    //...

}
0 голосов
/ 01 апреля 2020

Вот вариант, который я протестировал с помощью DI.

Создание объекта POCO:

public sealed class JwtConfig
{
    public TokenValidationParameters tokenValidationParameters;
    public JwtConfig(IConfiguration configuration)
    {
        // configure the object: tokenValidationParameters
    }
}

При запуске:

public void ConfigureServices(IServiceCollection services)
{
        // register
        services.AddSingleton<JwtConfig>();

        // retrieve 
        var serviceProvider = services.BuildServiceProvider();
        var jwtConfig = serviceProvider.GetService<JwtConfig>();

        // use the jwtConfig <IMPORTANT to be able to do this here>
}

В конструкторе контроллера: введите объект:

    public LoginController(IUserService userService, JwtConfig jwtConfig)
    {
        this.jwtConfig = jwtConfig;
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...