Asp.net Core 2 с IdentityServer4 - перенаправление на логин после истечения срока действия cookie - PullRequest
0 голосов
/ 26 мая 2019

У меня есть приложение 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"
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...