В настоящее время я использую 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);
}
}