Keycloak:如何按角色为特定 OIDC 客户端过滤用户?

Keycloak: How can user be filtered for a specific OIDC client by role?

我们有一个域,其中配置了多个用户和多个 OIDC 客户端。我们想将另一个应用程序(OIDC 客户端)连接到领域。遗憾的是,客户端无法检查是否存在任何属性或角色。

如何配置 Keycloak 以使用特定的 OIDC 客户端进行身份验证,但如果用户没有特定角色,return 身份验证失败?

为此,您应该实现 Keycloak 的 AuthenticatorFactory 和 Authenticator 接口。查看 here 了解更多信息。 在 authenticate() 方法中,您将编写类似于以下内容的内容:

If(client == yourClient){
// Check for roles
}

否则,失败时的预期行为。

通常这种类型的选项不起作用,因为授权重定向发生在您知道用户是谁之前,因此在您知道涉及哪些角色之前。

我会做什么

使授权重定向仅执行以下工作:

  • 登录用户并返回用户 ID(子声明),可能还有几个范围

然后在您的应用程序中管理角色 - 第二个应用程序应调用执行此操作的 Web API:

  • 从访问令牌以及其他来源获取声明,然后使用它们进行身份验证和授权

如果用户通过身份验证但无权使用特定应用程序,请通过 API 调用检测此情况,然后在登录后在应用程序中显示拒绝访问页面。