Доступ к IMemoryCache в расширении IServiceCollection - PullRequest
0 голосов
/ 11 июля 2019

Я зарегистрировал IMemoryCache, вызвав services.AddMemoryCache() в моем Startup.cs

. Я хочу использовать это в методе расширения IServiceCollection, где я добавляю аутентификацию JWT.,Ключ подписи для токена хранится в Azure Keyvault, и я хотел бы кэшировать ключ при его получении

public static IServiceCollection AddJWTAuth(this IServiceCollection services)
{
    services.AddAuthentication(options=>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(jwt =>
    {
        jwt .TokenValidationParameters = new TokenValidationParameters
        {
            IssuerSigningKeyResolver = (token, securityToken, keyIdentifier, tokenValidationParameters) =>
            {
               // Get signing from KV and add it to memory cache
               // Use signing key from cache
            }
        };
    });

    return services;
}

Какой хороший способ сделать это?

1 Ответ

1 голос
/ 11 июля 2019

Когда вам нужно получить доступ к тому, что уже находится в вашем наборе услуг, вы можете использовать BuildServiceProvider(), который предоставит вам поставщика услуг с уже настроенными службами. Обратите внимание, что вы должны добавить кэш памяти перед вашим AddJWTAuth методом.

public static IServiceCollection AddJWTAuth(this IServiceCollection services)
{
    var cache = services.BuildServiceProvider().GetRequiredService<IMemoryCache>()
    services.AddAuthentication(options=>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(jwt =>
    {
        jwt .TokenValidationParameters = new TokenValidationParameters
        {
            IssuerSigningKeyResolver = (token, securityToken, keyIdentifier, tokenValidationParameters) =>
            {
               cache..GetOrCreate(...);
            }
        };
    });

    return services;
}
...