具有IdentityServer4的Asp.net Core 2-Cookie过期后重定向到登录

时间:2019-05-26 09:26:56

标签: asp.net-core cookies identityserver4

我有一个使用IdentityServer4服务器进行身份验证的Asp.net Core 2.2 MVC应用程序。 如您在底部所见,它的配置非常短,可以快速进行测试。

所需的行为是:

  • 登录(假设未选中“记住我”)
  • 做事...
  • 等待会话终止
  • 在下一个导航中,单击登录页面上的重定向以进行新的交互式登录

我以为我必须在cookie和会话服务器端工作,但是我的第一个疑问是我必须在id_token上做更多的工作。

无论如何,当前行为是:

  • 登录时未“记住我已选中”
  • 等待会话终止
  • 单击一个虚拟页面,我看到该会话为空(按预期)->在顶部菜单上可以使用该登录名
  • 因此,我单击登录-> 未显示登录页面->一个新的会话服务器端可用,并且在浏览器中有一个新值“ .AspNetCore.Cookies”,但对于“ .AspNetCore.Identity.Application”和“ idsrv.session”。

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

我做错了什么? 尝试获取新的交互式登录以检查Cookie到期是否正确? 我必须遵循另一种处理id(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"
        });
}

0 个答案:

没有答案