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 调用检测此情况,然后在登录后在应用程序中显示拒绝访问页面。
我们有一个域,其中配置了多个用户和多个 OIDC 客户端。我们想将另一个应用程序(OIDC 客户端)连接到领域。遗憾的是,客户端无法检查是否存在任何属性或角色。
如何配置 Keycloak 以使用特定的 OIDC 客户端进行身份验证,但如果用户没有特定角色,return 身份验证失败?
为此,您应该实现 Keycloak 的 AuthenticatorFactory 和 Authenticator 接口。查看 here 了解更多信息。 在 authenticate() 方法中,您将编写类似于以下内容的内容:
If(client == yourClient){
// Check for roles
}
否则,失败时的预期行为。
通常这种类型的选项不起作用,因为授权重定向发生在您知道用户是谁之前,因此在您知道涉及哪些角色之前。
我会做什么
使授权重定向仅执行以下工作:
- 登录用户并返回用户 ID(子声明),可能还有几个范围
然后在您的应用程序中管理角色 - 第二个应用程序应调用执行此操作的 Web API:
- 从访问令牌以及其他来源获取声明,然后使用它们进行身份验证和授权
如果用户通过身份验证但无权使用特定应用程序,请通过 API 调用检测此情况,然后在登录后在应用程序中显示拒绝访问页面。