我有一个使用 Redis 分布式缓存和 cookie 身份验证的 .NET Core 3 项目(最近从 2.2 升级)。
它目前看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
// Set up Redis distributed cache
services.AddStackExchangeRedisCache(...);
...
services.ConfigureApplicationCookie(options =>
{
...
// Get a service provider to get the distributed cache set up above
var cache = services.BuildServiceProvider().GetService<IDistributedCache>();
options.SessionStore = new MyCustomStore(cache, ...);
}):
}
问题是BuildServiceProvider()
导致构建错误:
Startup.cs(...):警告 ASP0000:从应用程序代码中调用“BuildServiceProvider”会导致创建单例服务的额外副本。考虑替代方案,例如依赖注入服务作为“配置”的参数。
这似乎不是一个选项 -ConfigureApplicationCookie
存在Startup.ConfigureServices
并且只能配置新服务,Startup.Configure
可以使用新服务,但不能覆盖CookieAuthenticationOptions.SessionStore
成为我的自定义商店。
我之前尝试过添加services.AddSingleton<ITicketStore>(p => new MyCustomRedisStore(cache, ...))
,ConfigureApplicationCookie
但这被忽略了。
显式设置CookieAuthenticationOptions.SessionStore
似乎是让它使用本地内存存储以外的任何东西的唯一方法。
我在网上找到的每个BuildServiceProvider()
示例都使用;
理想情况下,我想做类似的事情:
services.ConfigureApplicationCookieStore(provider =>
{
var cache = provider.GetService<IDistributedCache>();
return new MyCustomStore(cache, ...);
});
或者
public void Configure(IApplicationBuilder app, ... IDistributedCache cache)
{
app.UseApplicationCookieStore(new MyCustomStore(cache, ...));
}
然后CookieAuthenticationOptions.SessionStore
应该只使用我在那里配置的任何东西。
如何使应用程序 cookie 使用注入的存储?