Это раздражало меня в последние несколько дней.Я подозреваю, что это как-то связано с недавним устареванием прежнего механизма в конфигурации компоновщика приложений:
app.UseAuthentication().UseCookieAuthentication(); <-- no longer valid and apparently will not even compile now.
Это было заменено следующим в разделе ConfigureServices:
services.AddAuthentication("YourCookieName")
.AddCookie("YourCookieName", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(30.0);
});
ХотяЯ не уверен, каково точное критическое изменение для identityserver4, после клонирования компонентов identityserver4 и отладки я смог изолировать конструктор для DefaultUserSession, принимающий IHttpContextAccessor, который получал значение null:
Рассматриваемый конструктор:
public DefaultUserSession(
IHttpContextAccessor httpContextAccessor,
IAuthenticationSchemeProvider schemes,
IAuthenticationHandlerProvider handlers,
IdentityServerOptions options,
ISystemClock clock,
ILogger<IUserSession> logger)
{ ...
Следующее решение устраняет эту ошибку, хотя мы надеемся, что identityserver4 сделает этот вопрос в ближайшем будущем.
Вам необходимо добавить службу IHttpContextAccessor в ConfigureServices:
public override void ConfigureServices(IServiceCollection services)
{
... other code omitted ...
services.AddScoped<IHttpContextAccessor>(provider => new
LocalHttpContextAccessor(provider));
... other code omitted ...
}
LocalHttpContextAccessor - это просто закрытый класс в классе конфигурации, как показано здесь:
private class LocalHttpContextAccessor : IHttpContextAccessor
{
public IServiceProvider serviceProvider { get; private set; }
public HttpContext httpContext { get; set; }
public LocalHttpContextAccessor(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
this.httpContext = null;
}
public HttpContext HttpContext
{
get
{
return this.httpContext;
}
set
{
this.httpContext = null;
}
}
}
Проблема в том, что на этапе настройки служб не существует текущего контекста для установки, поэтому яустановить его в блоке использованияна этапе настройки компоновщика приложений:
public override void Configure(IApplicationBuilder app,
IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
IHttpContextAccessor httpContextAccessor;
httpContextAccessor = context.RequestServices.GetRequiredService<IHttpContextAccessor>();
if (httpContextAccessor is LocalHttpContextAccessor)
{
((LocalHttpContextAccessor)httpContextAccessor).httpContext = context;
}
await next();
});
... other code omitted ...
app.UseIdentityServer();
Это установит контекст http до запуска кода сервера идентификации, который устраняет ошибку.Области обслуживания должны создаваться индивидуально для каждого запроса.Я только недавно полностью изучил ядро .net из среды .net, поэтому, если в этом коде есть проблемы с областью действия или DI, которые могут привести к утечкам или плохому жизненному циклу, я был бы признателен за вводную информацию.Тем не менее, по крайней мере, этот код предотвращает сбой сервера идентификации 4 с ядром 2.2 +.