我正在尝试使用 Keycloak 作为身份提供者在 Web api 中设置一个简单的身份验证过程。几乎一切都按预期进行。当客户端尝试访问受保护的路由时,将显示 keycloak 登录弹出窗口,用户登录并存储 asp.net 和 keycloak cookie。
在领域设置中,我将访问令牌的生命周期指定为 30 秒。
出于测试目的,当我删除了 Keycloak cookie 并仅保留由 Web api 创建的 cookie 时,我的受保护路由仍然可以访问。但问题是,即使访问令牌已经过期(30 秒过去),它仍然可以访问。你能向我解释一下为什么会这样吗?
这是代码的身份验证部分:
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
};
});
我尝试更改时钟偏差,从领域会话面板中注销用户,但受保护的路由仍然可以访问。
该问题可能是因为Keycloak和aspnet core冲突造成的。对于我的测试结果,身份验证状态可以由keycloak会话和aspnet cookie同时维护,因此如果您清除浏览器中的所有cookie,或者在清除keycloak中的会话后删除aspnet生成的cookie。您应该需要重新登录。