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
相关产品推荐
相关产品推荐

