Используйте собственный SessionStore в AddCookie (), который использует DI - PullRequest
0 голосов
/ 28 декабря 2018

В настоящее время я использую Identity в сочетании с пользовательским SessionStore, который я пытаюсь настроить с помощью IMemoryCache, который был ранее зарегистрирован через контейнер DI.

AddCookie() дает мне доступ кCookieAuthenticationOptions, который позволил бы мне зарегистрировать упомянутый SessionStore.

 .AddCookie(IdentityConstants.ApplicationScheme, options =>
            {
               // Cookie settings
               options.Cookie.Name = AdminUi.Security.Authorization.COOKIE_NAME;
               options.Cookie.HttpOnly = true;
               options.Cookie.SameSite = SameSiteMode.Strict;
               options.Cookie.SecurePolicy = CookieSecurePolicy.Always;

               options.ExpireTimeSpan = TimeSpan.FromMinutes(AdminUi.Security.COOKIE_EXPIRE_TIME_SPAN_IN_MINUTES);
               options.LoginPath = new PathString(AdminUi.Security.LOGIN_PATH);
               options.AccessDeniedPath = new PathString(AdminUi.Security.ACCESS_DENIED_PATH);
               options.SlidingExpiration = true;
            });

Я пытался использовать следующий подход , который должен позволить мне получить доступ к зарегистрированным службам через IServiceScopeFactory factory.

Для этого я создал класс, который будет отвечать за регистрацию SessionStore.

public class ConfigureCookieAuthenticationOptions : IConfigureOptions<CookieAuthenticationOptions>
    {
        private readonly IServiceScopeFactory _serviceScopeFactory;
        public ConfigureCookieAuthenticationOptions(IServiceScopeFactory serviceScopeFactory)
        {
            _serviceScopeFactory = serviceScopeFactory;
        }

        public void Configure(CookieAuthenticationOptions options)
        {
            using (var scope = _serviceScopeFactory.CreateScope())
            {
                var provider = scope.ServiceProvider;
                var memoryCache = provider.GetRequiredService<IMemoryCache>();
                options.SessionStore = new InMemoryCacheTicketStore(memoryCache);               
            }
        }
    }

Впоследствии я соответственно зарегистрировал экземпляр IConfigureOptions<T>.

services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, ConfigureCookieAuthenticationOptions>();

К сожалению, метод Configure для ConfigureCookieAuthenticationOptions никогда не вызывается.

Чего мне не хватает?

Обновление 1

Iзаменил интерфейс IConfigureOptions<T> на IPostConfigureOptions<T> и все работает.Любая идея, почему это работает только с крюком IPostConfigureOptions?

public class ConfigureCookieAuthenticationOptions : IPostConfigureOptions<CookieAuthenticationOptions>
{
    private readonly IMemoryCache _memoryCache;

    public ConfigureCookieAuthenticationOptions(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }

    public void PostConfigure(string name, CookieAuthenticationOptions options)
    {           
        options.SessionStore = new InMemoryCacheTicketStore(_memoryCache);          
    }
}
...