You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core集成Keycloak认证:访问令牌过期后仍可访问问题咨询

问题描述

我正尝试在Web API中搭建以Keycloak为身份提供者的简单认证流程,大部分功能正常:客户端访问受保护路由时会弹出Keycloak登录窗口,登录后ASP.NET和Keycloak的Cookie都会被存储。我在Realm设置中将访问令牌有效期设为30秒,但测试发现,即使访问令牌已过期(超过30秒),甚至删除Keycloak Cookie仅保留ASP.NET的Cookie,仍能访问受保护路由。我尝试调整ClockSkew、在Realm会话面板登出用户,但问题依旧。以下是认证部分代码:

builder.Services.AddAuthorization();
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.RequireHttpsMetadata = false;
    options.Authority = "http://localhost:8080/realms/testrealm";
    options.ClientId = "testclient";
    options.ClientSecret = "kUOYGYajzgic9Feuw5rE5WRQLtgXuNTm";
    options.ResponseType = "code";
    options.SaveTokens = true;
    options.Scope.Add("openid");
    options.TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = "preferred_username",
        RoleClaimType = "roles",
        ValidateLifetime = true,
        ClockSkew = TimeSpan.Zero
    };
});
原因分析
  • Cookie认证方案独立于Keycloak令牌校验:你设置的默认认证方案是Cookie认证,ASP.NET的会话Cookie一旦生成,默认只会校验自身的合法性(签名、过期时间),不会主动关联Keycloak的访问令牌状态。哪怕Keycloak的访问令牌过期或失效,只要ASP.NET的Cookie还在有效期内,就能正常访问受保护路由。
  • 未配置Cookie与Keycloak会话的同步机制:你没有为Cookie认证添加令牌刷新、会话状态校验的逻辑,也没启用对Keycloak令牌撤销状态的检查。默认情况下,ASP.NET不会主动和Keycloak同步会话状态,所以在Keycloak后台登出用户、删除Keycloak Cookie,都不会影响ASP.NET本地Cookie的有效性。
  • TokenValidationParameters仅作用于OpenIdConnect流程:你配置的TokenValidationParameters只在首次登录或触发认证挑战时生效,也就是OpenIdConnect流程校验令牌生命周期的时候。但后续请求走的是Cookie认证,这部分参数不会被触发,所以访问令牌过期后,Cookie认证环节不会进行校验。

内容的提问来源于stack exchange,提问作者mkopacz94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:27:41