У меня есть приложение Asp.net Core 2.2 MVC, которое аутентифицируется с использованием сервера IdentityServer4.Он настроен, как вы можете видеть внизу, с очень короткими временами для быстрого тестирования.
Требуемое поведение:
- Вход в систему (предположим, без проверки «помни меня»)
- Делать вещи ...
- Дождаться окончания сеанса
- При следующей навигации нажмите перенаправить на страницу входа для нового интерактивного входа
Я предполагал, что должен работать на куки и на стороне сервера сеанса, но мое первое сомнение в том, что мне нужно больше работать с id_token.
В любом случае текущее поведение:
- Войти без «Запомнить меня проверено»
- Дождаться окончания сессии
- Нажать на фиктивную страницу и я вижу, что сессия пуста (как и ожидалось) -> Логин доступен наверхнее меню
- Поэтому я нажимаю на кнопку «Войти» -> Страница входа не отображается -> доступна новая сторона сервера сеансов, а в браузере есть новое значение «.AspNetCore.Cookies»."но то же самое для" .AspNetCore.Identity.Application "и "idsrv.session".
Если я выхожу из системы, клиентская сторона cookie корректно удаляется, поэтому при следующем входе в систему отображается ожидаемая форма учетных данных.
Что я делаюнеправильно?Правильно ли пытаться получить новый интерактивный вход, проверяющий срок действия файлов cookie?Нужно ли другим способом работать с объектами id (id_token)?
CODE
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.None;
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromSeconds(30);
})
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = Configuration.GetValue<string>("IdentitySettings:Authority");
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.SaveTokens = true;
options.Events.OnTicketReceived = async (context) =>
{
context.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(30);
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.IsStaging())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseAuthentication();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
EDIT
Выход выполняется следующим образом
public async void OnPost()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc",
new AuthenticationProperties
{
RedirectUri = "http://localhost:5002"
});
}