首页 > 解决方案 > 带有 IdentityServer4 的 Asp.net Core 2 - cookie 过期后重定向到登录

问题描述

我有一个使用 IdentityServer4 服务器进行身份验证的 Asp.net Core 2.2 MVC 应用程序。它的配置如您在底部看到的那样,用于快速测试的时间非常短。

期望的行为是:

我想我必须在 cookie 和会话服务器端工作,但我的第一个疑问是我必须更多地使用 id_token。

无论如何,当前的行为是:

如果我注销,cookie 客户端将被正确删除,因此在下一次登录时会显示预期的凭据表单。

我做错了什么?尝试获取新的交互式登录检查 cookie 过期是否正确?我是否必须按照另一种方式处理 ids (id_token) 对象?

代码

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?}");
    });
}

编辑

注销完成如下

public async void OnPost()
{
    await HttpContext.SignOutAsync("Cookies");

    await HttpContext.SignOutAsync("oidc",
        new AuthenticationProperties
        {
            RedirectUri = "http://localhost:5002"
        });
}

标签: asp.net-corecookiesidentityserver4

解决方案


推荐阅读