Keycloak功能和概念

Keycloak是web应用程序和RESTful web服务的单点登录解决方案。 Keycloak的目标 是使安全性变得简单,以便应用程序开发人员可以轻松保护他们已部署的应用程序和服务 在他们的组织里。 开发人员通常必须为自己编写的安全功能是开箱即用的 并且很容易根据您组织的个人要求进行调整。 Keycloak提供可定制的 用于登录、注册、管理和帐户管理的用户界面。 您也可以使用Keycloak作为 集成平台,将其连接到现有的LDAP和Active Directory服务器。 您还可以将身份验证委托给第三 Facebook和Google等政党身份提供商。

特征

Keycloak提供以下功能:

  • 浏览器应用程序的单点登录和单点注销。

  • OpenID连接支持。

  • OAuth 2.0支持。

  • SAML支持。

  • 身份代理-使用外部OpenID Connect或SAML身份提供者进行身份验证。

  • 社交登录-启用Google,GitHub,Facebook,Twitter和其他社交网络的登录。

  • 用户联合-同步来自LDAP和Active Directory服务器的用户。

  • Kerberos桥-自动验证登录到Kerberos服务器的用户。

  • 管理控制台,用于集中管理用户、角色映射、客户端和配置。

  • 帐户管理控制台,允许用户集中管理他们的帐户。

  • 主题支持-自定义所有面向用户的页面,以与您的应用程序和品牌集成。

  • 双因素身份验证-通过谷歌身份验证器或FreeOTP支持TOTP/HOTP。

  • 登录流程-可选的用户自我注册,恢复密码,验证电子邮件,需要更新密码等。

  • 会话管理-管理员和用户本身可以查看和管理用户会话。

  • 令牌映射器-将用户属性、角色等映射到令牌和语句中。

  • 非-每个领域、应用程序和用户的撤销策略之前。

  • CORS支持-客户端适配器内置了对CORS的支持。

  • 服务提供商接口 (SPI) -许多SPI,用于自定义服务器的各个方面。 身份验证流、用户联合提供者、 协议映射器等等。

  • JavaScript应用程序的客户端适配器,WildFly,JBoss EAP,Fuse,Tomcat,Jetty,Spring等。

  • 支持具有OpenID Connect依赖方库或SAML 2.0服务提供商库的任何平台/语言。

基本Keycloak操作

Keycloak是您在网络上管理的独立服务器。 应用程序被配置为指向和 由此服务器保护。 Keycloak使用开放协议标准,如OpenID连接 或者SAML 2.0为了安全 您的应用程序。 浏览器应用程序将用户的浏览器从应用程序重定向到Keycloak身份验证 他们输入凭据的服务器。 此重定向很重要,因为用户与应用程序完全隔离,并且 应用程序永远不会看到用户的凭据。 相反,应用程序被赋予一个加密的身份令牌或断言 签名。 这些令牌可以具有身份信息,例如用户名,地址,电子邮件和其他配置文件数据。 他们也可以 保存权限数据,以便应用程序可以做出授权决策。 这些令牌也可以用来确保安全 调用基于REST的服务。

核心概念和术语

在尝试使用Keycloak保护您的web应用程序和REST服务之前,请考虑这些核心概念和术语。

用户

用户是能够登录系统的实体。 它们可以具有与自己相关联的属性,例如电子邮件, 用户名、地址、电话号码和出生日期。 可以为他们分配组成员资格,并为他们分配特定的角色。

身份验证

识别和验证用户的过程。

授权

授予用户访问权限的过程。

凭据

凭据是Keycloak用来验证用户身份的数据片段。 一些例子是密码, 一次性-密码,数字证书,甚至指纹。

角色

角色标识用户的类型或类别。 管理员,用户,经理,以及员工都是可能存在的典型角色 在一个组织中。 应用程序通常将访问权限和权限分配给特定角色,而不是将单个用户分配为交易 用户的粒度可能太细,难以管理。

用户角色映射

用户角色映射定义了角色和用户之间的映射。 用户可以与零个或多个角色相关联。 这个 角色映射信息可以封装到令牌和断言中,以便应用程序可以决定对 他们管理的各种资源。

复合角色

复合角色是可以与其他角色关联的角色。 例如a超级用户复合角色可以与 销售管理员订单输入管理角色。 如果用户映射到超级用户角色他们还继承了销售管理员订单输入管理角色。

组管理用户组。 可以为一个组定义属性。 您也可以将角色映射到组。 成为组成员的用户 继承组定义的属性和角色映射。

领域

领域管理一组用户、凭据、角色和组。 用户属于并登录到一个领域。 领域是相互隔离的 并且只能管理和验证他们控制的用户。

客户

客户端是可以请求Keycloak对用户进行身份验证的实体。 大多数情况下,客户端是应用程序和服务 想要使用Keycloak来保护自己,并提供单点登录解决方案。 客户端也可以是只想请求的实体 身份信息或访问令牌,以便它们可以安全地调用网络上由Keycloak保护的其他服务。

客户端适配器

客户端适配器是您安装到应用程序环境中的插件,以便能够进行通信并通过Keycloak进行保护。 Keycloak 有许多不同平台的适配器,您可以下载。 还有第三方适配器,您可以为我们不涉及的环境获得。

同意

同意是指您作为管理员希望用户在客户端参与身份验证过程之前向该客户端授予权限。 用户提供凭据后,Keycloak将弹出一个屏幕,标识请求登录的客户端以及什么身份 要求用户提供信息。 用户可以决定是否授予请求。

客户端范围

注册客户端时,必须为该客户端定义协议映射器和角色范围映射。 储存通常是有用的 客户端作用域,通过共享一些通用设置,使创建新客户端变得更加容易。 这对于请求一些 索赔或角色将有条件地基于范围参数。 Keycloak为此提供了客户端范围的概念。

客户角色

客户可以定义特定于他们的角色。 这基本上是专用于客户端的角色命名空间。

身份令牌

提供有关用户的身份信息的令牌。 OpenID Connect规范的一部分。

访问令牌

可以作为HTTP请求的一部分提供的令牌,该令牌授予对正在调用的服务的访问权限。 这是 OpenID Connect和OAuth 2.0规范。

断言

有关用户的信息。 这通常与包含在SAML身份验证响应中的XML blob有关,该XML blob 提供了有关经过身份验证的用户的身份元数据。

服务账户

每个客户端都有一个内置的服务帐户,该帐户允许其获取访问令牌。

直接赠款

客户端通过REST调用代表用户获取访问令牌的方法。

协议映射器

对于每个客户端,您可以定制OIDC令牌或SAML断言中存储的声明和断言。 您可以通过创建和配置每个客户端来执行此操作 协议映射器。

会话

当用户登录时,将创建一个会话来管理登录会话。 会话包含用户登录时间和内容等信息 在该会议期间,应用程序已参与单点登录。 管理员和用户都可以查看会话信息。

用户联合提供商

Keycloak可以存储和管理用户。 通常,公司已经拥有存储用户和凭据的LDAP或Active Directory服务 信息。 您可以指向Keycloak验证来自这些外部存储的凭据,并提取身份信息。

身份提供者

身份提供者 (IDP) 是可以对用户进行身份验证的服务。 Keycloak是国内流离失所者。

身份提供商联合会

Keycloak可以配置为将身份验证委托给一个或多个idp。 社交登录通过 Facebook或Google + 是身份提供商联盟的一个例子。 您也可以挂钩Keycloak来委托 对任何其他OpenID Connect或SAML 2.0 IDP进行身份验证。

身份提供者映射器

在进行IDP联合时,您可以将传入的令牌和断言映射到用户和会话属性。 这有助于您从外部IDP传播身份信息 向您的客户端请求身份验证。

所需的操作

必需的操作是用户在身份验证过程中必须执行的操作。 在这些操作之前,用户将无法完成身份验证过程 是完整的。 例如,管理员可能会安排用户每月重置密码。 一个更新密码将为所有这些设置所需的操作 用户。

身份验证流程

身份验证流是用户在与系统的某些方面进行交互时必须执行的工作流。 登录流可以定义 需要什么凭证类型。 注册流程定义了用户必须输入的配置文件信息以及是否像reCAPTCHA这样的内容 必须用来过滤掉机器人。 凭据重置流程定义了用户在重置密码之前必须执行的操作。

事件

事件是管理员可以查看和挂接的审计流。

主题

Keycloak提供的每个屏幕都有一个主题作为后盾。 主题定义了HTML模板和样式表,您可以根据需要覆盖它们。

服务器初始化

执行中定义的所有安装和配置任务后服务器安装和配置指南, 您需要创建一个初始管理员帐户。 Keycloak没有任何已配置的管理员帐户。 此帐户将允许您创建一个管理员,该管理员可以登录到大师领域的管理控制台,以便 您可以开始创建领域,用户和注册应用程序,以通过Keycloak进行保护。

如果你的 服务器可从本地主机,您可以通过转到http:// localhost:8080/authURL。

欢迎页面

初始欢迎页面

只需为该初始管理员指定您想要的用户名和密码。

如果您无法通过本地主机地址,或者只想从命令行设置Keycloak 你可以用… /bin/add-user-keycloak脚本。

添加-用户-密钥斗篷脚本

添加用户脚本

参数略有不同,具体取决于您使用的是独立操作模式还是域操作模式。 对于 独立模式,这里是你如何使用脚本。

Linux/Unix
$。../bin/add-user-keycloak.sh -r master -u <用户名> -p <密码>
窗户
>。.. \ bin \ add-user-keycloak.bat -r master -u <用户名> -p <密码>

对于域模式,您必须使用-sc开关。

Linux/Unix
$。../bin/add-user-keycloak.sh -- sc域/服务器-一个/配置-r master -u <用户名> -p <密码>
窗户
>。.. \ bin \ add-user-keycloak.bat -- sc域/服务器-一个/配置-r master -u <用户名> -p <密码>

管理控制台

您的大部分管理任务将通过Keycloak管理控制台完成。 您可以直接转到控制台网址http:// localhost:8080/auth/admin/

登录页面

登录页面

输入您在欢迎页面或添加-用户-密钥斗篷bin目录中的脚本。 这将带您进入Keycloak管理控制台。

管理控制台

管理控制台

左侧下拉菜单允许您选择要管理的领域或创建新的领域。 右侧下拉菜单允许您查看用户帐户或注销。 如果您对管理控制台中的某个功能,按钮或字段感到好奇,只需将鼠标悬停 超过任何问号 图标。 这将弹出工具提示文本来描述您感兴趣的控制台区域。 上图显示了正在运行的工具提示。

大师领域

当您第一次启动Keycloak时,Keycloak创建了一个 为你预定义的境界。 这个最初的领域是大师境界。 它是 领域层次结构中的最高级别。 这个领域的管理员帐户有 查看和管理在服务器实例上创建的任何其他领域的权限。 定义初始管理员帐户时,您可以在 大师境界。 您对管理控制台的初始登录也将通过 大师境界。

我们建议您不要使用大师管理用户的领域 以及您组织中的应用程序。 储备使用大师领域 超级管理员来创建和管理系统中的领域。 遵循这一点 安全模型有助于防止意外更改,并遵循传统 只允许用户帐户访问必要的特权和权力 为了成功完成他们目前的任务。

可以禁用大师在其中实现和定义管理帐户 你创造的每一个新的领域。 每个领域都有自己的专用管理员 您可以使用本地帐户登录的控制台。 本指南详细介绍了 这个在专用领域管理控制台 章。

开创新境界

创造一个新的境界很简单。 将鼠标悬停在标题为的左上角下拉菜单上大师。 如果您已登录主领域 此下拉菜单列出了所有创建的领域。 此下拉菜单的最后一个条目始终是添加领域。 点击 这是为了增加一个领域。

添加领域菜单

添加领域菜单

此菜单选项将带您进入添加领域页。 指定要定义的领域名称,然后单击创建按钮。 或者,您可以导入定义您的新境界的JSON文档。 我们将在 导出和导入章。

创造境界

创造境界

创建realm后,您将返回到主管理控制台页面。 当前领域现在将设置为 你刚刚创造的领域。 您可以通过在 左上角下拉菜单。

SSL模式

每个领域都有与其相关联的SSL模式。 SSL模式定义了与领域交互的SSL/HTTPS要求。 与领域交互的浏览器和应用程序必须遵守SSL模式定义的SSL/HTTPS要求,否则它们 将不允许与服务器交互。

Keycloak在第一次运行时生成自签名证书。 请注意,自签名证书不安全,只能用于测试目的。 强烈建议您在Keycloak服务器本身或Keycloak服务器前面的反向代理上安装CA签名的证书。 请参阅服务器安装和配置指南

要配置您的领域的SSL模式,您需要单击领域设置左侧菜单项并转到登录tab。

登录选项卡

登录选项卡

需要SSL选项允许您选择所需的SSL模式。 以下是每种模式的解释:

外部请求

用户可以在没有SSL的情况下与Keycloak进行交互,只要他们坚持使用私有ip地址,例如本地主机,127.0.0.1,10.x,192.168.x,以及172.16.x。 如果您尝试从非专用ip地址访问没有SSL的Keycloak,则会收到错误消息。

Keycloak不需要SSL。 这真的应该只在开发中使用,当你在玩弄东西,不想打扰的时候 在您的服务器上配置SSL。

所有请求

Keycloak要求所有ip地址都使用SSL。

清除服务器缓存

Keycloak将在您的JVM和/或您配置的限制内将所有它可以缓存在内存中的内容 它是为了。 如果Keycloak数据库是由第三方 (即DBA) 在服务器的REST api或管理控制台的范围之外修改的 内存缓存的某些部分可能会过时。 您可以清除领域缓存、用户缓存或外部公钥的缓存 (公钥的 外部客户端或身份提供者 (Keycloak通常用于验证特定外部实体的签名) 从管理控制台通过 到领域设置左侧菜单项和缓存tab。

缓存选项卡

缓存选项卡

只需单击清除您要驱逐的缓存上的按钮。

电子邮件设置

Keycloak向用户发送电子邮件,以验证他们的电子邮件地址,当他们忘记密码时,或者当管理员需要 接收有关服务器事件的通知。 要启用Keycloak发送电子邮件,您需要向Keycloak提供您的SMTP服务器设置。 这是按领域配置的。 去领域设置左侧菜单 项目,然后单击电子邮件tab。

电子邮件选项卡

电子邮件选项卡

主机

主机表示用于发送电子邮件的SMTP服务器主机名。

港口

港口表示SMTP服务器端口。

来自

来自表示用于来自发送电子邮件的SMTP标题。

从显示名称

从显示名称允许配置用户友好的电子邮件地址别名 (可选)。 如果没有设置平原来自电子邮件地址将显示在电子邮件客户端中。

回复

回复表示用于回复发送邮件的SMTP标头 (可选)。 如果没有设置平原来自将使用电子邮件地址。

回复显示名称

回复显示名称允许配置用户友好的电子邮件地址别名 (可选)。 如果没有设置平原回复将显示电子邮件地址。

信封来自

信封来自表示弹跳地址用于返回路径发送邮件的SMTP标头 (可选)。

由于电子邮件用于恢复用户名和密码,因此建议使用SSL或TLS,尤其是在SMTP服务器位于外部网络上的情况下。 要启用SSL,请单击启用SSL或者要启用TLS,请单击启用TLS。 你很可能还需要改变港口(SSL/TLS的默认端口为465)。

如果您的SMTP服务器需要身份验证,请单击启用身份验证并插入用户名密码。 的价值密码字段可以引用外部的值保险库

主题与国际化

主题允许您更改Keycloak中任何UI的外观和感觉。 主题是按领域配置的。 要改变 主题转到领域设置左侧菜单项,然后单击主题tab。

主题选项卡

主题选项卡

为每个UI类别选择您想要的主题,然后单击保存

登录主题

用户名密码输入、OTP输入、新用户注册以及其他与登录相关的类似屏幕。

账户主题

每个用户都有一个用户帐户管理UI。

管理控制台主题

Keycloak管理控制台的皮肤。

电子邮件主题

每当Keycloak必须发送电子邮件时,它都会使用此主题中定义的模板来制作电子邮件。

服务器开发指南进入如何创建新主题或修改现有主题。

国际化

每个UI屏幕都在Keycloak中国际化。 默认语言是英语,但是如果您打开 国际化打开主题选项卡您可以选择要支持的语言环境以及默认语言环境 会的。 下次用户登录时,他们将能够在登录页面上选择一种语言用于登录屏幕, 用户帐户管理UI和管理控制台。 的服务器开发指南解释 如何提供其他语言。 主题提供的所有国际化文本都可以覆盖 通过特定领域的文本本地化tab。

用户区域设置选择

为了为用户选择最佳的语言环境,有一个语言环境选择器提供程序来决定什么 是现有信息的最佳地点。 这里要注意的一件事是,并不总是知道用户是谁。 因此,在持久的cookie中会记住先前经过身份验证的用户区域设置。

选择语言环境的逻辑使用以下第一个可用的逻辑:

  • 用户选择-当用户使用下拉区域设置选择器选择了区域设置时

  • 用户配置文件-当有经过身份验证的用户并且用户具有首选的区域设置时

  • 客户端选择-由客户端使用例如ui_locales参数传递

  • Cookie-在浏览器上选择的最后一个区域设置

  • 接受的语言环境接受语言标题

  • 境界默认

  • 如果以上都不是,请回退到英语

当用户通过身份验证时,将触发一个操作来更新前面提到的持久cookie中的区域设置。 如果 用户已通过登录页面上的区域设置选择器主动切换区域设置。用户区域设置也在以下位置更新 这一点。

如果要更改选择区域设置的逻辑,则可以选择创建自定义本地电子供应商。 有关详细信息,请参阅 服务器开发指南

用户管理

本节介绍用于管理用户的管理功能。

搜索用户

如果需要管理特定用户,请单击用户在左侧菜单栏中。

用户

用户

此菜单选项将您带到用户列表页面。 在搜索框中,您可以输入全名,姓氏或电子邮件地址 您想要在用户数据库中搜索 该查询将调出符合您条件的所有用户。 的查看所有用户按钮 将列出系统中的每个用户。 这将只搜索本地Keycloak数据库,而不是联邦数据库 (即 LDAP) 因为像LDAP这样的一些后端没有办法在用户中翻页。 因此,如果您希望将来自联合后端的用户同步到Keycloak 数据库您需要:

  • 调整搜索条件。 这将仅将匹配条件的后端用户同步到Keycloak数据库中。

  • 用户联合选项卡并单击同步所有用户或者同步更改的用户在与您的联盟提供者的页面中。

用户联合有关更多详细信息。

创建新用户

要创建用户,请单击用户在左侧菜单栏中。

用户

用户

此菜单选项将您带到用户列表页面。 在空用户列表的右侧,您应该会看到一个添加用户 按钮。 单击该按钮开始创建您的新用户。

添加用户

添加用户

唯一的必填字段是用户名。 单击保存。 这将使您进入新用户的管理页面。

删除用户

要删除用户,请单击用户在左侧菜单栏中。

用户

用户

此菜单选项将您带到用户列表页面。 点击查看所有用户或者搜索找到你打算删除的用户。

查看所有用户

删除用户

在用户列表中,单击删除在您要删除的用户旁边。 您将被要求确认您确定要删除此用户。 点击删除在确认框中进行确认。

用户属性

除了基本的用户元数据 (如名称和电子邮件) 之外,您还可以存储任意用户属性。 选择要管理的用户 然后点击属性tab。

用户

用户属性

在空字段中输入属性名称和值,然后单击添加按钮旁边添加一个新字段。 请注意,您在此页面上所做的任何编辑都不会被存储,直到您点击保存按钮。

某些属性是只读的,并且不应由管理员更新。 这包括属性,这些属性是只读的 通过设计,例如LDAP_ID,由LDAP提供程序自动填充。 其他一些属性应该是只读的 由于安全原因,典型的用户管理员。 请参阅中的详细信息威胁模型缓解章节

用户凭证

查看用户时,如果您转到凭据选项卡您可以管理用户的凭据。

凭证管理

用户凭证

凭据列在一个表中,该表中具有以下字段:

位置

此列中的箭头按钮允许您为用户转移凭据的优先级,其中最高的凭据具有最高的优先级。 此优先级确定在登录过程中选择的情况下将首先向用户显示哪个凭据。 可用于 用户将被选中。

类型

这显示了凭证的类型,例如密码或者otp

用户标签

这是一个可分配的标签,用于在登录过程中显示为选择选项时识别凭据。 可以将其设置为任何值来描述 证书。

数据

这显示了有关凭据的非机密技术信息。 它本来是隐藏的,但是你可以按显示数据&hellip;为了一个 证书。

行动

这列有两个按钮。 保存记录用户标签的值,而删除将删除证书。

为用户创建密码

如果用户没有密码,或者密码已被删除,则设置密码部分将显示在页面上。

凭据管理-设置密码

用户凭据设置密码

要为用户创建密码,请键入新密码。 点击设置密码输入所有内容后的按钮。 如果临时开关打开,这个新密码只能使用一次,用户将被要求在密码打开后更改密码 登录。

如果用户已经有密码,则可以在重置密码节。

或者,如果你有电子邮件设置后,您可以向询问的用户发送电子邮件 他们重置密码。 选择更新密码重置动作列表框并单击发送电子邮件。 你可以选择 设置默认为预设的电子邮件链接的有效性令牌领域设置中的选项卡。 发送的电子邮件包含一个链接,该链接将使用户进入更新密码屏幕。

请注意,用户只能拥有密码类型的单个凭据。

创建其他凭据

您无法在管理控制台中为特定用户配置其他类型的凭据。 这是用户的责任。 您只能删除用户的凭据凭据选项卡,例如,如果用户丢失了OTP设备,或者如果凭据 已经妥协了。

创建OTP

如果OTP在您的领域是有条件的,用户将不得不去用户帐户管理服务重新配置一个新的 OTP发电机。 如果需要OTP,则会询问用户 在他们登录时重新配置新的OTP生成器。

像密码一样,您也可以向用户发送电子邮件,要求他们重置OTP生成器。 选择 配置OTP重置动作列表框,然后单击发送电子邮件按钮。 发送的电子邮件 包含将用户带到OTP设置屏幕的链接。 即使用户已经有OTP凭证,您也可以使用此方法, 想再设置一些。

所需的操作

必需的操作是用户在被允许登录之前必须完成的任务。 用户必须在执行所需的操作之前提供其凭据。 一旦完成所需的操作,用户将没有 再次执行该操作。 以下是一些内置的必需操作类型的解释:

更新密码

设置后,用户必须更改密码。

配置OTP

设置后,用户必须使用免费OTP或Google Authenticator应用程序在其移动设备上配置一次性密码生成器。

验证电子邮件

设置后,用户必须验证他们是否拥有有效的电子邮件帐户。 将向用户发送一封电子邮件,其中包含他们必须单击的链接。 一旦这个工作流程 成功完成后,他们将被允许登录。

更新配置文件

这个所需的动作要求用户更新他们的简档信息,即他们的姓名、地址、电子邮件和/或电话号码。

管理员可以为用户内部的每个用户添加所需的操作详细信息管理控制台中的选项卡。

设置所需的操作

用户要求的操作

必需的用户操作列表框,选择要添加到帐户的所有操作。 如果要删除一个,请单击X旁边的 动作名称。 还记得点击保存决定要添加哪些操作后的按钮。

默认必需操作

您还可以指定所需的操作,这些操作将在创建新用户时添加到帐户中,即通过添加用户按钮用户 列表屏幕,或通过用户注册登录页面上的链接。 要指定 默认的必需操作转到身份验证左侧菜单项,然后单击所需的操作tab。

默认必需操作

默认必需操作

只需单击中的复选框默认操作全新用户登录时要执行的必需操作列。

条款和条件

许多组织都要求新用户首次登录时,他们需要同意条款和条件 网站的。 Keycloak将此功能作为必需的操作实现,但需要进行一些配置。 一方面,你 必须去所需的操作前面描述的选项卡,并启用条款和条件行动。 您还必须编辑 条款。ftl文件中的基地登录主题。 请参阅服务器开发指南有关扩展和扩展的更多信息 创造主题。

模仿

管理员模拟用户通常很有用。 例如,用户可能在您的一个应用程序中遇到错误,并且 管理员可能希望模拟用户以查看他们是否可以复制问题。 具有适当权限的管理员 可以模拟用户。 管理员可以在两个位置发起模拟。 第一个是在用户列表选项卡。

用户

用户搜索

你可以在这里看到管理员已经搜索了约翰。 在约翰的账户旁边,你可以看到一个模拟按钮。 点击那个 来模拟用户。

此外,您可以从用户中模拟用户详细信息tab。

用户详细信息

用户详细信息

在页面底部附近,您可以看到模拟按钮。 单击该按钮以模拟用户。

冒充时,如果管理员和用户在同一领域,那么管理员将被注销并自动登录 作为被模仿的用户。 如果管理员和用户不在同一领域,则管理员将保持登录状态,但另外 以用户身份登录该用户的领域。 在这两种情况下,浏览器都将被重定向到模拟用户的用户帐户管理 页。

任何拥有王国的用户模仿角色可以模拟用户。 请看管理控制台访问控制章 有关分配管理权限的更多详细信息。

用户注册

您可以启用Keycloak以允许用户自我注册。 启用后,登录页面具有注册 链接用户可以单击以创建他们的新帐户。

启用用户自我注册后,可以使用注册表单来检测有效的用户名和电子邮件。 也可以启用reCAPTCHA支持

启用注册非常简单。 去 领域设置左侧菜单并单击它。 然后去登录tab。 有一个用户注册打开这个 tab。 打开它,然后单击保存按钮。

登录选项卡

登录选项卡

启用此设置后,注册链接应该显示在登录页面上。

注册链接

注册链接

单击此链接将使用户进入注册页面,他们必须在其中输入一些用户个人资料信息 和一个新密码。

登记表

登记表

您可以更改注册表的外观,以及删除或添加必须输入的其他字段。 请参阅服务器开发指南有关更多信息。

reCAPTCHA支持

为了防止机器人注册,Keycloak已与Google reCAPTCHA集成。 要启用此功能,您需要首先转到谷歌Recaptcha网站 并创建一个API密钥,以便您可以获取reCAPTCHA站点密钥和秘密。 (仅供参考,默认情况下localhost可以工作,因此您不必指定域)。

接下来,您需要在Keycloak管理控制台中执行一些步骤。 单击身份验证左侧菜单项并转到流动tab。 选择注册从下拉菜单中流出 在此页面上列出。

注册流程

注册流程

将 “recaptcha” 要求设置为必需通过单击适当的单选按钮。 这将使 屏幕上的reCAPTCHA。 接下来,您必须输入在Google reCAPTCHA网站上生成的reCAPTCHA网站密钥和机密。 单击reCAPTCHA流条目右侧的 “操作” 按钮,然后单击 “Config” 链接,然后在此配置页面上输入reCAPTCHA站点密钥和秘密。

Recaptcha配置页面

重新捕获配置

您要做的最后一步是更改Keycloak设置的一些默认HTTP响应头。 Keycloak 将阻止网站在iframe中包含任何登录页面。 这是为了防止点击劫持攻击。 你需要 授权Google在iframe内使用注册页面。 去 的领域设置左侧菜单项,然后转到安全防御tab。 您需要添加https://www.google.com到 两者的值X-框架-选项内容安全策略标题。

授权iframe

安全标题

执行此操作后,reCAPTCHA应该会显示在您的注册页面上。 您可能想要编辑注册。ftl在您的登录中 主题与reCAPTCHA按钮的位置和样式有关。 请参阅服务器开发指南 有关扩展和创建主题的更多信息。

Keycloak收集的个人数据

默认情况下,Keycloak收集以下内容:

  • 基本用户配置文件,如电子邮件、名字和姓氏

  • 使用社交登录时,用于社交帐户的基本用户配置文件以及对社交帐户的引用

  • 为审核和安全目的而收集的设备信息,例如ip地址,操作系统名称和浏览器名称

Keycloak中收集的信息是高度可定制的。 进行自定义时,请注意以下准则:

  • 注册和帐户表单可以包含自定义字段,例如生日,性别和国籍。 管理员可以配置Keycloak从社交提供商或用户存储提供商 (例如LDAP) 检索该数据。

  • Keycloak收集用户凭证,如密码、OTP代码和WebAuthn公钥。 此信息已加密并保存在数据库中,因此Keycloak管理员不可见。 但是,每种类型的凭证都可以包括管理员可见的非机密元数据,例如用于散列密码的算法以及用于散列密码的散列迭代次数。

  • 启用授权服务和UMA支持后,Keycloak可以保存有关特定用户为其所有者的某些对象的信息。 例如,Keycloak可以跟踪用户约翰是相册的所有者动物相册还有几张照片叫做狮子图片奶牛图片在这张专辑中。

启用用户删除帐户

Keycloak可以允许应用程序最终用户通过帐户控制台删除其帐户。 默认情况下未启用该功能。 要启用它,需要采取以下步骤:

  • 启用 “删除帐户” 所需操作

允许用户删除其帐户是通过AIA (应用程序启动的操作) 完成的。 首先,您需要从管理控制台启用该操作。 在 “身份验证” 菜单中,转到 “必需的操作” 选项卡,然后在 “删除帐户” 操作的启用复选框中打勾。

启用删除帐户操作

  • 确保用户具有 “删除帐户” 作为客户端角色:

在每个用户的基础上启用删除帐户功能。 启用删除帐户功能的第二个要求是确保用户具有删除帐户作为客户角色。

要为用户启用删除帐户角色,请转到 “用户” 菜单,然后找到要为其启用删除帐户功能的用户。 在 “角色映射” 选项卡中,从 “客户角色” 列表中选择 “帐户” 客户端。

最后,选择删除帐户然后单击添加选定的。

删除帐户客户端角色

删除操作中的用户

启用该功能后,用户将在 “个人信息” 页面的底部看到一个名为 “删除帐户” 的新部分

删除帐户页面

如警告消息所述,此操作是不可逆的,它意味着删除Keycloak中的所有用户数据。

一旦用户单击 “删除”,将提示他再次输入其凭据,并重定向到最终确认步骤:

删除帐户确认

确认后,用户的账号将被删除。

用户配置文件

在Keycloak中,用户与一组属性相关联。 这些属性用于更好地描述和识别Keycloak中的用户,并将有关他们的其他信息传递给应用程序。

用户配置文件定义了一个定义明确的架构,用于表示用户属性以及如何在领域内管理它们。 通过提供对用户信息的一致视图,它使管理员可以控制有关如何管理属性的不同方面,并使扩展Keycloak以支持其他属性变得更加容易。

除其他功能外,用户配置文件使管理员能够:

  • 为用户属性定义模式

  • 根据上下文信息定义是否需要属性 (例如: 如果仅对用户或管理员或两者都需要,或者取决于所请求的范围)。

  • 定义查看和编辑用户属性的特定权限,从而可以遵守某些属性无法被第三方 (包括管理员) 看到或更改的强烈隐私要求

  • 动态实施用户配置文件合规性,以便始终更新用户信息,并符合与属性关联的元数据和规则

  • 通过利用内置的验证器或编写自定义的验证器,在每个属性的基础上定义验证规则

  • 根据属性定义,在帐户控制台中动态呈现用户与之交互的表单,如注册、更新配置文件、代理和个人信息,而无需手动更改主题。

用户配置文件功能由用户配置文件SPI支持。 默认情况下,这些功能被禁用,领域被配置为使用默认配置,该配置保持与遗留行为的向后兼容性。

遗留行为是关于在管理用户根属性 (例如用户名,电子邮件,名字和姓氏) 时保留Keycloak使用的默认约束,而对如何管理自定义属性没有任何限制。 关于用户流,例如通过帐户控制台的注册,配置文件更新,代理和管理帐户,限制用户使用上述属性,并可以更改主题模板以支持其他属性。

如果您已经在使用Keycloak,那么到目前为止,您一直在使用遗留行为。

与传统行为不同,声明性提供程序为您提供了更大的灵活性,可以通过管理控制台和定义良好的JSON模式将用户配置文件配置定义为领域。

在接下来的部分中,我们将研究如何使用声明性提供程序来定义您自己的用户配置文件配置。

将来,将不再在Keycloak中支持遗留行为。 理想情况下,您应该开始查看用户配置文件提供的新功能,并相应地迁移您的领域。

启用用户配置文件

声明性用户配置文件是技术预览并且没有得到完全支持。 默认情况下,此功能被禁用。

启用以启动服务器-Dkeycloak。个人资料 = 预览 或者-Dkeycloak。配置文件。功能。声明 _ 用户 _ 配置文件 = 启用 。 有关更多详细信息,请参见配置文件

除了启用声明 _ 用户 _ 配置文件功能,您应该为领域启用用户配置文件。 为此,请单击领域设置链接在 左侧菜单并打开启用用户配置文件开关。

启用用户配置文件

启用它并单击保存按钮,您可以访问用户配置文件选项卡,您可以从其中管理用户属性的配置。

通过启用领域的用户配置文件,Keycloak将对基于用户配置文件配置的属性管理方式施加其他约束。 总而言之,以下是启用该功能时应期望的列表:

  • 从管理的角度来看,属性“用户详细信息” 页面上的选项卡将仅显示在 “用户配置文件” 配置中定义的属性。 在管理属性时,还将考虑基于每个属性定义的条件。

  • 将根据用户配置文件配置动态呈现面向用户的表单,例如帐户控制台中的注册,更新配置文件,代理和个人信息。 为此,Keycloak将依靠不同的模板来动态呈现这些表单。

在接下来的主题中,我们将探索如何管理用户配置文件配置以及它如何影响您的领域。

管理用户配置文件

用户配置文件配置是在每个领域的基础上管理的。 为此,点击 领域设置左侧菜单上的链接,然后单击用户配置文件tab。

用户配置文件选项卡

用户配置文件选项卡

属性子选项卡您具有当前与用户配置文件关联的属性列表。 默认情况下,配置是根据用户根属性创建的,并且每个属性在验证和许可方面都配置了一些默认值。

属性组子选项卡您可以管理属性组。 属性组允许您关联属性,以便在呈现面向用户的表单时将它们显示在一起。

目前,属性组仅用于渲染目的,但将来它们还应该启用对它们所链接的属性定义顶级配置。

JSON编辑器子选项卡您可以使用定义明确的JSON架构查看和编辑配置。 在任何其他选项卡上进行的任何更改都将反映在此选项卡上显示的JSON配置中。

在下一节中,您将学习如何从属性子选项卡。

管理属性

属性子选项卡您可以创建、编辑和删除与用户配置文件关联的属性。

要定义新属性并将其与用户配置文件相关联,请单击创建属性列表右上角的按钮。

属性配置

用户配置文件创建属性

配置属性时,您可以定义以下设置:

名称

属性的名称。

显示名称

属性的用户友好名称,主要在呈现面向用户的表单时使用。 它支持国际化,以便可以从消息包加载值。

属性组

属性所属的属性组 (如果有)。

当范围

允许您定义范围列表以动态启用属性。 如果未设置,则在管理用户配置文件以及呈现面向用户的表单时,该属性始终处于启用状态,并且始终强制执行其约束。 否则,仅当客户端请求列表中的任何作用域时,相同的约束才适用。

必需

根据需要设置属性。 如果未启用,则该属性是可选的。 否则,该属性必须由用户和管理员提供,并有可能使该属性仅适用于用户或管理员以及基于客户端请求的范围。

权限

在本节中,您可以定义用户和管理员的读写权限。

验证

在本节中,您可以定义在管理属性值时将执行的验证。 Keycloak提供了一组内置的验证器,您可以从中进行选择,并可以添加自己的验证器。

注释

在本节中,您可以将注释与属性相关联。 注释主要用于将其他元数据传递给前端以进行渲染。

管理权限

权限部分,您可以定义用户和管理员对属性进行读写的访问级别。

属性权限

用户配置文件权限

为此,您可以使用以下设置:

用户可以查看吗?

如果启用,用户可以查看属性。 否则,用户无法访问该属性。

用户可以编辑吗?

如果启用,用户可以查看和编辑属性。 否则,用户无权写入该属性。

管理员可以查看吗?

如果启用,管理员可以查看属性。 否则,管理员将无法访问该属性。

管理员可以编辑吗?

如果启用,管理员可以查看和编辑属性。 否则,管理员无权写入该属性。

创建属性时,不会对该属性设置任何权限。 实际上,用户或管理员都无法访问该属性。 创建属性后,请确保将权限设置为仅目标受众可见的属性。

许可直接影响如何以及谁可以管理属性,以及如何以面向用户的形式呈现属性。

例如,通过将属性标记为仅可由用户查看,管理员在通过管理控制台管理用户时将无权访问该属性 (无论来自用户API)。 此外,用户在更新其配置文件时将无法更改属性。 一个有趣的配置,如果用户属性是从现有身份存储 (联合) 中获取的,并且您只想使属性对用户可见,而无需通过源身份存储更新属性。

同样,您也可以将属性标记为可写入仅适用于具有用户只读访问权限的管理员。 在这种情况下,仅允许管理员管理该属性。

根据您的隐私要求,您可能还希望管理员无法访问属性,但对用户具有读写权限。

每当向用户配置文件配置添加新属性时,请确保设置正确的权限。

管理验证

验证部分,您可以从不同形式的验证中进行选择,以确保属性值符合特定规则。

属性验证

用户配置文件验证

Keycloak提供开箱即用的不同验证器:

名称 描述 配置

长度

根据最小和最大长度检查字符串值的长度。

最小: 定义最小允许长度的整数。

最大: 定义最大允许长度的整数。

修剪-禁用: 一个布尔值,用于定义在验证之前是否对值进行了修整。

整数

检查该值是否为整数且在较低和/或较高范围内。 如果未定义范围,则验证器仅检查该值是否为有效数字。

最小: 定义较低范围的整数。

最大: 定义上限范围的整数。

双倍

检查该值是否为双精度且在较低和/或较高范围内。 如果未定义范围,则验证器仅检查该值是否为有效数字。

最小: 定义较低范围的整数。

最大: 定义上限范围的整数。

uri

检查该值是否为有效URI。

图案

检查该值是否与特定的正则表达式模式匹配。

图案: 验证值时要使用的正则表达式模式。

错误消息: i18n bundle中错误消息的键。 如果未设置,则使用通用消息。

电子邮件

检查该值是否具有有效的电子邮件格式。

本地日期

检查该值是否具有基于领域和/或用户区域设置的有效格式。

人物-姓名-禁止-字符

检查该值是否为有效的人员名称,作为脚本注入等攻击的附加屏障。 验证基于默认的正则表达式模式,该模式会阻止人名中不常见的字符。

错误消息: i18n bundle中错误消息的键。 如果未设置,则使用通用消息。

用户名-禁止-字符

检查该值是否是有效的用户名,作为脚本注入等攻击的附加屏障。 验证基于默认的正则表达式模式,该模式阻止用户名中不常见的字符。

错误消息: i18n bundle中错误消息的键。 如果未设置,则使用通用消息。

管理注释

为了将其他信息传递给前端,属性可以用 注释来指示属性是如何呈现的。 当扩展Keycloak主题以根据与属性关联的注释动态呈现页面时,此功能主要有用。

属性注释

用户配置文件注释

管理属性组

属性组子选项卡您可以创建、编辑和删除属性组。 属性组允许您为相关属性定义一个容器,以便在面向用户的表单中将它们呈现在一起。

属性组列表

用户配置文件属性组列表

您不能删除绑定到属性的属性组。 为此,您应该首先更新属性以删除绑定。

要创建新组,请单击创建属性组列表右上角的按钮。

属性组配置

用户配置文件创建属性组

配置组时,您可以定义以下设置:

名称

组的名称。

显示名称

组的用户友好名称,主要在呈现面向用户的表单时使用。 它支持国际化,以便可以从消息包加载值。

显示说明

一种用户友好的文本,在呈现面向用户的表单时将显示为工具提示。

注释

在本节中,您可以将注释与属性相关联。 注释主要用于将其他元数据传递给前端以进行渲染。

使用JSON配置

用户配置文件配置使用定义明确的JSON模式存储。 您可以通过单击直接从编辑用户配置文件配置中进行选择JSON编辑器子选项卡。

JSON配置

用户配置文件json配置

JSON模式定义如下:

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “必需”: {
        "角色": [ "用户","管理员"],
        “范围”: [“foo”,“bar”]
      },
      “权限”: {
        "查看": [ "管理员","用户"],
        "编辑": [ "管理员" 、 "用户"]
      },
      “验证”: {
        "电子邮件" :{},
        “长度”: {
          "max": 255
        }
      },
      “注释”: {
        "myannotation": "myannotation-value"
      }
    }
  ],
  “组”: [
    {
      “名称”: “个人信息”,
      "displayHeader": "个人信息"
    }
  ]
}

该架构支持您需要的任意多个属性。

对于每个属性,您应该定义一个名称还有,可选地,必需,权限,以及注释设置。

所需财产

必需设置定义是否需要属性。 Keycloak允许您根据不同的条件根据需要设置属性。

必需设置定义为空对象,属性始终是必需的。

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “必需”: {}
  ]
}

另一方面,您可以选择使属性仅对用户或管理员或两者都必需。 以及仅在用户在Keycloak中进行身份验证时请求特定范围的情况下才将属性标记为所需。

要标记用户和/或管理员所需的属性,请设置角色属性如下:

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “必需”: {
        “角色”: [“用户”]
      }
  ]
}

角色属性期望一个数组,其值可以是用户或者管理员,具体取决于该属性是用户还是管理员要求的。

同样,当客户端在对用户进行身份验证时请求一组一个或多个作用域时,您可以选择使属性成为必需的。 为此,您可以使用范围属性如下:

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “必需”: {
        “范围”: [“foo”]
      }
  ]
}

范围属性是一个数组,其值可以是表示客户端作用域的任何字符串。

权限属性

属性级别权限属性可用于定义属性的读写权限。 权限是根据用户或管理员或两者都可以对属性执行这些操作来设置的。

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “权限”: {
        “查看”: [“管理员”],
        "编辑": ["用户"]
      }
  ]
}

两者视图编辑属性期望一个数组,其值可以是用户或者管理员,具体取决于属性是可由用户还是管理员查看还是可编辑。

编辑授予许可,视图权限是隐式授予的。

注释属性

属性级别注释属性可用于将其他元数据与属性相关联。 注释主要用于将有关属性的其他信息传递给基于用户配置文件配置的前端呈现用户属性。 每个注释都是一个键/值对。

{
  “属性”: [
    {
      “名称”: “我的属性”,
      “注释”: {
        "foo": ["foo-value"],
        "bar": ["bar-value"]
      }
  ]
}

使用动态表单

用户配置文件的主要功能之一是可以基于属性元数据动态呈现面向用户的表单。 将功能启用到您的领域后,将使用特定主题模板呈现诸如注册和更新配置文件之类的表单,以基于用户配置文件配置动态呈现页面。

也就是说,如果默认渲染机制满足您的需求,则根本不需要自定义模板。 如果您仍然需要对主题进行自定义,请查看以下模板:

模板 描述

基地/登录/update-user-profile.ftl

呈现更新配置文件页面的模板。

基地/登录/register-user-profile.ftl

呈现注册页面的模板。

基地/登录/idp-review-user-profile.ftl

当通过中介联合用户时,呈现页面以查看/更新用户配置文件的模板。

默认渲染机制提供以下功能:

  • 根据设置为属性的权限动态显示字段。

  • 根据设置为属性的约束动态渲染所需字段的标记。

  • 根据属性设置的权限动态呈现只读字段。

  • 根据属性设置的顺序动态排序字段。

  • 动态分组属于同一属性组的字段。

订购属性

属性顺序是通过在属性列表页面上单击向上和向下箭头来设置的。

订购属性

用户配置文件属性列表顺序

当字段以动态形式呈现时,您在此页面中设置的顺序将得到尊重。

分组属性

呈现动态表单时,它们将尝试将属于同一属性组的属性组合在一起。

动态更新配置文件表单

用户配置文件更新配置文件

当属性链接到属性组时,属性顺序也很重要,以确保同一组中的属性在同一组标头中靠近在一起。 否则,如果组中的属性没有顺序,则可能会在动态表单中多次呈现相同的组标头。

强制用户配置文件合规性

为了确保用户配置文件符合配置,管理员可以使用验证简介最终强制用户在对Keycloak进行身份验证时更新其配置文件所需的操作。

验证简介动作类似于更新配置文件行动。 但是,它利用用户配置文件提供的所有功能来自动强制遵守用户配置文件配置。

启用后,验证简介当用户进行身份验证时,操作将执行以下步骤:

  • 检查用户配置文件是否完全符合设置为领域的用户配置文件配置。

  • 如果不是,则在身份验证期间执行额外的步骤,以便用户可以更新任何丢失或无效的属性。

  • 如果用户配置文件符合配置,则不执行其他步骤,并且用户继续进行身份验证过程。

默认情况下,验证简介动作被禁用。 要启用它,请单击 身份验证左侧菜单上的链接,然后单击所需的操作tab。 在此选项卡上,单击注册按钮并选择验证简介行动。

注册VerifyProfile所需的操作

用户配置文件注册验证配置文件操作

迁移到用户配置文件

在将用户配置文件功能启用到某个领域之前,您应该注意一些重要的注意事项。 通过提供单个位置来管理属性元数据,该功能对可以设置给用户的属性以及如何管理这些属性非常严格。

在用户管理方面,管理员只能管理用户配置文件配置中定义的属性。 设置为用户且尚未在用户配置文件配置中定义的任何其他属性将无法访问。 建议使用要向用户或管理员公开的所有用户属性来更新用户配置文件配置。

同样的建议适用于那些访问用户REST API来查询用户信息的人。

关于Keycloak内部用户属性,例如LDAP_ID,LDAP_ENTRY_DN,或者Kerberos _ 校长,如果您希望能够访问这些属性,则应将它们作为用户配置文件配置中的属性。 建议将这些属性标记为仅对管理员可见,以便在通过管理控制台管理用户属性或通过用户API查询用户时可以查看它们。

关于主题,如果您已经对传统模板 (使用用户根属性进行硬编码的模板) 进行了自定义,则在呈现面向用户的表单时不会使用自定义模板,而是动态呈现这些表单的新模板。 理想情况下,您应该避免对模板进行任何自定义,并尝试坚持这些新模板提供的行为,以便为您动态呈现表单。 如果它们仍然不足以满足您的要求,您可以自定义它们,也可以向我们提供任何反馈,以便我们讨论增强新模板是否有意义。

登录页面设置

如果您需要该功能,可以启用几个不错的内置登录页面功能。

忘记密码

如果启用它,则如果用户忘记密码或丢失OTP生成器,则可以重置其凭据。 去领域设置左侧菜单项,然后单击登录tab。 打开忘记密码开关。

登录选项卡

登录选项卡

A忘记密码链接现在将显示在您的登录页面上。

忘记密码链接

忘记密码链接

点击这个链接会给用户带来 到一个页面,他们可以在其中输入用户名或电子邮件,并接收带有链接以重置其凭据的电子邮件。

忘记密码页面

忘记密码页面

电子邮件中发送的文本是完全可配置的。 您只需要扩展或编辑与之关联的主题。 请参阅服务器开发指南有关更多信息。

当用户点击电子邮件链接时,他们将被要求更新密码,如果他们有OTP生成器 设置后,还将要求他们重新配置。 根据您组织的安全要求 您可能不希望用户能够通过电子邮件重置其OTP生成器。 您可以通过以下方式更改此行为 去身份验证左侧菜单项,单击流动选项卡,然后选择重置凭据流量:

重置凭证流

重置凭证流

如果您不希望OTP重置,则只需选择禁用右侧的单选按钮重置OTP

确保在 “必需的操作” 选项卡上保持 “启用更新密码”。 否则,忘记密码不起作用。

记住我

如果登录用户关闭浏览器,则他们的会话将被破坏,他们将不得不再次登录。 你可以设置东西 这样,如果用户检查了记住我复选框,即使浏览器关闭,它们也将保持登录状态。 这基本上 将登录cookie从仅会话cookie转换为持久性cookie。

要启用此功能,请转到领域设置左侧菜单项,然后单击登录选项卡并打开记住我开关:

登录选项卡

登录选项卡

一旦你保存了这个设置,一个记住我复选框将显示在领域的登录页面上。

记住我

记住我

身份验证

在为您的领域配置身份验证时,您应该注意一些功能。 许多组织 具有严格的密码和OTP策略,您可以通过管理控制台中的设置来实施。 你可以也可以不可以 想要要求不同的凭证类型进行身份验证。 您可能希望为用户提供通过以下方式登录的选项 Kerberos或禁用或启用各种内置凭证类型。 本章涵盖了所有这些主题。

密码策略

创建的每个新域都没有与之关联的密码策略。 用户可以有尽可能短、尽可能长、尽可能复杂的, 像他们想要的那样不安全的密码。 简单的设置适合开发或学习Keycloak, 但在生产环境中是不可接受的。 Keycloak有一组丰富的密码策略,您可以启用 通过管理控制台。

点击身份验证左侧菜单项并转到密码策略tab。 在 右侧下拉列表框。 这将在屏幕上的表格中添加策略。 选择策略的参数。 击中保存按钮来存储您的更改。

密码策略

密码策略

保存策略后,用户注册和所需的更新密码操作将强制执行您的新策略。 用户的示例 策略检查失败:

失败的密码策略

失败的密码策略

如果更新了密码策略,则必须为每个用户设置更新密码操作。 自动触发器被安排为未来的增强。

密码策略类型

以下是每种策略类型的解释:

哈沙算法

密码不存储为明文。 相反,在存储或验证之前,使用标准哈希算法对它们进行哈希处理。 唯一可用的内置和默认算法是pbkdf2。 请参阅服务器开发指南 关于如何插入自己的算法。 请注意,如果您确实更改了算法,则密码哈希在存储中不会更改,直到 用户下次登录时。

散列迭代

此值指定在存储或验证密码之前将对其进行哈希处理的次数。 默认值为27,500。 这种散列是在黑客访问您的密码数据库的罕见情况下完成的。 一旦他们可以访问数据库, 他们可以反向工程用户密码。 随着CPU功率的提高,此参数的行业建议值每年都会发生变化。 较高的哈希迭代值需要更多的CPU功率进行哈希, 并会影响性能。 你必须权衡什么对你来说更重要: 性能或保护你的密码存储。 可能有更经济有效的方法来保护您的密码存储。

数字

密码字符串中需要的位数。

小写字符

密码字符串中要求的小写字母数。

大写字符

密码字符串中要求的大写字母数。

特殊字符

像 '?!这样的特殊字符的数量# % $ '必须在密码字符串中。

不是用户名

设置时,密码不允许与用户名相同。

不是电子邮件

设置后,密码不允许与电子邮件地址相同。

正则表达式

定义一个或多个正则表达式模式 (定义于java.util.regex.Pattern) 密码必须匹配。

过期密码

密码有效的天数。 天数过期后,用户需要更改密码。

最近没有使用

此策略保存以前密码的历史记录。 存储的旧密码数量是可配置的。 当用户更改密码时 他们不能使用任何存储的密码。

密码黑名单

此策略检查黑名单文件中是否包含给定的密码 (转换为小写),该文件可能是非常大的文件。 密码黑名单是UTF-8具有Unix行尾的纯文本文件,其中每一行代表一个列入黑名单的密码。 黑名单中的所有密码都必须小写,以便于不区分大小写的比较。 必须提供黑名单文件的文件名作为密码策略值,例如10 _ 百万 _ 密码 _ 列表 _ 顶部 _ 1000000.txt。 黑名单文件被解决${jboss.server.data.dir}/password-blacklist/默认情况下。 此路径可以通过Keycloak。密码。黑名单。路径系统属性, 或者黑名单路径的财产密码黑名单策略SPI配置。

OTP政策

Keycloak有许多策略,您可以为您的FreeOTP或Google Authenticator一次性密码设置 发电机。 点击身份验证左侧菜单项并转到OTP政策tab。

OTP政策

otp政策

您在此处设置的任何策略都将用于验证一次性密码。 配置OTP、FreeOTP和谷歌身份验证器时 可以扫描Keycloak在OTP设置页面上生成的QR码。 条形码也是 从配置在OTP政策tab。

TOTP vs. HOTP

您的OTP发生器有两种不同的算法可供选择。 基于时间 (TOTP) 和基于计数器 (HOTP)。 对于TOTP,您的令牌生成器将散列当前时间和共享秘密。 服务器通过比较验证OTP 在提交的值的一定时间窗口内的所有哈希值。 因此,TOTPs仅在很短的时间窗口 (通常为30秒) 内有效。 对于HOTP,使用共享计数器而不是当前时间。 服务器每次成功的OTP登录都会增加计数器。 所以,只有有效的OTPs 登录成功后更改。

TOTP被认为更安全,因为可匹配的OTP仅在短时间内有效,而HOTP的OTP可以 在不确定的时间内有效。 HOTP更加用户友好,因为用户不必急于输入 时间间隔到之前的OTP。 随着Keycloak实现TOTP的方式,这种区别变得更多了 模糊。 每次服务器要增加计数器时,HOTP都需要更新数据库。 这可能是性能消耗 当负载很大时,在身份验证服务器上。 因此,为了提供更有效的替代方案,TOTP不记得密码 用。 这绕过了做任何DB更新的需要,但缺点是TOTPs可以在有效的时间间隔内重新使用。 为了未来 Keycloak的版本计划您将能够配置TOTP是否在时间间隔内检查较旧的OTPs。

TOTP配置选项

OTP哈希算法

默认为SHA1,更安全的选项为SHA256和sha512。

位数

OTP是多少个字符? 简短意味着更加用户友好,因为用户输入的内容更少。 更多意味着更多的安全。

向前看窗口

服务器应该尝试匹配哈希值,提前多少个间隔? 这是为了以防TOTP发生器的时钟 或者身份验证服务器不同步。 默认值1通常足够好。 例如,如果时间间隔 对于每30秒一次的新令牌,默认值1表示它将仅在该30秒窗口中接受有效的令牌。 此配置值的每个增量将使有效窗口增加30秒。

OTP令牌期

服务器将匹配哈希的时间间隔 (以秒为单位)。 每次间隔过去,令牌生成器都会生成一个新的TOTP。

HOTP配置选项

OTP哈希算法

默认为SHA1,更安全的选项为SHA256和sha512。

位数

OTP是多少个字符? 简短意味着更加用户友好,因为用户输入的内容更少。 更多意味着更多的安全。

向前看窗口

服务器应该尝试匹配哈希值,前方有多少个计数器? 默认值为1。 这是为了掩盖案件而存在的 其中用户的计数器领先于服务器的。这通常会发生,因为用户经常增加计数器 意外手动太多次。 这个值确实应该增加到10左右。

初始计数器

初始计数器的值是多少?

身份验证流程

一个认证流程是一个容器,用于在登录,注册和其他过程中必须进行的所有身份验证,屏幕和操作 Keycloak工作流。 如果您转到管理控制台身份验证左侧菜单项并转到流动选项卡,您可以查看所有已定义的流 在系统中以及每个流程需要什么操作和检查。

内置流程

Keycloak带有一定数量的内置流。 这些流不能修改,但需求可以修改为 适合你的需求。

本节对内置的浏览器登录流程进行了演练。 在 左下拉列表选择浏览器来到下面显示的屏幕:

浏览器流程

浏览器流程

如果将鼠标悬停在流选择列表右侧的工具提示 (微小的问号) 上,这将描述 流动是,也是。

Auth类型列是将执行的身份验证或操作的名称。 如果身份验证缩进 这意味着它处于子流中,并且可能会或可能不会根据其父级的行为而执行。 的要求 列是一组单选按钮,它们定义了操作是否将执行。 让我们描述一下每个收音机 在这种情况下,button的意思是。

执行要求
必需

为了使流评估为成功,流中的所有必需元素都必须评估为成功。 这意味着所有必需流中的元素 必须从上到下依次执行,除非其中一个元素导致流失败。 但是,这仅适用于当前流量。 任何必需仅当输入子流时,才处理子流中的元素。

替代方案

当流仅包含替代方案元素,只有单个元素必须评估为成功,流才能评估为成功。 因为必需流中的流元素足以将流标记为成功,任何替代方案流中的流元素 包含必需流元素永远不会被执行。 在这种情况下,它们在功能上禁用

禁用

任何禁用元素不会被评估,也不会计数以将流标记为成功。

有条件的

此需求类型只能在子流上设置。 A有条件的子流可以包含 “条件” 执行。 这些 “条件” 执行必须评估为 逻辑语句。 如果所有 “条件” 执行评估为然后有条件的子流充当必需。 如果没有,有条件的子流程 充当禁用。 如果未设置 “条件” 执行,则有条件的子流充当禁用。 如果流包含 “条件” 执行,并且未设置为 有条件的,则不评估 “条件” 执行,可以从功能上考虑禁用

在示例中更好地描述了这一点。 让我们走过浏览器身份验证流程。

  1. 第一种身份验证类型是饼干。 当用户首次成功登录时,将设置会话cookie。 如果已经设置了此cookie,则此身份验证类型成功。 在这种情况下, 由于cookie提供程序返回成功,并且在此流级别的每次执行都是替代方案,则不会执行其他执行,这将导致成功登录。

  2. 流的第二次执行查看Kerberos执行。 默认情况下,此身份验证器是禁用的,将被跳过。

  3. 第三次执行是身份提供商重定向器。 它可以通过行动>配置链接到自动重定向到另一个IdP身份经纪

  4. 下一次执行是一个称为表格。 由于此子流被标记为替代方案如果饼干身份验证类型通过。 此子流包含需要执行的其他身份验证类型。 加载此子流的执行,并出现相同的处理逻辑。

  5. Forms子流中的第一个执行是用户名密码表单。 此身份验证类型呈现用户名和密码页面。 它被标记为必需因此,用户必须输入有效的用户名和密码。

  6. Forms子流中的第二个执行是一个新的子流:浏览器-条件OTP子流。 因为这个子流是有条件的,是否执行取决于 对条件-用户配置执行。 如果是,则加载此子流的执行,并且发生相同的处理逻辑

  7. 下一次执行是条件-用户配置。 这将检查流中的其他执行是否为用户配置。 意味着浏览器-条件OTP只有当用户配置了OTP凭证时,才会执行子流程。

  8. 最终的执行是OTP表格。 这被标记为必需,但由于在有条件的子流,只有当用户 设置了OTP凭据。 如果不这样做,则用户将看不到OTP表单。

创建流程

本节更深入地解释流是如何工作的,以及如何创建自己的流。 请注意,有重要的功能和安全性 设计自己的流程时的注意事项。 创建错误的流程可能不会让任何人登录,让用户以比您更少的验证进入 喜欢,或者只是导致错误。

要创建流程,您可以:

  1. 复制,然后修改现有流程。 要执行此操作,请选择现有流程 (例如浏览器flow),然后按下复制按钮。 然后,这将要求您在创建新流之前为新流设置一个名称。

  2. 从头开始创建新流程。 要做到这一点,按新的按钮。 由于这是更一般的情况,我们将使用它作为我们的例子。

创建新流时,您必须创建顶层流

创建顶级流程

创建顶级流程

具有以下选项:

别名

流的名称。

描述

您可以设置为流的描述。

顶层流量类型

流的类型。 类型客户仅用于客户端 (应用程序) 的身份验证。 对于所有其他情况,请选择通用

一旦创建了流,除了新的复制按钮,你现在有了,删除,添加执行添加流

空的新流程

新流程

流的最终作用取决于流和子流的结构,这些流中的执行以及在 子流程和执行。

执行可以添加添加执行按钮。 执行可以执行多种操作,从发送重置电子邮件到验证OTP。 如果你把鼠标悬停在 旁边的工具提示 (微小的问号)提供者,这将描述执行的作用。

添加身份验证执行

创建身份验证执行

这些可以分为自动执行交互式执行自动执行类似于饼干执行,并将自动 当在流中遇到它们时,执行它们的动作。 交互式执行会停止流动,通常是为了获得一些用户输入。 执行的执行 成功将获得成功状态。 这很重要,因为这是流程是否成功的一部分。 例如,一个空的浏览器流量 不允许任何人登录。 为此,它将需要至少一个执行成功评估,例如用户名密码表单这是正确的 已填写并提交。

子流可以在顶层流中添加添加流按钮,它打开一个创建执行流程创建顶级表单 页。 唯一的区别是流量类型可以是通用(像以前一样),或者表格。 的表格类型用于构造一个子流,该子流生成 用户的单个表单,例如内置的表单注册流。 子流是一种特殊类型的执行,评估为成功 取决于它们包含的执行如何评估 (这包括对它们包含的子流的评估)。 以及这个评估的逻辑 取决于每个执行和子流的要求。

充分理解这一点需要更完整地解释需求在评估流时是如何工作的,这也适用于子流。 请参阅执行要求部分有关更多详细信息,请参见上方。

请注意,添加执行后,您应该检查需求是否设置为正确的值。 即使只有一个可能的要求,它 可能发生未设置的情况。

构造流时,添加到流中的所有元素都将具有行动右侧菜单。 添加到流中的所有元素都有一个删除 此菜单中的选项可将其从流程中删除。 执行可以包含配置菜单选项来配置执行,就像 身份提供商重定向器。 子流还可以添加执行和子流,其添加执行添加流菜单选项。

最后,由于执行顺序很重要,因此您可以使用向上和向下按钮在执行和子流各自的流中上下移动 设置在他们名字的左边。

创建无密码浏览器登录流程

为了说明流的创建,本节介绍更高级的浏览器登录流的创建。 此流程的目的是允许 用户在使用无密码方式登录之间进行选择网络认证,以及带有密码和OTP的双因素身份验证。 创建的流程类似于标准浏览器登录,但是在到达用户名选择时会有所不同。 然而,你不会复制流程,而是 从一开始创建流程:

  • 选择一个领域,点击身份验证链接

  • 选择 “新建”,并给新流程一个独特的别名,即 “浏览器无密码”

  • 选择 “添加执行”,然后使用下拉菜单选择 “Cookie”。 按下 “保存” 后,将其要求设置为替代方案

  • 选择 “添加执行”,然后使用下拉菜单选择 “Kerberos”。

  • 选择 “添加执行”,然后使用下拉菜单选择 “身份提供程序重定向器”。 按下 “保存” 后,将其要求设置为替代方案

  • 选择 “添加流”,然后选择代表性别名,例如 “Forms”。 按下 “保存” 后,将其要求设置为替代方案

与浏览器流共同的部分

无密码浏览器登录通用

  • 使用行动菜单在 “表单” 子流的右侧,选择 “添加执行”。 使用下拉选择 “用户名表单”。 按下 “保存” 后,将其要求设置为必需

用户名形式类似于 “浏览器” flow的用户名密码形式,但仅要求提供用户名,从而允许用户执行无密码登录。 但是,请注意,这不可避免地允许对您的Keycloak服务器进行用户枚举攻击。 为了方便起见,这是不可避免的安全风险, 因此,流程应该确保攻击者不能只需要猜测密码就可以输入。

  • 使用行动菜单在 “表单” 子流的右侧,选择 “添加流”。 选择代表性别名,例如 “身份验证”。 按下 “保存” 后,将其要求设置为必需

  • 使用行动菜单在 “身份验证” 子流的右侧,选择 “添加执行”。 使用下拉选择 “Webauthn无密码认证器”。 按下 “保存” 后,将其要求设置为替代方案

  • 使用行动菜单在 “身份验证” 子流程的右侧,选择 “添加流程”。 选择具有代表性的别名,例如 “带OTP的密码”。 按下 “保存” 后,将其要求设置为替代方案

  • 使用行动菜单在 “使用OTP的密码” 子流的右侧,选择 “添加执行”。 使用下拉选择 “密码表格”。 按下 “保存” 后,将其要求设置为 “需要”。

  • 使用行动菜单在 “使用OTP的密码” 子流的右侧,选择 “添加执行”。 使用下拉选择 “OTP表格”。 按下 “保存” 后,将其要求设置为 “需要”。

  • 在 “绑定” 菜单中,将浏览器流程从 “浏览器” 更改为 “无浏览器密码”

产生的最终流如下:

无密码浏览器登录

无密码浏览器登录

输入用户名后,此流程的工作方式如下:

  • 如果用户记录了任何WebAuthn无密码凭据,则该用户将能够使用其中任何一个直接登录。 这是无密码登录。 用户可以选择 “使用OTP的密码”。 用户可以这样做,因为 “WebAuthn passworless” 执行和 “带有OTP的密码” 流量设置为替代方案。 他们准备好了吗必需用户必须输入WebAuthn、密码和OTP。

  • 如果用户选择尝试另一种方式在屏幕上链接带有 “WebAuthn passworless” 身份验证,用户可以在 “密码” 和 “安全密钥” (WebAuthn passworless)。 选择密码时,用户将需要继续并使用分配的OTP登录。 如果用户没有WebAuthn凭据,则必须首先输入 密码,然后是他的OTP。 如果用户没有OTP凭据,则将要求他记录一个。

重要的是要注意,由于WebAuthn无密码执行设置为替代方案而不是必需,此流程将永远不会要求用户注册WebAuthn凭据。 对于用户 要拥有Webauthn凭据,该用户必须具有管理员添加的必需操作。 首先通过确保Webauthn无密码注册 在领域中启用了所需的操作 (请参阅网络认证documentation),然后通过使用凭证重置a的一部分 用户的凭据管理菜单。

创建更高级的流程 (例如此流程) 可能会产生一些细微的副作用。 例如,如果要启用重置密码的功能 对于用户,则可以从密码表单访问。 在默认的 “重置凭据” 流程中,用户必须输入其用户名。 自 他已经在 “无浏览器密码” 流程中较早地输入了用户名,这对于Keycloak来说是不必要的,并且在用户方面是次优的 经验。 要纠正这一点,你可以:

  • 复制 “重置凭据” 流,将其名称设置为,例如 “重置无密码凭据”

  • 使用行动菜单右侧的 “选择用户” 执行,选择 “删除”

  • 在 “绑定” 菜单中,将重置凭证流从 “重置凭证” 更改为 “重置无密码凭证”

脚本验证器

不推荐使用通过管理控制台和REST端点上传脚本的功能。

有关更多详细信息,请参见JavaScript提供商

Kerberos

Keycloak支持通过SPNEGO协议使用Kerberos票证登录。 SPNEGO (简单且受保护的GSSAPI协商机制) 用于在用户之后通过web浏览器进行透明身份验证 登录时已通过身份验证-在他的会话中。 对于非web情况或登录期间票证不可用时,Keycloak还支持使用Kerberos用户名/密码登录。

web身份验证的典型用例如下:

  1. 用户登录到他的桌面 (例如Active Directory域中的Windows机器或启用了Kerberos集成的Linux机器)。

  2. 然后,用户使用他的浏览器 (IE/Firefox/Chrome) 访问由Keycloak保护的web应用程序。

  3. 应用程序重定向到Keycloak登录。

  4. Keycloak呈现HTML登录屏幕以及状态401和HTTP标头WWW-身份验证: 协商

  5. 如果浏览器从桌面登录具有Kerberos票证,则它将桌面登录信息传输到Keycloak 在标题中授权: 协商 'spnego-token'。 否则它只是显示登录屏幕。

  6. Keycloak从浏览器验证令牌并对用户进行身份验证。 它从LDAP提供用户数据 (如果LDAPFederationProvider支持Kerberos身份验证) 或让用户 更新他的个人资料和预填充数据 (在KerberosFederationProvider的情况下)。

  7. Keycloak返回到应用程序。 Keycloak和应用程序之间的通信是通过OpenID Connect或SAML消息进行的。 Keycloak通过Kerberos进行身份验证的事实对应用程序是隐藏的。 因此,Keycloak充当Kerberos/SPNEGO登录的经纪人。

对于设置,有3个主要部分:

  1. Kerberos服务器 (KDC) 的设置和配置

  2. Keycloak服务器的设置和配置

  3. 客户端机器的设置和配置

Kerberos服务器的设置

这是平台依赖的。 确切的步骤取决于您的操作系统和您要使用的Kerberos供应商。 有关如何准确设置和配置Kerberos服务器,请参阅Windows Active Directory,MIT Kerberos和您的操作系统文档。

至少你需要:

  • 将一些用户主体添加到您的Kerberos数据库中。 您还可以将Kerberos与LDAP集成,这意味着将从LDAP服务器配置用户帐户。

  • 为 “HTTP” 服务添加服务主体。 例如,如果您的Keycloak服务器将在www.mydomain.org您可能需要添加本金HTTP/www.mydomain.org@MYDOMAIN.ORG 假设我的域名。组织将是你的Kerberos领域。

    例如,在MIT Kerberos上,您可以运行 “kadmin” 会话。 如果您在MIT Kerberos所在的同一台计算机上,则可以简单地使用以下命令:

sudo kadmin。本地

然后添加HTTP主体,并使用以下命令将其密钥导出到keytab文件:

添加princ -randkey HTTP/www.mydomain.org@MYDOMAIN.ORG
ktadd -k /tmp/http.keytab HTTP/www.mydomain.org@MYDOMAIN.ORG

密钥标签文件/tmp/http.keytab需要在运行Keycloak服务器的主机上访问。

Keycloak服务器的设置和配置

您需要在您的机器上安装一个kerberos客户端。 这也是平台依赖的。 如果您使用的是Fedora,Ubuntu或RHEL,则可以安装软件包freeipa-客户端,其中包含一个Kerberos客户端和其他几个实用程序。 配置kerberos客户端 (在Linux上,它在文件中/etc/krb5.conf)。 您需要放置您的Kerberos领域,并至少配置您的服务器将运行的HTTP域。 对于示例领域MYDOMAIN.ORG,您可以配置域 _ 领域像这样的部分:

[领域 _ 领域]
  。我的域名。组织
  我的域名。组织

接下来,您需要使用HTTP主体导出keytab文件,并确保运行Keycloak服务器的进程可以访问该文件。 对于生产而言,如果仅通过此过程而不是其他人可读,则是理想的选择。 对于上面的MIT Kerberos示例,我们已经将keytab导出到/tmp/http.keytab。 如果您的KDC和Keycloak在同一台主机上运行, 你已经有那个文件了。

启用SPNEGO处理

Keycloak默认情况下没有打开SPNEGO协议支持。 所以,你必须去浏览器流程 并启用Kerberos

浏览器流程

浏览器流程

切换Kerberos要求来自禁用向任何一个替代方案或者必需替代方案基本上意味着Kerberos是可选的。 如果 用户的浏览器尚未配置为与SPNEGO/Kerberos一起使用,然后Keycloak将退回到常规登录屏幕。 如果您设置了要求 到必需那么所有用户都必须为他们的浏览器启用Kerberos。

配置Kerberos用户存储联合提供程序

现在,在身份验证服务器上打开了SPNEGO协议,您需要配置Keycloak如何解释Kerberos票证。 这是通过用户存储联盟。 我们有2个不同的联合联盟提供程序,支持Kerberos身份验证。

如果要使用LDAP服务器支持的Kerberos进行身份验证,则必须首先配置LDAP联合提供商。 如果您查看LDAP提供商的配置页面,您会看到Kerberos集成节。

LDAP Kerberos集成

ldap kerberos

打开开关允许Kerberos身份验证将使Keycloak使用Kerberos主体查找有关用户的信息,以便它可以 导入到Keycloak环境中。

如果您的Kerberos解决方案没有LDAP服务器的支持,则必须使用Kerberos用户存储联合提供程序。 去用户联合 左侧菜单项并选择Kerberos添加提供程序选择框。

Kerberos用户存储提供商

kerberos提供商

此提供程序解析Kerberos票证以获取简单的主体信息,并对本地Keycloak数据库进行少量导入。 未提供诸如名字,姓氏和电子邮件之类的用户个人资料信息。

客户端机器的设置和配置

客户端需要安装kerberos客户端并如上所述设置krb5.conf。 此外,他们需要在浏览器中启用SPNEGO登录支持。 见为Kerberos配置火狐如果你正在使用那个浏览器。 URI。mydomain.org必须在网络.negotiate-auth.trusted-uris配置选项。

在Windows域中,客户端通常不需要配置任何特殊内容,因为IE已经能够参与Windows域的SPNEGO身份验证。

示例设置

为了更轻松地使用Kerberos进行测试,我们提供了一些示例设置进行测试。

Keycloak和FreeIPA docker图像

一旦你安装码头工人,您可以在安装了FreeIPA服务器的情况下运行docker映像。 FreeIPA提供与MIT Kerberos和389 LDAP服务器等集成的安全解决方案。 该图像还提供了Keycloak 服务器配置了LDAP联合提供程序,并启用了针对FreeIPA服务器的SPNEGO/Kerberos身份验证。 查看详细信息这里

ApacheDS测试Kerberos服务器

对于快速测试和单元测试,我们使用一个非常简单的ApacheDSKerberos服务器。 您需要从源代码构建Keycloak,然后使用我们的测试套件中的maven-exec-plugin运行Kerberos服务器。 查看详细信息这里

证书授权

Kerberos 5支持证书委托的概念。 在这种情况下,您的应用程序可能希望访问Kerberos票证,以便 他们可以重新使用它与Kerberos保护的其他服务进行交互。 由于SPNEGO协议是在Keycloak服务器中处理的, 您必须将GSS凭据传播到您的应用程序 在从Keycloak服务器传输到您的应用程序的OpenID Connect令牌声明或SAML断言属性中。 要将此声明插入到令牌或断言中,每个应用程序都需要启用称为gss授权证书。 这在映射器应用程序的选项卡 客户端页面。 见协议映射器章节了解更多细节。

应用程序将需要反序列化它从Keycloak收到的声明,然后才能使用它对其他服务进行GSS调用。 将凭据从访问令牌反序列化为GSSCredential对象后,将需要使用此凭据创建GSSContext 传递给方法GSSManager。创建文本例如,像这样:

// 在您的应用程序中获取accessToken。
KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) servletReq.getUserPrincipal();
AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken();

// 从accessToken检索kerberos凭证并反序列化
字符串序列化目标 = (字符串) accessToken.Getother声称 ()。
    获取 (org.keycloak.com mon.常量.KerberosConstants.GSS_DELEGATION_CREDENTIAL);

GSSCredential反序列化GSSCredential = org.keycloak.com mon.util.KerberosSerializationUtils.
    反序列化 (serializedGssCredential);

// 创建GSSContext来调用其他kerberos安全的服务
GSSContext上下文 = gssManager.createContext (服务名称,krb5Oid,
    deserializedGssCredential,GSSContext.DEFAULT_LIFETIME);

我们有一个例子,详细展示了这一点。 它在示例/kerberos在Keycloak示例分发或演示分发下载中。 您也可以直接查看示例来源这里

请注意,您还需要配置可转发kerberos门票在krb5.conf将对委托凭据的支持归档并添加到浏览器中。

凭据委派有一些安全隐患,因此仅在确实需要时才使用它。 强烈建议与HTTPS一起使用。 参见示例这篇文章有关更多详细信息。

跨领域信任

在Kerberos V5协议中,境界是在Kerberos数据库 (通常是LDAP服务器) 中定义的一组Kerberos主体。 Kerberos协议具有跨领域信任的概念。 例如,如果有2个kerberos领域A和B,则跨领域信任 将允许来自领域A的用户访问领域B的资源 (服务)。这意味着领域B信任领域A。

Kerberos跨领域信任

kerberos信任基础

Keycloak服务器支持跨领域信任。 要实现这一目标,需要做的事情很少:

  • 为跨领域信任配置Kerberos服务器。 此步骤取决于所使用的具体Kerberos服务器实现。 通常,需要添加Kerberos主体krbtgt/B @ A到领域A和B的Kerberos数据库。需要 这个主体在两个Kerberos领域都有相同的键。 这通常是在主体具有相同密码,密钥版本号的情况下实现的 这两个领域都有相同的密码。 建议查阅Kerberos服务器文档以获取更多详细信息。

默认情况下,跨领域信任是单向的。 如果您希望双向信任具有领域A也信任领域B, 您还必须添加本金krbtgt/A @ B到两个Kerberos数据库。 但是,默认情况下,信任是可传递的。 如果领域B 信任领域A,领域C信任领域B,那么领域C自动信任领域A,不需要有本金krbtgt/C @ A 可用。 一些附加配置 (例如capaths) 可能需要在Kerberos客户端进行配置,以便 客户端能够找到信任路径。 有关更多详细信息,请参阅Kerberos文档。
  • 配置Keycloak服务器

    • 如果您使用具有Kerberos支持的LDAP存储提供程序,则需要为此配置领域B的服务器主体 示例:HTTP/mydomain.com @ B。如果您希望来自领域A的用户到 成功对Keycloak进行身份验证,因为Keycloak服务器必须能够执行SPNEGO流,然后找到用户。 例如,kerberos主要用户约翰 @ A必须作为LDAP DN下的用户在LDAP中可用 例如uid = 约翰,ou = 人,dc = 例子,dc = com。 如果您希望来自领域A和B的两个用户都进行身份验证,则需要确保 LDAP能够从A和B两个领域找到用户。我们希望在以后的版本中改进此限制,因此您可以 有可能为单独的领域创建更多单独的LDAP提供程序,并确保SPNEGO对这两个领域都有效。

    • 如果您使用Kerberos用户存储提供程序 (通常是没有LDAP集成的Kerberos),则需要配置 服务器主体asHTTP/mydomain.com @ B并且来自Kerberos领域A和B的用户都应该能够进行身份验证。

对于Kerberos用户存储提供程序,建议kerberos领域之间没有冲突的用户。 如果 存在冲突的用户,它们将被映射到同一个Keycloak用户。 这也是我们想要改进的东西 未来版本,并提供一些从Kerberos主体到Keycloak用户名的更灵活的映射。

故障排除

如果您有问题,我们建议您启用其他日志记录来调试问题:

  • 启用调试Kerberos或LDAP联盟提供程序的管理控制台中的标志

  • 为类别启用跟踪日志记录组织。Keycloak在日志记录部分独立/配置/独立.xml接收更多信息独立/日志/服务器。日志

  • 添加系统属性-Dsun.security.krb5.debug = true-Dsun.security.spnego.de bug = true

X.509客户端证书用户身份验证

如果服务器配置为相互SSL身份验证,则Keycloak支持使用X.509客户端证书登录。

典型的工作流程如下:

  • 客户端通过SSL/TLS通道发送身份验证请求

  • 在SSL/TLS握手期间,服务器和客户端交换其x.509/v3证书

  • web容器 (部署Keycloak的反向代理或WildFly) 验证证书PKIX路径和证书过期

  • x.509客户端证书验证器如下验证客户端证书:

    • 可选地使用CRL和/或CRL分发点检查证书吊销状态

    • 可选地使用OCSP (在线证书状态协议) 检查证书吊销状态

    • 可选地验证证书中的密钥使用情况是否与预期的密钥使用情况匹配

    • 可选地验证证书中的扩展密钥使用是否与预期的扩展密钥使用相匹配

  • 如果上述任何检查失败,则x.509身份验证失败

  • 否则,身份验证器将提取证书标识并将其映射到现有用户

  • 一旦将证书映射到现有用户,行为就会根据身份验证流程而有所不同:

    • 在浏览器流程中,服务器提示用户确认身份或忽略身份,而是使用用户名/密码登录

    • 在直接授权流的情况下,服务器在用户中签名

请注意,验证证书PKIX路径是web容器的责任。 X.509上的身份验证器 Keycloak端仅提供检查证书过期,证书吊销状态和密钥使用的额外支持。 如果你是 使用部署在反向代理后面的Keycloak,确保您的反向代理配置为验证PKIX路径。 如果你 不要使用反向代理,并且用户直接访问WildFly,您应该可以,因为WildFly确保PKIX路径经过验证 如下所述配置。

特征

支持的证书身份源
  • 使用正则表达式匹配SubjectDN

  • X500主题的电子邮件属性

  • X500主题的电子邮件来自主题替代名称扩展 (RFC822Name通用名称)

  • X500主题的其他名称来自主题替代名称扩展名。 这通常是UPN (用户主体名称)

  • X500主题的通用名称属性

  • 使用正则表达式匹配IssuerDN

  • 证书序列号

  • 证书序列号和问题编号

  • SHA-256证书指纹

  • PEM格式的完整证书

正则表达式

可以使用正则表达式作为过滤器从主题DN或发行方DN中提取证书标识。 例如,下面的正则表达式将匹配电子邮件属性:

电子邮件地址 = (。*?) (?:,|$)

正则表达式过滤仅在身份来源设置为使用正则表达式匹配SubjectDN或者使用正则表达式匹配IssuerDN

将证书标识映射到现有用户

证书身份映射可以配置为将提取的用户身份映射到现有用户的用户名或电子邮件,或者映射到与证书身份匹配的值的自定义属性。 例如,设置身份来源主题的电子邮件用户映射方法用户名或电子邮件将使X.509客户端证书验证器使用证书主题DN中的电子邮件属性作为搜索条件,以通过用户名或电子邮件查找现有用户。

请注意,如果我们禁用使用电子邮件登录在领域设置中,相同的规则将应用于证书身份验证。 换句话说,用户将无法使用电子邮件属性登录。
的用法证书序列号和问题编号作为身份源,需要两个自定义属性-一个用于序列号,另一个用于IssuerDN。
SHA-256证书指纹是SHA-256证书指纹的小写十六进制表示。
的用法PEM格式的完整证书由于身份源仅限于映射到外部联合源如LDAP的自定义属性。 您必须启用始终从LDAP读取值在这种情况下,因为由于长度限制,证书无法存储在Keycloak数据库中。
其他功能: 扩展证书验证
  • 使用CRL进行撤销状态检查

  • 使用CRL/分发点进行撤销状态检查

  • 使用OCSP/响应者URI进行撤销状态检查

  • 证书密钥使用验证

  • 证书扩展密钥使用验证

启用X.509客户端证书用户身份验证

以下各节介绍如何配置WildFly/Undertow和Keycloak服务器以启用X.509客户端证书身份验证。

在WildFly中启用相互SSL

启用SSL有关如何在WildFly中启用SSL的说明。

  • 打开KEYCLOAK_HOME/standalone/configuration/standalone.xml并添加一个新的领域:

<安全领域>
    <安全领域 名称=ssl领域>
        <服务器身份>
            <ssl>
                <密钥库 路径=服务器证书
                          相对于=jboss.server.config.dir
                          密钥库-密码=服务器密码/>
            </ssl>
        </服务器身份>
        <身份验证>
            <信任商店 路径=信任商店。jks
                        相对于=jboss.server.config.dir
                        密钥库-密码=信任存储密码/>
        </身份验证>
    </安全领域>
</安全领域>
ssl/密钥库

ssl元素包含密钥库定义如何从JKS密钥库加载服务器公钥对的元素

ssl/密钥库/路径

通往JKS密钥库的路径

ssl/密钥库/相对

定义密钥库路径相对于

ssl/密钥库-密码

打开密钥库的密码

ssl/密钥库/别名(可选)

密钥库中条目的别名。 如果密钥库包含多个条目,请设置它

ssl/密钥库/密钥-密码(可选)

私钥密码,如果与密钥库密码不同。

身份验证/信任存储

定义如何加载信任存储以验证入站/传出连接的远程端提供的证书。 通常,信任商店包含受信任的CA证书的集合。

身份验证/信任存储/路径

JKS密钥库的路径,其中包含受信任的CAs (证书颁发机构) 的证书

身份验证/信任存储/相对

定义truststore路径相对于

身份验证/信任存储/密钥存储-密码

打开信任商店的密码

启用https监听

HTTPS监听有关如何在WildFly中启用HTTPS的说明。

  • 添加 <https-listener> 元素,如下所示:

<子系统 xmlns=urn:jboss: 域: undertow:12.0>
        ....
    <服务器 名称=默认服务器>
            <https-监听器 名称=默认
                        套接字-绑定=https
                        安全领域=ssl领域
                        验证-客户端=请求/>
    </服务器>
</子系统>
https-监听器/安全-领域

该值必须与上一节中的领域名称匹配

https-侦听器/验证-客户端

如果设置为请求,服务器将可选地要求提供客户端证书。 将属性设置为必需如果未提供客户端证书,则服务器将拒绝入站连接。

将X.509客户端证书身份验证添加到浏览器流

  • 选择一个领域,点击身份验证链接,选择 “浏览器” 流程

  • 复制内置的 “浏览器” 流程。 您可能想给新流程一个独特的名称,即 “X.509浏览器”

  • 使用下拉菜单,选择复制的流程,然后单击 “添加执行”

  • 使用下拉菜单选择 “X509/验证用户名表单”,然后单击 “保存”

x509执行

  • 使用向上/向下箭头,通过将其移至 “浏览器表单” 执行上方来更改 “X509/验证用户名表单” 的顺序,并将要求设置为 “替代”

x509浏览器流程

  • 选择 “绑定” 选项卡,找到 “浏览器流程” 的下拉列表。 从下拉菜单中选择新创建的X509浏览器流程,然后单击 “保存”。

x509浏览器流绑定

配置X.509客户端证书身份验证

x509配置

用户身份来源

定义如何从客户端证书中提取用户身份。

启用规范DN表示(可选)

定义是否使用规范格式来确定可分辨的名称。 格式在官方有详细描述Java API文档。 此选项仅影响两个用户身份来源使用正则表达式匹配SubjectDN使用正则表达式匹配IssuerDN。 如果您设置了新的Keycloak实例,建议启用此选项。 禁用此选项,以保持beckward与现有Keycloak实例兼容。

启用序列号十六进制表示(可选)

使用序列号的十六进制表示的选项。 见RFC5280,截面-4.1.2.2。 符号位设置为1的序列号应保留00个八位位组。 如: 具有十进制值的序列号161,或者a1在根据RFC5280的十六进制表示中,必须编码为00a1。 可以找到更多详细信息:RFC5280,附录-B

正则表达式(可选)

定义一个正则表达式,用作提取证书标识的过滤器。 正则表达式必须包含单个组。

用户映射方法

定义如何将证书标识与现有用户匹配。 用户名或电子邮件将通过用户名或电子邮件搜索现有用户。 自定义属性映射器将使用与证书标识匹配的自定义属性搜索现有用户。 自定义属性的名称是可配置的。

用户属性的名称(可选)

一个自定义属性,该值将与证书标识匹配。 当属性映射与多个值相关时,多个自定义属性是相关的,例如 “证书序列号和issuerdn”。

强烈建议此处使用的属性对于用户是只读的。 默认情况下,只有用户证书属性由Keycloak只读。 如果使用不同的属性名称,则可能需要将其添加到只读属性列表中。 请参阅中的详细信息威胁模型缓解章节
启用CRL检查(可选)

定义是否使用证书吊销列表检查证书的吊销状态。

启用CRL分发点检查证书吊销状态(可选)

定义是否使用CDP检查证书吊销状态。 大多数PKI机构在其证书中包含CDP。

CRL文件路径(可选)

定义包含CRL列表的文件的路径。 该值必须是有效文件的路径,如果启用CRL检查选项已打开。

OCSP检查已启用(可选)

定义是否使用在线证书状态协议检查证书吊销状态。

OCSP响应者URI(可选)

允许覆盖证书中OCSP响应器URI的值。

验证密钥使用(可选)

验证证书的KeyUsage扩展位是否已设置。 例如,“digitalSignature,KeyEncipherment” 将验证KeyUsage扩展中的位0和2是否被断言。 将参数保留为空,以禁用密钥使用情况验证。 见RFC5280,截面-4.2.1.3。 仅当发出的CA标记为严重且存在密钥使用扩展不匹配时,服务器才会引发错误。

验证扩展密钥使用(可选)

验证扩展密钥使用扩展中定义的一个或多个目的。 见RFC5280,截面-4.2.1.12。 将参数保留为空,以禁用扩展密钥使用验证。 仅当发出的CA标记为严重且存在密钥使用扩展不匹配时,服务器才会引发错误。

旁路身份确认

如果设置,X.509客户端证书身份验证将不会提示用户确认证书身份,并在成功验证后自动登录用户。

将X.509客户端证书身份验证添加到直接授权流中

  • 使用Keycloak管理控制台,单击 “身份验证”,然后选择 “直接授予” 流程,

  • 复制内置的 “直接赠款” 流程。 您可能希望给新流程起一个独特的名称,即 “X509直接授予”,

  • 删除 “用户名验证” 和 “密码” 身份验证器,

  • 单击 “添加执行” 并添加 “X509/验证用户名”,然后单击 “保存” 以将执行步骤添加到父流中。

x509直接授权执行

  • 更改要求必需

x509直接授权流程

  • 按照前面在x.509浏览器流程部分中描述的步骤设置x509身份验证配置。

  • 选择 “绑定” 选项卡,找到 “直接授权流” 的下拉列表。 从下拉菜单中选择新创建的X509直接授权流程,然后单击 “保存”。

x509 directgrant流绑定

客户端证书查找

当直接向Keycloak服务器发送HTTP请求时,WildFly undertow子系统将建立SSL握手并提取客户端证书。 然后将客户端证书保存到属性中javax.servlet.request.X509Certificate的HTTP请求,如servlet规范中指定的。 然后,Keycloak X509身份验证器将能够从此属性查找证书。

但是,当Keycloak服务器在负载平衡器或反向代理后面侦听HTTP请求时,可能是代理服务器提取客户端证书并建立相互的SSL连接。 反向代理通常将经过身份验证的客户端证书放在基础请求的HTTP头中,然后将其转发到后端Keycloak服务器。 在这种情况下,Keycloak必须能够从HTTP标头而不是从HTTP请求的属性中查找X.509证书链,就像对Undertow所做的那样。

如果Keycloak位于反向代理后面,则通常需要配置x509cert-lookupKEYCLOAK_HOME/standalone/configuration/standalone.xml中的SPI 连同默认提供程序,它从HTTP头查找证书,我们还有两个额外的内置提供程序:haproxy阿帕奇,接下来将对其进行描述。

HAProxy证书查找提供程序

当您的Keycloak服务器位于HAProxy反向代理后面时,您可以使用此提供程序。 像这样配置服务器:

<spi 名称=x509cert-lookup>
    <默认提供程序>haproxy</默认提供程序>
    <提供者 名称=haproxy 已启用=>
        <属性>
            <属性 名称=sslClientCert =SSL_CLIENT_CERT/>
            <属性 名称=sslCertChainPrefix =证书链/>
            <属性 名称=证书链长度 =10/>
        </属性>
    </提供者>
</spi>

在此示例配置中,将从HTTP标头中查找客户端证书,SSL_CLIENT_CERT,并且将从HTTP标头中查找其链中的其他证书,例如证书 _ 链条 _ 0,证书 _ 链条 _ 1,&hellip;,证书 _ 链条 _ 9。 属性证书链长度是链的最大长度,因此最后一个尝试的属性将是证书 _ 链条 _ 9

有关如何配置客户端证书和客户端证书链的HTTP标头及其专有名称的详细信息,请参阅HAProxy文档。

Apache证书查找提供程序

当您的Keycloak服务器位于Apache反向代理后面时,您可以使用此提供程序。 像这样配置服务器:

<spi 名称=x509cert-lookup>
    <默认提供程序>阿帕奇</默认提供程序>
    <提供者 名称=阿帕奇 已启用=>
        <属性>
            <属性 名称=sslClientCert =SSL_CLIENT_CERT/>
            <属性 名称=sslCertChainPrefix =证书链/>
            <属性 名称=证书链长度 =10/>
        </属性>
    </提供者>
</spi>

配置与haproxy提供商。 查阅Apache文档mod_sslmod_headers有关如何配置客户端证书和客户端证书链的HTTP标头及其专有名称的详细信息。

Nginx证书查找提供程序

当您的Keycloak服务器位于Nginx反向代理后面时,您可以使用此提供程序。 像这样配置服务器:

<spi 名称=x509cert-lookup>
    <默认提供程序>nginx</默认提供程序>
    <提供者 名称=nginx 已启用=>
        <属性>
            <属性 名称=sslClientCert =ssl-客户端-证书/>
            <属性 名称=sslCertChainPrefix =无用/>
            <属性 名称=证书链长度 =2/>
        </属性>
    </提供者>
</spi>
NGINXSSL/TLS模块不会公开客户端证书链,因此Keycloak NGINX证书查找提供程序正在使用密钥斗篷信任商店。 请使用keytool CLI填充Keycloak truststore,其中包括重建客户端证书链所需的所有根和中间CA。

有关如何配置客户端证书的HTTP标头的详细信息,请参阅NGINX文档。 NGINX配置文件示例:

 ...
 服务器 {
    ...
    ssl_client_certificate trusted-ca-list-for-client-auth.pem;
    ssl_verify_client optional_no_ca;
    ssl_verify_depth 2;
    ...
    位置/{
      ...
      代理 _ 集 _ 头ssl-客户端-证书 $ ssl_client_escaped_cert;
      ...
    }
    ...
}
trusted-ca-list-for-client-auth.pem中的所有证书都必须添加到密钥斗篷信任商店
其他反向代理实现

我们没有对其他反向代理实现的内置支持。 但是,有可能使其他反向代理以类似于阿帕奇或者haproxy并且可以使用其中一些提供商。 如果这些都不起作用,您可能需要创建自己的实现org.keycloak.services.x509.X509ClientCertificateLookupFactory组织。Keycloak。服务。x509.X509ClientCertificateLookup提供商。 请参阅服务器开发指南有关如何添加自己的提供商的详细信息。

故障排除

转储HTTP头

如果要查看反向代理发送给Keycloak的内容,请启用请求倾倒处理器Undertow过滤器和咨询服务器。日志文件。

在日志记录子系统下启用跟踪日志记录
...
    <个人资料>
        <子系统 xmlns=urn:jboss: 域: 日志记录: 8.0>
...
            <记录器 类别=组织。密钥斗篷。身份验证器。x509>
                <级别 名称=痕迹/>
            </记录器>
            <记录器 类别=组织。Keycloak。服务。x509>
                <级别 名称=痕迹/>
            </记录器>
警告: 不要在生产中使用RequestDumpingHandler或跟踪日志记录。
使用X.509进行直接授权身份验证

以下模板可用于使用资源所有者密码凭据授予来请求令牌:

$ curl https:// [主机][: 端口]/auth/realms/master/protocol/openid-connect/token \
       -不安全 \
       -- 数据 “grant_type = 密码 & 范围 = openid配置文件 & 用户名 = & 密码 = & client_id = CLIENT_ID & client_secret = CLIENT_SECRET” \
       -电子/路径/到/客户端 _ 证书。crt \
       -密钥/路径/到/客户端 _ 证书。密钥
[主机][: 端口]

已配置为允许用户使用直接授权流使用x.509客户端证书进行身份验证的远程Keycloak服务器的主机和端口号。

客户id

客户端id。

客户 _ 秘密

对于机密客户,客户秘密; 否则,将其留空。

客户证书。阴极射线管

公钥证书,将用于在相互SSL身份验证中验证客户端的身份。 证书应该是PEM格式。

客户证书。密钥

公钥对中的私钥。 也期望以PEM格式。

W3C网络身份验证 (WebAuthn)

Keycloak提供了有限的支持W3C网络身份验证 (WebAuthn)。 Keycloak作为网络作者的作品依赖方 (RP)

请注意,WebAuthn支持仍在开发中,尚未完成,因此我们建议您通过实验使用此功能。 此外,此支持的规范和用户界面可能会更改。
WebAuthn的操作是否成功取决于用户的WebAuthn支持身份验证器,浏览器和平台。 如果您使用此WebAuthn支持,请说明这些实体在多大程度上支持WebAuthn规范。

设置

WebAuthn支持2FA的设置过程如下:

启用网络验证器注册

管理员对管理控制台:

  • 打开身份验证 → 所需的操作tab。

  • 点击注册

  • 选择网络注册作为所需的操作

  • 标记已启用复选框。 可选标记默认操作如果您希望所有新创建的用户都需要注册WebAuthn凭据,请选中复选框。

将WebAuthn身份验证添加到浏览器流
  • 选择一个领域,点击身份验证链接,选择浏览器流量

  • 复制内置的 “浏览器” 流程。 您可能想给新流程一个独特的名称,例如 “WebAuthn浏览器”

  • 使用下拉列表,选择复制的流

  • 删除WebAuthn浏览器浏览器-条件OTP使用its的子流行动菜单

如果您想让所有用户都需要WebAuthn:

  • 使用行动的菜单WebAuthn浏览器表单,点击添加执行

  • 选择网络认证器使用下拉菜单并单击保存

  • 将其要求设置为必需

需要webauthn浏览器流程

  • 绑定菜单,将浏览器流程更改为WebAuthn浏览器

请注意,在这种情况下,如果用户没有WebAuthn凭据,则将设置强制该用户的必需操作 注册一个。

或者,您可以让用户仅在注册了WebAuthn凭据的情况下才使用WebAuthn登录,因此无需添加 的网络认证器执行:

  • 使用行动的菜单WebAuthn浏览器表单,点击添加流

  • 将别名设置为 “条件2FA”,然后单击保存

  • 设置要求有条件的2FA有条件的

  • 使用行动的菜单有条件的2FA,点击添加执行

  • 选择条件-用户配置使用下拉菜单并单击保存

  • 设置要求条件-用户配置执行到必需

  • 使用行动的菜单有条件的2FA,点击添加执行

  • 选择网络认证器使用下拉菜单并单击保存

  • 将其要求设置为替代方案

webauthn浏览器流条件

您还可以允许用户在使用WebAuthn和OTP作为他的第二个因素之间进行选择:

  • 使用行动的菜单有条件的2FA,点击添加执行

  • 选择OTP表格使用下拉菜单并单击保存

  • 将其要求设置为替代方案

基于OTP的webauthn浏览器流

使用WebAuthn身份验证器进行身份验证

注册weauthn认证器后,用户执行以下操作 假设上面的身份验证流配置与条件子流使用网络认证器被使用:

  • 打开登录表单。 用户必须使用用户名和密码进行身份验证。

  • 用户的浏览器要求用户通过其WebAuthn身份验证器进行身份验证。

以管理员身份管理WebAuthn

管理凭据

WebAuthn凭据的管理方式与其他凭据 (例如OTP) 类似,来自用户凭证管理:

  • 可以为用户分配所需的操作,以从重置动作列表,并选择网络注册

  • 管理员可以通过按以下方式删除WebAuthn凭据删除

  • 管理员可以通过选择显示数据&hellip;

  • 管理员可以通过在用户标签字段并保存数据。

管理策略

管理员可以将WebAuthn相关操作配置为WebAuthn策略每个领域。

管理员对管理控制台:

  • 打开身份验证 → 网络验证策略tab。

  • 配置项目并单击保存

下面是可配置项目及其描述。

配置 描述

依赖方实体名称

作为WebAuthn依赖方的人类可读服务器名称。 这是一个强制配置,它应用于注册WebAuthn身份验证器的操作。 默认设置为 “keycloak”。 有关更多详细信息,请参见WebAuthn规范

签名算法

它告诉WebAuthn认证器使用哪些签名算法公钥凭证可用于签名和验证身份验证断言。 可以指定多种算法。 如果没有指定算法,ES256是适应的。 默认设置为es256。 这是一个可选的配置项,应用于注册WebAuthn身份验证器的操作。 有关更多详细信息,请参见WebAuthn规范

依赖方ID

这是作为WebAuthn依赖方的ID,并确定公钥凭据的范围。 它必须是起源的有效域。 这是一个可选的配置项,应用于注册WebAuthn身份验证器的操作。 如果未输入任何条目,则修改Keycloak服务器的基本URL的主机部分。 有关更多详细信息,请参见WebAuthn规范

认证运输偏好

它告诉浏览器上的WebAuthn API实现 (WebAuthn客户端) 如何生成证明语句的偏好。 这是一个可选的配置项,应用于注册WebAuthn身份验证器的操作。 如果未选择任何选项,则其行为与选择 “无” 相同。 有关更多详细信息,请参见WebAuthn规范

验证器附件

它告诉WebAuthn客户端WebAuthn身份验证器的可接受的附件模式。 这是一个可选的配置项,应用于注册WebAuthn身份验证器的操作。 如果未选择任何选项,则WebAuthn客户端不考虑附件模式。 有关更多详细信息,请参见WebAuthn规范

需要常驻密钥

它告诉WebAuthn认证器生成公钥凭证为客户端驻留公钥凭证源。 这是一个可选的配置项,应用于注册WebAuthn身份验证器的操作。 如果未选择任何选项,则其行为与选择 “否” 相同。 有关更多详细信息,请参见WebAuthn规范

用户验证要求

它告诉WebAuthn身份验证器确认实际验证用户。 这是一个可选的配置项,应用于注册WebAuthn身份验证器和由WebAuthn身份验证器对用户进行身份验证的操作。 如果未选择任何选项,则其行为与选择 “首选” 相同。 有关更多详细信息,请参见注册WebAuthn认证器的WebAuthn规范用于通过WebAuthn身份验证器对用户进行身份验证的WebAuthn规范

超时

它指定以秒为单位的超时值,用于注册WebAuthn身份验证器并通过WebAuthn身份验证器对用户进行身份验证。 如果设置为0,则其行为取决于WebAuthn身份验证器的实现。 默认值为0。 有关更多详细信息,请参见注册WebAuthn认证器的WebAuthn规范用于通过WebAuthn身份验证器对用户进行身份验证的WebAuthn规范

避免相同的验证者注册

如果设置为 “ON”,则无法新注册已经注册的WebAuthn身份验证器。 这应用于注册WebAuthn身份验证器的操作。 默认设置为 “关”。

可接受的AAGUIDs

可以注册WebAuthn身份验证器的AAGUID的白名单。 这应用于注册WebAuthn身份验证器的操作。 如果未在此列表中设置任何条目,则可以注册任何WebAuthn身份验证器。

证明声明验证

注册weauthn身份验证器时,Keycloak会验证此weauthn身份验证器生成的证明语句。 在此验证过程中,Keycloak验证了此证明声明的可信度。 它需要信任锚的证书。 Keycloak使用密钥斗篷信任商店因此,您需要提前将这些证书导入到其中。

如果要省略此证明语句可信赖性验证,请禁用此信任商店或将WebAuthn策略的配置项 “证明传递首选项” 设置为 “无”。

以用户身份管理WebAuthn凭据

注册网络认证器

注册WebAuthn身份验证器的适当方法取决于用户是否已经在Keycloak上注册了帐户。

新用户

如果网络注册所需操作设置为默认操作在一个领域,新用户需要 第一次成功登录后设置WebAuthn安全密钥。 新用户执行以下操作:

  • 打开登录表单。

  • 单击注册链接。

  • 填写登记表上的项目,然后点击注册

  • 用户的浏览器要求用户注册他们的WebAuthn认证器。

  • 成功注册后,用户的浏览器要求用户输入文本作为他们刚刚注册的WebAuthn认证器的标签。

现有用户

如果网络认证器如第一个示例所示按要求设置,然后当现有用户尝试登录时, 他们被要求自动注册其WebAuthn认证器:

  • 打开登录表单。

  • 填写项目,点击保存并点击登录

  • 当用户登录时,他们需要注册其WebAuthn身份验证器。

  • 成功注册后,用户的浏览器要求用户输入文本作为他们刚刚注册的WebAuthn认证器的标签。

无密码WebAuthn和双因素

WebAuthn通常用于双因素身份验证,但是可能需要将其用作第一因素身份验证。 在这种情况下, 具有以下功能的用户无密码WebAuthn凭据将能够在没有密码的情况下对Keycloak进行身份验证。 Keycloak允许使用WebAuthn 作为无密码和双因素身份验证机制在单个领域的上下文中甚至在单个身份验证流的上下文中。

管理员通常可能要求用户为WebAuthn无密码身份验证注册的安全密钥必须满足不同的 (通常更强) 的要求。 例如,这些安全密钥可能要求用户使用PIN对该安全密钥进行身份验证,或者 安全密钥应通过更强的证书授权进行证明。

由于这种情况,Keycloak允许管理员配置单独的WebAuthn无密码策略。 有一个单独的必需操作 类型Webauthn无密码注册和单独的类型认证器WebAuthn无密码认证器

设置

WebAuthn无密码支持的设置过程如下:

  • 为WebAuthn无密码支持注册新的必需操作。 使用与所述相同的步骤以上 唯一的区别是,您需要注册名为Webauthn无密码注册

  • 配置策略。 您可以使用与所述相同的步骤和配置选项以上,但是你 需要在选项卡的管理控制台中配置它们WebAuthn无密码策略。 您可以根据需要配置此策略,但是 通常,对安全密钥的要求将比对双因素策略的要求更强。 例如用户验证要求可以 设置为必需当您配置无密码策略时。

  • 最后配置身份验证流程。 让我们假设我们将使用相同的流,称为WebAuthn浏览器如所述 以上,但是 我们将如下配置:

    • WebAuthn浏览器表单子流将包含用户名表单作为第一个验证者。 删除默认值用户名密码表单 验证器并添加用户名表单相反,身份验证器。 此设置意味着用户将仅提供其用户名作为第一步。

    • 将有一个必需的子流,可以将其命名为例如无密码或双因素。 此设置表示用户可以 使用无密码WebAuthn凭据或双因素身份验证进行身份验证。

    • 流将包含WebAuthn无密码认证器作为第一种选择。

    • 第二个替代方案将是一个名为例如密码和双因素网络认证。 此子流将包含一个密码表格和 a网络认证器

流的最终配置将如下所示:

webauthn无密码流

您现在可以添加WebAuthn无密码注册作为Keycloak已知的某些用户所需的操作来测试此操作。 在第一次身份验证期间,仍将要求用户使用密码和第二因素WebAuthn凭据。 然而,有一次 用户注册凭据,该用户将能够 在将来的身份验证期间进行选择。 如果他使用他或她的WebAuthn无密码凭证,他将不需要 提供密码和第二因素WebAuthn凭据。

条件流中的条件

正如中提到的执行要求,条件执行只能包含在有条件的子流。 如果全部条件执行评估为true,则有条件的子流充当必需。 您可以在有条件的子流。 如果某些执行包括在有条件的子流评估为false,则整个子流被视为禁用

可用条件

条件-用户角色

此执行具有确定用户是否具有以下定义的角色的能力用户角色场。 如果用户具有所需的角色,则将执行视为true,并评估其他执行。 管理员必须定义以下字段:

别名

描述执行的名称,该名称将显示在身份验证流中。

用户角色

用户应该执行此流程的角色。 要指定应用程序角色,语法为应用名称。批准(例如我的应用程序。我的角色)。

条件-用户配置

这将检查流中的其他执行是否为用户配置。 执行要求部分包括OTP表单的示例。

条件-用户属性

这将检查用户是否已设置所需的属性。 有可能否定输出,这意味着用户不应该拥有该属性。 的用户属性部分显示了如何添加自定义属性。 您可以提供以下字段:

别名

描述执行的名称,该名称将显示在身份验证流中。

属性名称

要检查的属性的名称。

期望属性值

属性中的期望值。

否定输出

您可以否定输出。 换句话说,属性不应该存在。

显式拒绝/允许条件流中的访问

您可以允许或拒绝对条件流中的资源的访问。 两个验证者拒绝访问允许访问通过条件控制对资源的访问。

允许访问

身份验证器将始终成功进行身份验证。 此验证器不可配置。

拒绝访问

访问将始终被拒绝。 您可以定义一条错误消息,该消息将显示给用户。 您可以提供以下字段:

别名

描述执行的名称,该名称将显示在身份验证流中。

错误消息

将显示给用户的错误消息。 错误消息可以作为特定消息或属性提供,以便将其用于本地化。 (即“你没有角色 “管理员”。",我的财产否认在消息属性中) 为定义为属性的默认消息留空访问-拒绝

这是一个示例,如何拒绝所有没有该角色的用户的访问角色1并显示由属性定义的错误消息deny-role1。 此示例包括条件-用户角色拒绝访问执行。

浏览器流程

拒绝访问流

条件-用户角色配置

拒绝访问角色条件

的配置拒绝访问真的很容易。 您可以指定一个任意的别名和所需的消息,如下所示:

拒绝访问执行cond

最后一件事是在登录主题中定义带有错误消息的属性消息属性(对于英语):

deny-role1 = 你没有必要的角色!

SSO协议

本章简要概述了身份验证协议以及Keycloak身份验证服务器 它保护的应用程序与这些协议交互。

OpenID连接

OpenID连接(OIDC) 是一种身份验证协议,它是OAuth 2.0。 虽然OAuth 2.0只是构建授权协议的框架,并且主要是不完整的,但OIDC是一个成熟的身份验证和授权 协议。 OIDC还大量使用Json网络令牌(JWT) 一套标准。 这些标准定义了一个 身份令牌JSON格式和以紧凑和网络友好的方式对数据进行数字签名和加密的方法。

使用OIDC时,实际上有两种类型的用例。 第一个是要求Keycloak服务器进行身份验证的应用程序 他们的用户。 成功登录后,应用程序将收到身份令牌和一个访问令牌。 的身份令牌 包含有关用户的信息,例如用户名,电子邮件和其他个人资料信息。 的访问令牌由数字签名 领域,并包含访问信息 (如用户角色映射),应用程序可以用来确定用户的资源 被允许在应用程序上访问。

第二类用例是想要访问远程服务的客户端的用例。 在这种情况下,客户询问Keycloak 以获得访问令牌它可以用来代表用户在其他远程服务上调用。 Keycloak对用户进行身份验证 然后要求用户同意向请求它的客户端授予访问权限。 然后,客户端接收访问令牌。 这个访问令牌 由王国数字签名。 客户端可以使用此功能对远程服务进行REST调用访问令牌。 休息服务 提取访问令牌,验证令牌的签名,然后根据令牌内的访问信息决定是否处理 请求。

OIDC授权流程

OIDC有不同的方式让客户端或应用程序验证用户并接收身份访问令牌。 其中 您使用的路径在很大程度上取决于请求访问的应用程序或客户端的类型。 所有这些流程都在 OIDC和OAuth 2.0规范,因此此处仅提供简要概述。

授权代码流

这是一个基于浏览器的协议,我们建议您使用它来对基于浏览器的应用程序进行身份验证和授权。 它使 大量使用浏览器重定向来获取身份访问令牌。 这是一个简短的摘要:

  1. 浏览器访问应用程序。 应用程序注意到用户未登录,因此它将浏览器重定向到Keycloak 要进行身份验证。 应用程序在此浏览器重定向中传递回调URL (重定向URL) 作为查询参数 该密钥斗篷将在完成身份验证后使用。

  2. Keycloak对用户进行身份验证,并创建一个一次性的、非常短暂的临时代码。 Keycloak 使用前面提供的回调URL重定向回应用程序,并额外添加临时代码 作为回调URL中的查询参数。

  3. 应用程序提取临时代码,并从band REST调用到Keycloak制作背景 将代码换成身份,访问刷新令牌。 一旦这个临时代码被使用了一次 为了获得令牌,它永远不能再使用。 这样可以防止潜在的重放攻击。

重要的是要注意访问代币通常寿命很短,通常仅在几分钟后过期。 额外的刷新 通过登录协议传输的令牌允许应用程序在到期后获取新的访问令牌。 这个 在系统受损的情况下,刷新协议很重要。 如果访问令牌寿命很短,整个系统只有 在访问令牌的生命周期内容易受到被盗令牌的攻击。 如果管理员 已撤销访问权限。 这使得事情更加安全和更具可扩展性。

这一流程的另一个重要方面是公众与a机密客户。 机密需要客户 在他们将临时代码交换为令牌时提供客户端机密。 公众客户端不需要提供此客户端机密。 公众只要严格执行HTTPS,并且您对为 客户。 HTML5/JavaScript客户端始终必须公众客户端,因为无法在安全的情况下将客户端秘密传输给他们 方式。 同样,只要您使用HTTPS并严格执行重定向URI注册,这就可以了。 本指南更详细 在管理客户章。

Keycloak还支持可选代码交换的证明密钥规格。

隐式流

这是一个基于浏览器的协议,类似于授权代码流,只是请求更少,不涉及刷新令牌。 我们不推荐这种流程,因为仍然有可能访问令牌在传输令牌时泄露在浏览器历史记录中 通过重定向uis (见下文)。 另外,由于此流程不会为客户端提供刷新令牌,因此访问令牌必须 寿命长,否则用户将不得不在过期时重新进行身份验证。 支持此流,因为它在OIDC和OAuth 2.0规范中。 以下是该协议的简要摘要:

  1. 浏览器访问应用程序。 应用程序注意到用户未登录,因此它将浏览器重定向到Keycloak 要进行身份验证。 应用程序在此浏览器重定向中传递回调URL (重定向URL) 作为查询参数 该密钥斗篷将在完成身份验证后使用。

  2. Keycloak对用户进行身份验证,并创建一个身份访问令牌。 Keycloak 使用前面提供的回调URL重定向回应用程序,并另外添加身份访问令牌作为回调URL中的查询参数。

  3. 应用程序提取身份访问来自回调URL的令牌。

资源所有者密码凭证授权 (直接访问授权)

这在管理控制台中称为直接访问赠款。 想要代表用户获取令牌的REST客户端使用此功能。 它是一个包含 用户的凭据以及客户端的id和客户端的秘密 (如果它是机密客户端)。 用户的凭据 在表单参数内发送。 HTTP响应包含 身份,访问,以及刷新代币。

客户凭证授予

这也被REST客户端使用,但不是获得代表工作的令牌 外部用户的令牌是根据与客户端关联的服务帐户的元数据和权限创建的。 更多信息以及示例在服务账户章。

设备授权授权

这被运行在连接互联网的设备上的客户端使用,这些设备的输入能力有限或缺乏合适的浏览器。 以下是该协议的简要摘要:

  1. 应用程序请求Keycloak设备代码和用户代码。 Keycloak创建设备代码和用户代码。 Keycloak向应用程序返回包括设备代码和用户代码的响应。

  2. 该应用程序向用户提供用户代码和验证URI。 用户访问要通过使用其他浏览器进行身份验证的验证URI。

  3. 应用程序反复轮询Keycloak以了解用户是否完成了用户授权。 如果用户身份验证完成,应用程序将设备代码交换为身份,访问刷新令牌。

客户端发起的反向通道身份验证授权

这由希望通过直接与OpenID提供程序通信而无需通过用户浏览器 (如OAuth 2.0的授权码授权) 重定向来启动身份验证流程的客户端使用。 以下是该协议的简要摘要:

  1. 客户端请求Keycloak标识客户端发出的身份验证请求的auth_req_id。 Keycloak创建auth_req_id。

  2. 收到此auth_req_id后,此客户端需要反复轮询Keycloak以从Keycloak获取访问令牌,刷新令牌和ID令牌,以返回auth_req_id,直到用户通过身份验证为止。

管理员可以将客户端发起的反向通道身份验证 (CIBA) 相关操作配置为CIBA政策每个领域。

也请参考其他地方的Keycloak文档,如反向通道身份验证端点部分保护应用程序和服务指南和客户端发起的反向通道身份验证授予部分保护应用程序和服务指南。

CIBA政策

管理员对管理控制台:

  • 打开认证 → CIBA策略tab。

  • 配置项目并单击保存

下面是可配置项目及其描述。

配置 描述

反向通道令牌传递模式

指定CD (消费设备) 如何获取身份验证结果和相关令牌。 有三种模式,“投票” 、 “ping” 和 “推送”。 Keycloak只支持 “轮询” 和 “ping” 模式。 默认设置为 “轮询”。 此配置用作客户端的默认模式,但是每个客户端都可以覆盖该模式。 有关更多详细信息,请参见CIBA规格

自接收到身份验证请求以来,“auth_req_id” 的过期时间 (以秒为单位)。 默认设置为120。 此配置是必需的。 有关更多详细信息,请参见CIBA规格

间隔

CD (消费设备) 在向令牌端点轮询请求之间需要等待的时间间隔 (以秒为单位)。 默认设置为5。 此配置是可选的。 有关更多详细信息,请参见CIBA规格

身份验证请求的用户提示

识别被请求身份验证的最终用户的方式。 默认设置是 “login_hint”。 有三种模式,“login_hint” 、 “login_hint_token” 和 “id_token_hint”。 Keycloak只支持 “login_hint”。 此配置是必需的。 有关更多详细信息,请参见CIBA规格

提供程序设置

CIBA赠款使用以下两个提供商。

  1. 身份验证通道提供者: 通过AD (身份验证设备) 提供Keycloak与实际对用户进行身份验证的实体之间的通信。

  2. 用户解析器提供程序: 获取用户模型的Keycloak从客户端提供的信息中识别用户。

Keycloak具有两个默认提供程序。 但是,管理员需要像这样设置身份验证渠道提供者:

<spi 名称=ciba-授权-频道>
    <默认提供程序>ciba-http-auth-channel</默认提供程序>
    <提供者 名称=ciba-http-auth-channel 已启用=>
        <属性>
            <属性 名称=httpAuthenticationChannelUri =https://backend.internal.example.com/auth/>
        </属性>
    </提供者>
</spi>

下面是可配置项目及其描述。

配置 描述

httpAuthenticationChannelUri

指定通过AD (身份验证设备) 对用户进行实际身份验证的实体的URI。

身份验证通道提供程序

CIBA标准文档未指定如何通过AD对用户进行身份验证。 因此,它可以由产品自行决定实施。 Keycloak将此身份验证委托给外部身份验证实体。 为了与身份验证实体进行通信,Keycloak提供了身份验证通道提供程序。

它对Keycloak的实现假定身份验证实体在Keycloak的管理员的控制下,以便Keycloak信任身份验证实体。 不建议使用Keycloak的管理员无法控制的身份验证实体。

身份验证通道提供程序作为SPI提供程序,以便Keycloak的用户可以实现自己的提供程序,以满足他们的环境。 Keycloak提供了它的默认提供程序,称为HTTP身份验证通道提供程序,它使用HTTP与身份验证实体进行通信。

如果Keycloak用户的用户想要使用HTTP身份验证通道提供程序,他们需要知道它与Keycloak和由以下两部分组成的身份验证实体之间的契约。

身份验证委托请求/响应

Keycloak向身份验证实体发送身份验证请求。

身份验证结果通知/确认

身份验证实体将身份验证的结果通知给Keycloak。

身份验证委托请求/响应包括以下消息:

认证委托请求

该请求从Keycloak发送到身份验证实体,以要求其通过AD进行用户身份验证。

[后委托 _ 接待]
  • 标题

名称 描述

内容类型

应用程序/json

消息正文是json格式的。

授权

不记名 [令牌]

当身份验证实体将身份验证的结果通知给Keycloak时,使用 [令牌]。

  • 参数

类型 名称 描述

路径

委派 _ 接待

身份验证实体提供的用于接收委托请求的端点

  • 身体

名称 描述

登录提示

它告诉由AD进行身份验证的身份验证实体。
默认情况下,它是用户的 “用户名”。
此字段是必需的,并由CIBA标准文档定义。

范围

它告诉身份验证实体从经过身份验证的用户获得哪些范围的同意。
此字段是必需的,并由CIBA标准文档定义。

需要 _ 同意 _

它显示身份验证实体是否需要获得身份验证用户关于范围的同意。
此字段是必填项。

绑定 _ 消息

其值旨在显示在CD和AD的UI中,以使用户识别AD的身份验证是由CD触发的。
此字段是可选的,由CIBA标准文档定义。

acr_values

它告诉来自CD的请求身份验证上下文类引用。
此字段是可选的,由CIBA标准文档定义。

除上述参数外,发送到反向通道身份验证端点的任何自定义参数也将转发给通道提供程序。

认证委托响应

响应从认证实体返回到Keycloak,以通知认证实体从Keycloak接收到认证请求。

  • 回应

HTTP状态码 描述

201

它通知Keycloak接收到身份验证委托请求。

身份验证结果通知/ACK由以下消息组成。

认证结果通知

身份验证实体将身份验证请求的结果发送到Keycloak。

POST /auth/realms/[领域]/协议/openid-connect/ext/ciba/auth/回调
  • 标题

名称 描述

内容类型

应用程序/json

消息正文是json格式的。

授权

不记名 [令牌]

[令牌] 必须是身份验证实体在身份验证委托请求中从Keycloak收到的令牌。

  • 参数

类型 名称 描述

路径

境界

领域名称

  • 身体

名称 描述

状态

它通过AD告诉用户身份验证的结果。
它必须是以下状态之一。
成功: AD认证已成功完成。
未经授权: AD的身份验证尚未完成。
已取消: 用户已取消AD的身份验证。

认证结果确认

响应从Keycloak返回到身份验证实体,以通知Keycloak从身份验证实体接收到AD的用户身份验证结果。

  • 回应

HTTP状态码 描述

200

它通知认证实体接收到认证结果的通知。

用户解析器提供程序

即使同一用户,其表示形式也可能在每个CD,Keycloak和身份验证实体中有所不同。

对于CD,Keycloak和身份验证实体来识别同一用户,此用户解析器提供程序将在它们之间转换自己的用户表示。

用户解析器提供程序作为SPI提供程序,以便Keycloak的用户可以实现自己的提供程序,以满足他们的环境。 Keycloak提供了其默认提供程序,称为默认用户解析器提供程序,该程序具有以下特征。

  • 仅支持登录提示参数,并用作默认值。

  • 用户名Keycloak中的UserModel用于表示CD上的用户,Keycloak和身份验证实体。

OIDC注销

OIDC具有与注销机制相关的三种不同规范,所有这些规范目前处于草稿状态:

同样,由于所有这些都在OIDC规范中进行了描述,因此我们在此仅进行简要概述。

会话管理

这是一个基于浏览器的注销。 应用程序定期从Keycloak获取会话状态信息。 当会话在Keycloak终止时,应用程序将注意到并触发它自己的注销。

Frontchannel注销

这也是基于浏览器的注销。 与基于会话管理的注销方法相反,Keycloak将发送注销 向客户提出请求。 应用程序或客户端需要在Keycloak注册一个frontchannel logot URL。 在Keycloak触发注销后,它将向这些注册的url发送注销请求,这些url将终止客户端会话。

反向通道注销

这是一个非基于浏览器的注销,它使用Keycloak和客户端之间的直接反向通道通信。 Keycloak向登录Keycloak的所有客户端发送包含注销令牌的HTTP POST请求。 这些 请求被发送到Keycloak的注册反向通道注销url,并且应该在客户端触发注销。

密钥斗篷服务器OIDC URI端点

以下是Keycloak发布的OIDC端点列表。 如果您使用非Keycloak客户端适配器来 与auth服务器交谈OIDC。 这些都是相对的URL,URL的根是HTTP(S) 协议,主机名,通常以 /授权,例如https:// localhost:8080/auth。

您还可以在您的领域设置中的 “OpenID端点配置” 下找到这些端点。

/领域/{领域名称}/协议/openid-connect/auth

这是URL端点,用于在授权代码流中获取临时代码或用于通过 隐式流或混合流。

/领域/{领域名称}/协议/openid-连接/令牌

这是授权代码流将临时代码转换为令牌或获取令牌的URL端点 直接通过资源所有者密码凭据 (直接访问授权) 或客户端凭据。

/领域/{领域名称}/协议/openid-连接/注销

这是执行注销的URL端点。

/领域/{领域名称}/协议/openid-connect/userinfo

这是OIDC规范中描述的用户信息服务的URL端点。

/realms/{realm-name}/protocol/openid-connect/revoke

这是OAuth 2.0令牌撤销的URL端点RFC7009

/领域/{领域名称}/协议/openid-connect/证书

这是JSON Web密钥集 (JWKS) 的URL端点,其中包含用于验证任何JSON Web令牌 (jwks_uri) 的公钥

/领域/{领域名称}/协议/openid-connect/auth/设备

这是获取设备代码和用户代码的设备授权授予的URL端点。

/领域/{领域名称}/协议/openid-connect/ext/ciba/auth

这是客户端发起的反向通道身份验证授权的URL端点,用于获取标识客户端发出的身份验证请求的auth_req_id。

/realms/{领域名称}/协议/openid-connect/注销/反向通道-注销

这是OIDC规范中描述的用于执行反向通道注销的URL端点。

在所有这些替换中{领域名称}用王国的名字。

SAML

SAML 2.0是与OIDC相似的规范,但更古老,更成熟。 它的根源是肥皂和过多的 WS-* 规格,因此它往往比OIDC更冗长。 SAML 2.0主要是一种身份验证协议 通过在身份验证服务器和应用程序之间交换XML文档来工作。 XML签名和加密 用于验证请求和响应。

使用SAML时,实际上有两种类型的用例。 第一个是要求Keycloak服务器进行身份验证的应用程序 他们的用户。 成功登录后,应用程序将收到一个XML文档,其中包含 称为SAML断言的东西,它指定有关用户的各种属性。 此XML文档由 领域,并包含访问信息 (如用户角色映射),应用程序可以用来确定用户的资源 被允许在应用程序上访问。

第二类用例是想要访问远程服务的客户端的用例。 在这种情况下,客户询问Keycloak 要获得SAML断言,它可以用来代表用户在其他远程服务上调用。

SAML绑定

SAML定义了执行身份验证协议时交换XML文档的几种不同方式。 的重定向邮政绑定 覆盖基于浏览器的应用程序。 的ECP绑定涵盖REST调用。 还有其他绑定类型,但只有Keycloak 支持这三个。

重定向绑定

重定向绑定使用一系列浏览器重定向uri来交换信息。 这是一个粗略的概述 它是如何工作的。

  1. 用户访问应用程序,应用程序发现用户未通过身份验证。 它生成XML身份验证 请求文档,并将其编码为URI中的查询参数,用于重定向到Keycloak服务器。 根据您的设置,应用程序可能还会对此XML文档进行数字签名,并将此签名填充为查询 重定向URI中的参数到Keycloak。 此签名用于验证发送此签名的客户端 请求。

  2. 浏览器重定向到Keycloak。 服务器提取XML auth请求文档并验证 如果需要,数字签名。 然后,用户必须输入要进行身份验证的凭据。

  3. 身份验证后,服务器生成XML身份验证响应文档。 本文档包含 SAML断言,包含有关用户的元数据,例如名称,地址,电子邮件以及映射用户的任何角色 可能有。 此文档几乎总是使用XML签名进行数字签名,也可能是加密的。

  4. 然后将XML auth响应文档编码为重定向URI中的查询参数,该重定向URI使浏览器返回 到应用程序。 数字签名也作为查询参数包括在内。

  5. 应用程序接收重定向URI并提取XML文档并验证领域的签名以使 确定它正在接收有效的身份验证响应。 然后使用SAML断言中的信息使 访问决策或显示用户数据。

邮政装订

SAML邮政绑定的工作方式几乎与重定向绑定,但不是GET请求,而是XML 文件通过邮寄请求交换。 的邮政绑定使用JavaScript欺骗浏览器向 交换文档时的Keycloak服务器或应用程序。 基本上HTTP响应包含一个HTML文档 包含一个带有嵌入式JavaScript的HTML表单。 当页面加载时,JavaScript会自动调用表单。 你真的不需要知道这些东西,但这是一个非常聪明的把戏。

邮政由于安全性和大小限制,通常建议绑定。 使用时重定向SAML响应 是URL的一部分 (它是一个查询参数,如前所述),因此可以在日志中捕获它,并将其视为 不太安全。 关于大小,如果断言包含很多或很大的属性,则在HTTP有效负载内发送文档 总是比在更有限的URL中更好。

ECP

ECP代表 “增强型客户端或代理”,这是SAML v.2.0配置文件,允许在web浏览器的上下文中交换SAML属性。 这最常用于REST或基于SOAP的客户端。

工件绑定

SAML神器绑定与标准一起工作重定向或者邮政绑定。 这种绑定的目的是 以防止SAML消息通过浏览器传递。 当SAML消息将被发送到应用程序或Keycloak时,它将被保存,并在其位置发送一个重定向或包含唯一标识符的帖子 (这是工件)。 被联系方使用SOAP将包含工件的消息直接发送给发起者,发起者又通过SOAP回复保存的SAML消息。

此绑定可能具有一些安全优势,例如,当用户对SAML断言的内容不信任时。 相反,它们通过SOAP在应用程序和Keycloak之间交换。

密钥斗篷服务器SAML URI端点

Keycloak真的只有一个端点用于所有SAML请求。

http(s):// authserver.host/auth/realms/{realm-name}/protocol/saml

所有绑定都使用此端点。

OpenID连接与SAML

在OpenID Connect和SAML之间进行选择不仅仅是使用较新的协议 (OIDC) 而不是较旧的更成熟的协议 (SAML)。

在大多数情况下,Keycloak建议使用OIDC。

SAML往往比OIDC更冗长。

除了交换数据的冗长性之外,如果您比较规格,您会发现OIDC旨在与web配合使用,而SAML则经过改装以在web上工作。 例如,OIDC也更适合HTML5/JavaScript应用程序,因为它是 在客户端比SAML更容易实现。 由于令牌采用JSON格式, 它们更容易被JavaScript消费。 你还会发现几个不错的功能 使在web应用程序中实现安全性变得更加容易。 例如,查看iframe技巧规范用于轻松确定用户是否仍在登录。

SAML有它的用途。 当您看到OIDC规范不断发展时,您会看到它们实现了SAML多年来拥有的越来越多的功能。 我们经常看到的是,人们选择SAML而不是OIDC,因为他们认为它更成熟,也因为他们已经有了用它保护的现有应用程序。

Docker注册表v2身份验证

默认情况下禁用Docker身份验证。 要启用请参阅配置文件

Docker注册表V2身份验证是一种类似于OIDC的协议,用于针对Docker注册表对用户进行身份验证。 Keycloak对此协议的实现允许Docker客户端使用Keycloak身份验证服务器对注册表进行身份验证。 虽然该协议使用相当标准的令牌和签名机制,但它有一些皱纹,无法将其视为真正的OIDC实现。 最大的偏差包括请求和响应的非常特定的JSON格式,以及理解如何将存储库名称和权限映射到OAuth作用域机制的能力。

Docker Auth流程

Docker API文档最好地描述和说明此过程,但是下面将从Keycloak身份验证服务器的角度进行简要总结。

此流程假设码头工人登录已经执行命令
  • 当Docker客户端从Docker注册表请求资源时,流程开始。 如果资源受到保护,并且请求中没有auth令牌,则Docker registry服务器将使用401 + 一些有关所需权限以及在何处找到授权服务器的信息来响应客户端。

  • Docker客户端将基于来自Docker注册表的401响应来构造身份验证请求。 然后,客户端将使用本地缓存的凭据 (从先前运行的码头工人登录命令) 作为HTTP基本身份验证请求到Keycloak身份验证服务器。

  • Keycloak身份验证服务器将尝试对用户进行身份验证,并返回包含OAuth风格的承载令牌的JSON主体。

  • Docker客户端将从JSON响应中获取承载令牌,并在授权标头中使用它来请求受保护的资源。

  • 当Docker注册表从Keycloak服务器接收到带有令牌的受保护资源的新请求时,注册表将验证令牌并授予对所请求资源的访问权限 (如果适用)。

使用Docker协议成功进行身份验证后,不会在Keycloak端创建用户会话。 Docker协议是 在浏览器SSO会话中不使用,并且它无法刷新令牌或询问Keycloak服务器是否有特定令牌/会话 仍然有效。 因此,创建会话是该协议不必要的开销。 有关更多详细信息,请参见瞬态会话节。

Keycloak Docker注册表v2身份验证服务器URI端点

Keycloak实际上只有一个端点用于所有Docker auth v2请求。

http(s):// authserver.host/auth/realms/{realm-name}/protocol/docker-v2

管理客户

客户端是可以请求用户身份验证的实体。 客户有两种形式。 第一种类型的客户端是一个应用程序,它想要 参加单点登录。 这些客户只希望Keycloak为他们提供安全保障。 另一种类型 客户端是请求访问令牌的客户端,以便它可以代表经过身份验证的用户调用其他服务。 本节讨论围绕配置客户端的各个方面以及实现客户端的各种方法。

OIDC客户

OpenID连接是安全应用程序的首选协议。 它是从头开始设计的,对网络友好 并且与HTML5/JavaScript应用程序配合得最好。

要创建OIDC客户端,请转到客户左侧菜单项。 在这一页上,你会看到一个创建右边的按钮。

客户

客户

这将把你带到添加客户端页。

添加客户端

添加客户端oidc

客户端ID客户的。 这应该是一个简单的 字母数字字符串,将在请求和Keycloak数据库中用于标识客户端。 下一个选择openid-连接客户端协议下拉框。 最后输入您的基本网址 在根URL字段并单击保存。 这将创建客户端并将您带到客户端设置 tab。

客户端设置

客户端设置oidc

让我们在这个页面上浏览一下每个配置项。

客户端ID

这将指定一个字母数字字符串,该字符串将用作OIDC请求的客户端标识符。

名称

这是客户端在Keycloak UI屏幕中显示时的显示名称。 你可以本地化 通过设置替换字符串值即 ${myapp} 来获得此字段的值。 请参阅服务器开发指南 有关更多信息。

描述

这指定了客户端的描述。 这也可以是本地化的。

已启用

如果关闭此功能,将不允许客户端请求身份验证。

需要同意

如果打开,则用户将获得一个同意页面,该页面询问用户是否授予对该应用程序的访问权限。 它也会 显示客户端感兴趣的元数据,以便用户确切知道客户端访问的信息。 如果您曾经对Google进行过社交登录,则通常会看到类似的页面。 Keycloak提供了相同的功能。

访问类型

这定义了OIDC客户端的类型。

机密

机密访问类型适用于需要执行浏览器登录并在将访问代码转换为访问令牌时需要客户端机密的服务器端客户端, (见访问令牌请求在OAuth 2.0规范中了解更多细节)。 此类型应用于服务器端应用程序。

公众

公共访问类型适用于需要执行浏览器登录的客户端。 对于客户端应用程序,无法保护秘密。 相反,通过为客户端配置正确的重定向uri来限制访问非常重要。

仅限不记名

仅承载访问类型意味着应用程序只允许承载令牌请求。 如果打开此功能,则此应用程序无法参与浏览器登录。

启用标准流

如果启用此功能,则允许客户端使用OIDC授权代码流

隐式流启用

如果启用此功能,则允许客户端使用OIDC隐式流

启用直接访问授权

如果启用此功能,则允许客户端使用OIDC直接访问赠款

OAuth 2.0设备授权授权启用

如果启用此功能,则允许客户端使用OIDC设备授权授权

OpenID Connect客户端启动的反向通道身份验证授权已启用

如果启用此功能,则允许客户端使用OIDC客户端发起的反向通道身份验证授权

根URL

如果Keycloak使用任何已配置的相对url,则此值将预先添加到它们。

有效的重定向uri

这是必填字段。 输入URL模式,然后单击符号以添加。 单击要删除的url旁边的-符号。 请记住,您仍然必须单击保存按钮! 通配符 (*) 仅在URI末尾被允许,即http://host.com/*

注册有效的重定向URI模式时,您应该采取额外的预防措施。 如果你让 他们太笼统了,你很容易受到攻击。 见威胁模型缓解章 有关更多信息。

基本网址

如果Keycloak需要链接到客户端,则使用此URL。

管理网址

对于Keycloak特定的客户端适配器,这是客户端的回调端点。 Keycloak 服务器将使用此URI进行回调,例如推送撤销策略,执行反向通道注销以及其他 行政操作。 对于Keycloak servlet适配器,这可以是servlet应用程序的根URL。 有关更多信息,请参见保护应用程序和服务指南

网络起源

此选项围绕CORS代表跨源资源共享。 如果浏览器JavaScript试图向域名不同的服务器发出AJAX HTTP请求 JavaScript代码来自,那么请求必须使用CORS。 服务器必须以特殊方式处理CORS请求,否则浏览器将不会显示或允许处理请求。 该协议的存在是为了防止XSS、CSRF和其他基于JavaScript的攻击。

Keycloak支持已验证的CORS请求。 它的工作方式是,在 网络起源客户端的设置嵌入到发送到客户端应用程序的访问令牌中。 客户端 然后,应用程序可以使用此信息来决定是否允许在其上调用CORS请求。 这是 OIDC协议的扩展,因此只有Keycloak客户端适配器支持此功能。 见保护应用程序和服务指南有关更多信息。

填写网络起源数据,输入基本URL,然后单击符号添加。 单击要删除的url旁边的-符号。 请记住,您仍然必须单击保存按钮!

反向通道注销网址

当Keycloak通过以下方式接收注销请求时结束 _ 会话 _ 端点它将在此URL上发布反向通道注销请求,如 OpenID连接规范。 这会导致客户端自行注销。

需要反向通道注销会话

如果启用,则在发送反向通道注销请求时,会话id将包含在注销令牌中。 这导致仅注销特定会话。 如果禁用,则相应的所有会话 用户将被注销。

反向通道注销撤销脱机会话

如果启用,则撤销 _ 离线 _ 访问事件被添加到注销令牌中。 这应该会导致离线注销 带有反向通道注销请求的会话。 此事件不是由OpenID连接规范 将来可能会有所改变。 Keycloak本身会尊重撤销 _ 离线 _ 访问接收时在注销令牌中 反向通道注销请求。

高级设置

OAuth 2.0相互TLS证书绑定访问令牌启用

相互TLS将访问令牌和刷新令牌与在TLS握手期间交换的客户端证书绑定。 这可以防止找到窃取这些令牌的方法的攻击者行使令牌。 这种类型的令牌称为密钥持有者令牌。 与承载令牌不同,密钥持有者令牌的接收者可以验证令牌的发送者是否合法。

如果令牌请求满足以下条件,则Keycloak将使用客户端证书绑定访问令牌和刷新令牌,并将其作为密钥持有者令牌发行。 如果不满足所有条件,Keycloak将拒绝令牌请求。

  • 功能已打开

  • 令牌请求以授权码流或混合流的方式发送到令牌端点

  • 在TLS握手时,Keycloak请求客户端证书,客户端发送其客户端证书

  • 在TLS握手上,Keycloak成功验证客户端证书

要在Keycloak中启用相互TLS,请参见在WildFly中启用相互SSL

在以下情况下,Keycloak将验证客户端发送访问令牌或刷新令牌; 如果验证失败,Keycloak将拒绝令牌。

  • 令牌刷新请求通过密钥持有者刷新令牌发送到令牌端点

  • 使用密钥持有者访问令牌将UserInfo请求发送到UserInfo端点

  • 注销请求将使用密钥持有者刷新令牌发送到注销端点

请看相互TLS客户端证书绑定访问令牌有关更多详细信息,请在OAuth 2.0相互TLS客户端身份验证和证书绑定访问令牌中。

目前没有一个keycloak客户端适配器支持密钥持有者令牌验证。 相反,keycloak适配器当前将访问和刷新令牌视为承载令牌。

代码交换的证明密钥 (PKCE)

当攻击者窃取发给合法客户端的授权代码时,PKCE会阻止攻击者接收适用于该代码的令牌。

管理员可以选择以下三个选项:

代码交换代码挑战方法的证明键

  • (空白): 除非客户端将PKCE的参数适当地发送到Keycloak的授权端点,否则Keycloak不会应用PKCE。 这是默认设置。

  • S256 : Keycloak适用于代码质询方法为S256的客户端PKCE。

  • plain : Keycloak适用于代码挑战方法是plain的客户端PKCE。

签名和加密的ID令牌支持

Keycloak可以根据Json网络加密 (JWE)规格。 管理员可以确定每个客户端是否加密ID令牌。 默认情况下,此功能被禁用。

加密ID令牌的密钥称为内容加密密钥 (CEK)。 Keycloak和客户需要协商使用哪种CEK以及如何交付它。 这样做的方法称为密钥管理模式。

JWE规范确定了5种类型的密钥管理模式。 Keycloak支持其中的密钥加密。

在密钥加密中,客户端生成非对称密码学的密钥对。 公钥用于加密CEK。 Keycloak为每个ID令牌生成CEK,通过此生成的CEK加密ID令牌,并通过此客户端的公钥加密此CEK。 客户端通过其私钥解密此加密的CEK,并通过解密的CEK解密ID令牌。 因此,除客户端以外的任何一方都无法解密ID令牌。

客户端需要传递其公钥以将CEK加密到Keycloak上。 Keycloak支持从客户端提供的URL下载公钥。 客户端需要根据Json网络密钥 (JWK)规格。 这样做的方法定义在签署JWT保密客户凭证。 详细程序如下:

  • 打开客户端的钥匙选项卡

  • 切换JWKS网址到ON

  • 在上面输入提供URL的客户端公钥JWKS网址文本框

密钥加密的算法定义在Json网络算法 (JWA)规格。 Keycloak支持RSAES-PKCS1-v1_5(RSA1_5),使用默认参数 (rsa-oaep) 的RSAES OAEP,以及使用SHA-256和MFG1 (RSA-OAEP-256) 的RSAES OAEP 256。 选择该算法的详细过程如下:

  • 打开客户端的设置选项卡

  • 打开细颗粒OpenID连接配置

  • 选择RSA1_5,RSA-OAEP,或者RSA-OAEP-256来自ID令牌加密密钥管理算法下拉菜单

CEK的ID令牌加密算法也定义在JWA规格。 Keycloak支持AES_CBC_HMAC_SHA2算法和AES GCM算法。 选择该算法的详细过程如下:

  • 打开客户端的设置选项卡

  • 打开细颗粒OpenID连接配置

  • 从中选择算法ID令牌加密内容加密算法下拉菜单

OAuth 2.0推送的授权请求

的基本特征OAuth 2.0推送的授权请求已经得到支持。

有关PAR的更多详细信息,请参见PAR规格

有两个配置参数。 前者可以在每个客户端的高级设置上设置,以激活和停用PAR。

配置 描述

已启用推送授权请求

Boolean参数指示授权服务器是否仅通过推送的授权请求方法接受授权请求数据。

可以在每个领域的领域设置的令牌选项卡上设置后者,以确定PAR的请求URI的生存期。

配置 描述

推送授权请求的请求URI的生存期

表示请求URI的生存期 (以分钟或小时为单位) 的数字,默认值为1分钟。

保密客户凭证

如果你已经设置了客户的访问类型机密在客户的 设置标签,一个新的凭据选项卡将显示。 请注意,凭据仅选项卡 单击后显示保存设置屏幕底部的按钮,带有 机密访问类型。 作为处理此类客户端的一部分,您必须配置 客户端的凭据。

凭据选项卡

客户端凭据

客户端验证器列表框指定要用于机密客户的凭据类型。 它默认为客户端ID和secret。 秘密是自动为您和再生秘密 按钮允许您重新创建这个秘密,如果你想要或需要。

或者,您可以选择使用签名的Json Web令牌 (JWT) 或x509证书验证 (也称为相互TLS),而不是秘密。

签署JWT

客户端凭证jwt

选择此凭据类型时,您还必须在选项卡中为客户端生成私钥和证书钥匙。 私钥将用于对JWT进行签名,而证书则由服务器用于验证签名。

键选项卡

客户端oidc密钥

点击生成新密钥和证书按钮来启动此过程。

生成密钥

生成客户端密钥

当您生成这些密钥时,Keycloak将存储证书,您需要下载私钥 和证书供您的客户使用。 选择所需的存档格式并指定私钥的密码 和存储。

你也可以选择 通过外部工具生成这些,然后导入客户端的证书。

进口证书

导入客户端证书

您可以从中导入多种格式,只需选择存储证书的存档格式, 选择文件,然后单击导入按钮。

最后请注意,如果您选择使用JWKS网址。 在这种情况下,您可以在其中提供URL 客户端在JWK格式。 这是灵活的,因为当 客户端更改其密钥,Keycloak将自动下载它们,而无需在Keycloak端重新导入任何内容。

如果使用Keycloak适配器保护的客户端,则可以配置JWKS URL,例如https://myhost.com/myapp/ k_jwks假设https://myhost.com/myapp是 客户端应用程序的根URL。 见服务器开发指南有关更多详细信息。

出于性能目的,Keycloak缓存OIDC客户端的公钥。 如果你认为你的客户的私钥 被破坏了,更新密钥显然是好的,但清除密钥缓存也很好。 见清除缓存 部分了解更多详细信息。
与客户秘密签署JWT

如果您在客户端验证器列表框,您可以使用由客户端秘密签名的JWT而不是私钥。

此客户端机密将用于客户端对JWT进行签名。

X509证书

通过启用此选项,Keycloak将验证客户端在TLS握手期间是否使用了正确的X509证书。

此选项需要Keycloak中的相互TLS,请参见在WildFly中启用相互SSL
X509证书

x509客户端身份验证

验证程序还使用配置的regexp验证表达式检查证书的主题DN字段。 对一些人来说 用例,接受所有证书就足够了。 在这种情况下,您可以使用(。*?) (?: $)表情。

Keycloak有两种方法可以从请求中获取客户端ID。 第一个选项是客户id 查询中的参数 (在第2.2节中描述OAuth 2.0规范)。 第二种选择是供应客户id作为表单参数。

服务账户

每个OIDC客户端都有一个内置的服务账户这允许它获得访问令牌。 这被覆盖在OAuth 2.0规格下客户凭证授予。 要使用此功能,您必须设置访问类型你的客户机密。 当你这么做的时候, 的已启用服务帐户开关将出现。 你需要打开这个开关。 还要确保你有 配置您的客户端凭据

要使用它,您必须已经注册了有效的机密客户端,您需要检查开关已启用服务帐户在此客户端的Keycloak管理控制台中。 在选项卡中服务帐户角色您可以配置代表此客户端检索的服务帐户可用的角色。 请记住,您必须在角色范围映射 (选项卡) 中具有可用的角色范围) 也是这个客户的,除非你 有允许的全范围上。 与普通登录一样,访问令牌中的角色是以下内容的交集:

  • 特定客户端的角色范围映射与从链接客户端范围继承的角色范围映射相结合

  • 服务帐户角色

要调用的其余URL是/auth/realms/{领域名称}/协议/openid-connect/token。 在此URL上调用是POST请求,需要您发布客户端凭据。 默认情况下,客户端凭据由中客户端的clientId和clientSecret表示授权: 基本标头,但您也可以使用签名的JWT断言或任何其他用于客户端身份验证的自定义机制对客户端进行身份验证。 您还需要使用参数grant_type = 客户端 _ 凭据根据OAuth2规范。

例如,用于检索服务帐户的POST调用可以如下所示:

    发布/认证/领域/演示/协议/openid-连接/令牌
    授权: 基本cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ =
    内容类型: 应用程序/x-www-表单-urlencoded

    grant_type = 客户端 _ 凭据

回应会是这样标准JSON文档来自OAuth 2.0规范。

HTTP/1.1 200 OK
内容类型: 应用程序/json; 字符集 = UTF-8
缓存控制: 无存储
Pragma: 无缓存

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"bearer",
    “费用”: 60
}

默认情况下,唯一返回的访问令牌。 没有返回刷新令牌,也没有创建用户会话 默认情况下,在成功身份验证后的Keycloak端。 由于缺少刷新令牌,因此在访问令牌过期时需要重新进行身份验证, 但是,这并不意味着Keycloak服务器端有任何额外的开销,因为默认情况下不会创建会话。

因此,无需注销,但是可以通过将请求发送到所描述的OAuth2吊销端点来撤销已发布的访问令牌 在OpenID连接端点节。

观众支持

部署密钥斗篷的典型环境通常由一组机密或者公众客户 使用Keycloak进行身份验证的应用程序 (前端客户端应用程序)。

还有服务(称为资源服务器在OAuth 2规范中),它服务于来自前端客户端的请求 应用程序并提供资源。 这些服务通常需要访问令牌(不记名令牌) 将发送给他们 为特定请求进行身份验证。 此令牌以前是由前端应用程序尝试登录时获得的 对抗Keycloak。

在服务之间的信任度较低的环境中,您可能会遇到以下情况:

  1. 一个名为我的应用程序需要对Keycloak进行身份验证。

  2. 用户在Keycloak中进行身份验证。 然后,Keycloak向我的应用程序申请。

  3. 应用程序我的应用程序使用令牌调用服务邪恶服务。 应用程序需要调用邪恶服务作为 该服务能够提供一些非常有用的数据。

  4. 邪恶服务应用程序将响应返回到我的应用程序。 但是,与此同时,它保留了先前发送给它的令牌。

  5. 邪恶服务应用程序然后调用另一个名为良好的服务用以前保存的令牌。 调用 成功了良好的服务返回数据。 这导致破坏的安全性,因为邪恶服务滥用令牌 代表客户端访问其他服务我的应用程序

在许多服务之间高度信任的环境中,此流程可能不是问题。 然而,在其他环境中, 服务之间的信任度较低,这可能是有问题的。

在某些环境中,此示例工作流甚至可能被请求为邪恶服务可能需要检索 其他数据来自良好的服务为了能够正确地将请求的数据返回给原始调用者 (my-app客户端)。 您可能会注意到与Kerberos证书委托的相似之处。 与Kerberos证书授权一样,无限 观众是喜忧参半的,因为只有当服务之间存在高度信任时,观众才是有用的。 否则,它就是 建议限制观众,如下所述。 您可以限制观众,同时允许邪恶服务到 从良好的服务。 在这种情况下,您需要确保邪恶服务良好的服务 作为受众添加到令牌中。

为了防止如上例中的访问令牌的任何滥用,建议限制观众在令牌上并配置 您的服务来验证令牌上的受众。 如果这样做了,上面的流程将会改变,就像这样:

  1. 一个名为我的应用程序需要对Keycloak进行身份验证。

  2. 用户在Keycloak中进行身份验证。 然后,Keycloak向我的应用程序申请。 客户端应用程序 已经知道它将需要调用服务邪恶服务,所以它使用了范围 = 邪恶服务在身份验证请求中 发送到Keycloak服务器。 见客户端范围部分有关范围参数。 发行给我的应用程序客户包含受众,如“观众”: [“邪恶服务”],它声明 客户端希望使用此访问令牌仅调用服务邪恶服务

  3. 邪恶服务应用程序将请求送达了我的应用程序。 同时,它保留了先前发送给它的令牌。

  4. 邪恶服务应用程序然后调用良好的服务用以前保存的令牌。 调用不成功 因为良好的服务检查令牌上的观众,它会发现观众只是邪恶服务。 这是预期的行为 安全没有被破坏。

如果客户端想要调用良好的服务稍后,它将需要通过使用 范围 = 良好的服务。 然后,返回的令牌将包含良好的服务作为观众:

观众: [良好的服务]

并可用于调用良好的服务

设置

要正确设置观众检查:

  • 确保将服务配置为通过添加标志来检查发送给他们的访问令牌上的受众验证-令牌-观众 在适配器配置中。 见适配器配置有关详细信息。

  • 确保当Keycloak发布访问令牌时,它包含所有请求的受众,并且不包含任何 不需要的观众。 可以根据所述的客户端角色自动添加受众 在下一节或者它可以如所描述的那样硬编码下面

自动添加受众

在默认客户端范围内角色,有一个观众决心 协议映射器定义。 该协议映射器将检查当前令牌至少具有一个客户端角色的所有客户端 可用。 然后,每个客户端的客户端ID将自动添加为受众。 这在以下情况下特别有用 您的服务 (通常仅承载) 客户端依赖于客户端角色。

例如,让我们假设您有一个仅承载的客户端良好的服务和机密客户我的应用程序,你想要的 进行身份验证,然后使用为我的应用程序调用良好的服务休息服务。 如果以下情况 是真的:

  • 良好的服务客户端在其自身上定义了任何客户端角色

  • 目标用户已分配了至少一个客户端角色

  • 客户我的应用程序具有分配的角色范围映射

然后良好的服务将自动作为受众添加到为我的应用程序

如果要确保不会自动添加受众,请不要直接配置角色范围映射 在我的应用程序客户端,而是创建一个专用的客户端作用域,例如称为良好的服务,其中将包含角色范围映射 的客户端角色良好的服务客户。 假设此客户端作用域将作为可选客户端作用域添加到 的我的应用程序客户端,如果客户端明确请求,客户端角色和受众将被添加到令牌中范围 = 良好的服务参数。
前端客户端本身不会自动添加到访问令牌受众。 这允许容易区分 访问令牌和ID令牌,因为访问令牌将不包含作为受众发布令牌的客户端。 所以在 上面的例子,我的应用程序不会被添加为观众。 如果您需要客户本身作为受众,请参阅 硬编码观众选项。 但是,不建议将同一客户端用作前端和REST服务。
硬编码观众

对于您的服务依赖于领域角色或根本不依赖令牌中的角色的情况,使用硬编码可能会很有用 观众。 这是一个协议映射器,它会将指定服务客户端的客户端ID作为受众添加到令牌中。 你甚至可以使用任何自定义值,例如一些URL,如果你想要不同的受众而不是客户端ID。

您可以将协议映射器直接添加到前端客户端,但是将始终添加受众。 如果你想要更细的谷物 控件,您可以在专用客户端作用域上创建协议映射器,例如将调用良好的服务

观众协议映射器

观众映射器

  • 安装选项卡良好的服务客户端,您可以生成适配器 配置,您可以确认验证-令牌-观众选项将设置为true。 这表明适配器将 如果您使用此生成的配置,则需要验证受众。

  • 最后,您需要确保我的应用程序前端客户端可以请求良好的服务作为它的代币的观众。 在我的应用程序客户端,单击客户端范围tab。 然后分配良好的服务作为可选 (或默认) 客户端作用域。 见 客户端范围链接部分有关更多详细信息。

  • 你可以选择评估客户端范围并生成示例访问令牌。 如果你这样做了,请注意 那良好的服务仅在以下情况下才会添加到生成的访问令牌的受众中良好的服务包含在范围 参数在您将其分配为可选客户端作用域的情况下。

  • 在你的我的应用程序申请,您必须确保范围参数与值一起使用良好的服务当 您想要发出用于访问良好的服务。 请参阅参数转发部分,如果您的应用程序使用servlet 适配器,或javascript适配器部分,如果您的应用程序使用 javascript适配器。

如果您不确定令牌中的正确受众和角色是什么,则始终是一个好主意 评估客户端范围在管理控制台中,并围绕它做一些测试。
两者观众观众决心默认情况下,协议映射器仅将受众添加到访问令牌中。 ID令牌 通常仅包含单个受众,这是为其签发令牌的客户端ID。 这是一个要求 OpenID连接规范的。 另一方面,访问令牌不一定具有客户端的客户端ID, 除非有任何受众映射器添加了该令牌,否则该令牌是为其发行的。

SAML客户

Keycloak支持SAML 2.0对于注册的应用程序。 支持POST和重定向绑定。 您可以选择要求客户端签名验证,也可以让服务器签名和/或加密响应。

要创建SAML客户端,请转到客户左侧菜单项。 在这一页上,你会看到一个创建右边的按钮。

客户

客户

这将把你带到添加客户端页。

添加客户端

添加客户端saml

客户端ID客户的。 这通常是一个URL,并且将是预期的发行人发送的SAML请求中的值 通过应用程序。 下一个选择saml客户端协议下拉框。 最后输入客户端SAML端点URL。 输入 您希望Keycloak服务器发送SAML请求和响应的URL。 通常应用程序只有一个URL用于处理SAML请求。 如果您的应用程序具有不同的绑定url,请不要担心,您可以在设置客户端的选项卡。 点击保存。 这将创建客户端并将您带到客户端设置 tab。

客户端设置

客户端设置saml

客户端ID

此值必须与通过AuthNRequests发送的发行者值匹配。 Keycloak将从Authn SAML请求中拉出发行者,并通过此值将其与客户端匹配。

名称

这是客户端在Keycloak UI屏幕中显示时的显示名称。 你可以本地化 通过设置替换字符串值即 ${myapp} 来获得此字段的值。 请参阅服务器开发指南 有关更多信息。

描述

这指定了客户端的描述。 这也可以是本地化的。

已启用

如果关闭此功能,将不允许客户端请求身份验证。

需要同意

如果打开,则用户将获得一个同意页面,该页面询问用户是否授予对该应用程序的访问权限。 它也会 显示客户端感兴趣的元数据,以便用户确切知道客户端访问的信息。 如果您曾经对Google进行过社交登录,则通常会看到类似的页面。 Keycloak提供了相同的功能。

包括AuthnStatement

SAML登录响应可以指定使用的身份验证方法 (密码等) 以及登录和会话到期的时间戳。 这在默认情况下是启用的,这意味着AuthStatement元素将包含在登录响应中。 请注意,将此设置为关闭 将阻止客户端确定最大会话长度,这可能导致客户端会话永不到期。

强制伪影绑定

打开时,这将迫使Keycloak通过以下方式发送工件消息,而不是SAML消息邮政重定向, 即使客户端在登录期间没有要求绑定。 这必须在以下情况下设置神器绑定将与 国内流离失所者发起的登录。 要在注销期间也使用工件消息,还需要配置注销服务重定向绑定URL

签名文件

打开后,Keycloak将使用领域的私钥对文档进行签名。

优化重定向签名键查找

打开时,SAML协议消息将包括Keycloak 包含带有签名密钥ID的提示的本机扩展名。 当SP 了解此扩展,它可以将其用于签名验证,而不是 尝试使用所有已知密钥验证签名。 此选项仅适用于 在查询参数中传输签名的重定向绑定,其中 签名信息中没有此信息的位置 (与发布绑定消息相反,其中密钥ID始终包含在 文件签名)。 目前,这与以下情况有关: IDP和SP由Keycloak服务器和适配器提供。 这个 选项仅在以下情况下相关签名文件已打开。

签名断言

签名文件开关在整个文件上签名。 使用此设置,断言还将被签名并嵌入SAML XML Auth响应中。

签名算法

在签名SAML文档的多种算法之间进行选择。

SAML签名键名称

通过POST绑定发送的签名SAML文档包含签名密钥的标识关键字名称 元素。 默认情况下,它包含Keycloak密钥ID。 然而,各种供应商可能会 期望一个不同的键名或根本没有键名。 此开关控制是否关键字名称 包含密钥ID (选项密钥id),主题来自与领域密钥相对应的证书 (选项证书主题-例如由微软活动目录联盟 服务),或者从SAML消息中完全省略了密钥名称提示 (选项)。

规范化方法

XML签名的规范化方法

加密断言

使用领域的私钥加密SAML文档中的断言。 AES算法的密钥大小为128位。

需要客户签名

期望来自客户的文档已签名。 Keycloak将使用在钥匙tab。

力柱装订

默认情况下,Keycloak将使用原始请求的初始SAML绑定进行响应。 通过打开此开关,即使原始请求是重定向绑定,您也将强制Keycloak始终使用SAML POST绑定进行响应。

前通道注销

如果为true,则此应用程序需要浏览器重定向才能执行注销。 例如,应用程序可能需要重置cookie,这只能通过重定向来完成。 如果此开关为false,则Keycloak将调用后台SAML请求以注销应用程序。

强制名称ID格式

如果请求具有名称ID策略,请忽略它,并使用在管理控制台中以名称ID格式配置的值

名称ID格式

主题的名称ID格式。 如果请求中未指定名称ID策略,或者强制名称ID格式属性为true,则使用此值。 下面定义了用于每种格式的属性。 您可以更改NameID映射器使用的属性。

名称ID格式 使用的属性/属性 示例

用户名 (未指定)

用户名属性

示例 _ 用户

电子邮件

电子邮件属性

example_user@example.com

持久

saml.persistent.name.id.for.$ clientId属性

G-6e2a1050-0fc0-479b-bf6e-29cd3ccb373b

瞬态

不使用属性值和属性值

G-bfb85c10-57d7-4331-81bc-52f104599d79

根URL

如果Keycloak使用任何已配置的相对url,则此值将预先添加到它们。

有效的重定向uri

这是一个可选字段。 输入URL模式,然后单击符号以添加。 单击要删除的url旁边的-符号。 请记住,您仍然必须单击保存按钮! 通配符 (*) 仅在URI末尾被允许,即http://host.com/*. 当精确的SAML 未注册端点,并且Keycloak正在从请求中提取断言使用者URL。

基本网址

如果Keycloak需要链接到客户端,则将使用此URL。

主SAML处理网址

该URL将用于所有SAML请求,并且响应将定向到SP。 它将用作断言消费者服务URL和单个注销服务URL。 如果登录请求包含断言使用者服务URL,则将优先,但是此URL必须通过注册的有效重定向URI模式进行验证

断言消费者服务帖子绑定网址

发布断言消费者服务的绑定URL

断言消费者服务重定向绑定URL

为断言使用者服务重定向绑定URL

注销服务POST绑定URL

发布注销服务的绑定URL。

注销服务重定向绑定URL

为注销服务重定向绑定URL。

注销服务工件绑定URL

神器绑定注销服务的URL。 当与强制伪影绑定选项,神器登录和注销流都强制绑定。 神器除非设置了此属性,否则绑定不用于注销。

工件绑定URL

将HTTP工件消息发送到的URL。

工件解析服务

客户端SOAP端点的URL在哪里发送人工解决给的消息。

IDP发起登录

IDP启动的登录是一项功能,允许您在Keycloak服务器上设置一个端点,该端点将您登录到特定的应用程序/客户端。 在设置标签为您的客户端,您需要指定IDP发起的SSO URL名称。 这是一个简单的字符串,里面没有空格。 之后,您可以通过以下URL引用您的客户端:根/身份验证/领域/{领域}/协议/saml/客户端/{网址名称}

IDP发起的登录实施更喜欢邮政超过重定向绑定 (检查saml绑定有关更多信息)。 因此最终绑定和SP URL的选择方式如下:

  1. 如果具体的断言消费者服务帖子绑定网址是定义的 (内部细粒SAML端点配置科 客户端设置)邮政通过该URL使用绑定。

  2. 如果将军主SAML处理网址然后指定邮政通过这个通用网址再次使用绑定。

  3. 作为最后的手段,如果断言消费者服务重定向绑定URL已配置 (内部 细粒SAML端点配置)重定向绑定与该URL一起使用。

如果您的客户端需要特殊的中继状态,您也可以在设置选项卡中的IDP启动SSO继电器状态场。 或者,浏览器可以在中继状态查询参数,即 根/身份验证/领域/{领域}/协议/saml/客户端/{url-name}?中继状态 = 状态

使用时身份经纪,可以从 外部IDP。 如上所述,实际客户端是为在经纪人IDP处IDP发起的登录设置的。 外部国内流离失所者有 为应用程序设置客户端IDP发起的登录将指向指向代理的特殊URL和 代表中介IDP上选定客户端的IDP发起的登录端点。 这意味着在客户端设置中 在外部IDP:

  • IDP发起的SSO URL名称设置为将作为IDP启动的登录初始点发布的名称,

  • 断言消费者服务帖子绑定网址细粒SAML端点配置节有 要设置为以下URL: 代理根/身份验证/领域/{代理领域}/代理/{idp名称}/端点/客户端/{客户端id},其中:

    • 经纪人-根是基础代理URL

    • 经纪人领域是宣布外部IDP的经纪人领域的名称

    • 国内流离失所者-姓名是经纪人外部IDP的名称

    • 客户端-idIDP发起的SSO URL名称经纪人处定义的SAML客户端的属性。 它是 该客户端将可用于从外部IDP启动的IDP登录。

请注意,您可以将基本客户端设置从代理IDP导入外部IDP的客户端设置- 只需使用SP描述符可从中的身份提供程序的设置中获得 经纪IDP,并添加客户/客户端-id到端点URL。

SAML实体描述符

您可以通过标准SAML实体描述符XML文件导入SAML 2.0客户端,而不是手动注册SAML实体客户端。 有一个导入添加客户端页面上的选项。

添加客户端

添加客户端saml

单击选择文件按钮并加载您的实体描述符文件。 您应该查看那里的所有信息,以确保所有内容都正确设置。

一些SAML客户端适配器,如mod-auth-mellon需要IDP的XML实体描述符。 你可以通过 转到这个公共网址:根/身份验证/领域/{领域}/协议/saml/描述符

对于想要从一个客户端链接到另一个客户端的场景,Keycloak提供了一个特殊的重定向端点:/领域/realm_name/客户端/{客户端id}/重定向

如果客户端通过HTTP GET请求,Keycloak以HTTP 307(临时重定向) 通过响应的位置头。

因此,客户端只需要知道领域名称和客户端ID即可链接到它们。 这种间接方式有助于避免对客户端基础url进行硬编码。

举个例子,给定领域大师和客户端id账户:

http:// 主机: 端口/身份验证/领域/主/客户端/帐户/重定向

OIDC令牌和SAML断言映射

接收ID令牌、访问令牌或SAML断言的应用程序可能需要或想要不同的用户元数据和角色。 Keycloak允许您定义确切转移的内容。 您可以对角色、声明和自定义属性进行硬编码。 您可以将用户元数据拉入令牌或断言。 您可以重命名角色。 基本上,您可以完全控制返回客户端的内容。

在管理控制台中,如果您转到已注册的应用程序,则会看到映射器tab。 这是一个 基于OIDC的客户端。

映射器选项卡

映射器oidc

新客户端没有任何内置的映射器,但是它通常从客户端范围继承一些映射器,如所述 在客户端范围部分。 协议映射器将诸如电子邮件地址之类的东西映射到 身份和访问令牌中的特定声明。 他们的功能应该从他们的名字中自我解释。 那里 是未附加到您可以添加的客户端的其他预配置映射器 通过单击添加内置按钮。

每个映射器都有共同的设置以及其他设置,具体取决于您要添加的映射器类型。 单击编辑按钮 在列表中的映射器旁边,以进入配置屏幕。

映射器配置

映射器配置

了解config选项的最佳方法是将鼠标悬停在其工具提示上。

大多数OIDC映射器还允许您控制索赔的位置。 您可以选择在两个 id访问通过摆弄添加到ID令牌添加到访问令牌开关。

最后,您还可以添加其他映射器类型。 如果你回到映射器选项卡,单击创建按钮。

添加映射器

添加映射器

选择一个映射器类型从列表框中。 如果将鼠标悬停在工具提示上,您将看到该映射器类型的功能的描述。 不同的mapper类型将出现不同的config参数。

优先顺序

映射器实现具有优先顺序。 此优先级顺序不是映射器的配置属性; 相反,它是 映射器具体实现的属性

映射器在管理控制台中按映射器列表中的顺序排序,令牌或断言中的更改将是 使用该顺序应用,最低的顺序首先应用。 这意味着依赖于其他 实现按所需的顺序处理。

例如,当我们首先要计算令牌将包含的角色时,我们首先根据 那些角色。 然后,我们处理一个JavaScript脚本,该脚本使用令牌中已经可用的角色和受众。

OIDC用户会话注释映射器

用户会话详细信息通过映射器定义,并取决于各种标准。 当您在客户端上使用或启用功能时,将自动包含用户会话详细信息。 您也可以单击添加内置包含会话详细信息的按钮。

模拟用户会话提供以下详细信息:

  • 冒名顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶地: 冒充用户的ID

  • 冒名顶用 _ 用户名: 冒充用户的用户名

服务帐户会话提供以下详细信息:

  • clientId: 服务账号的客户端ID

  • 客户地址: 服务账号认证设备的远程主机IP

  • 客户: 服务账号认证设备的远程主机名

脚本映射器

脚本映射器允许您通过运行用户定义的JavaScript代码将声明映射到令牌。 有关如何 将脚本部署到服务器,请看一下JavaScript提供商

部署脚本后,您应该能够从可用映射器列表中选择部署的脚本。

生成客户端适配器配置

Keycloak可以预先生成配置文件,您可以使用这些文件在应用程序的 部署环境。 OIDC和SAML都支持多种适配器类型。 去安装的选项卡 您想要为其生成配置的客户端。

客户端安装

选择格式选项您希望为生成配置。 适用于OIDC和SAML的所有Keycloak客户端适配器 支持。 支持用于SAML的mod-auth-mellon Apache HTTPD适配器以及标准SAML实体描述符文件。

客户端范围

如果您需要在组织内保护和注册许多应用程序,则配置 协议映射器角色范围映射对于这些客户中的每一个。 Keycloak允许 您要在称为客户端范围

客户端作用域还提供对OAuth 2的支持范围参数,它允许客户端应用程序请求更多或更少 访问令牌中的声明或角色,根据应用程序需要。

要创建客户端作用域,请按照以下步骤操作:

  • 客户端范围左侧菜单项。 此初始屏幕向您显示当前定义的客户端范围的列表。

客户端范围列表

客户端范围列表

  • 单击创建按钮。 命名客户端范围并保存。 A客户端范围将有与普通客户相似的标签。 你可以 定义协议映射器角色范围映射,可以由其他客户端继承, 并且配置为从此客户端范围继承。

协议

创建客户端作用域时,必须选择协议。 然后只能链接使用相同协议的客户端 有了这个客户端范围。

创建新领域后,您可以看到菜单中有一个预定义 (内置) 客户端范围的列表。

  • 对于SAML协议,有一个内置的客户端作用域,角色列表,其中包含一个用于显示角色的协议映射器 SAML断言中的列表。

  • 对于OpenID Connect协议,有客户端作用域简介,电子邮件,地址,电话,离线访问,角色, 网络起源微轮廓-jwt

客户端范围,离线访问,当客户端想要获取离线令牌时很有用。 在 离线访问部分或者在OpenID连接规范, 其中,使用值定义范围参数离线访问

客户端范围简介,电子邮件,地址电话也定义在OpenID连接规范。 这些客户端作用域没有定义任何角色作用域映射,但是它们定义了一些协议映射器,这些映射器对应 到OpenID Connect规范中定义的声明。

例如,当您单击以打开电话客户端作用域并打开映射器选项卡,您将看到协议映射器, 对应于说明书中定义的范围的权利要求电话

客户端范围映射器

客户端范围电话

电话客户端作用域链接到一个客户端,该客户端自动继承在 电话客户端范围。 为此客户端发行的访问令牌将包含有关用户的电话号码信息,假设 用户有一个定义的电话号码。

内置客户端作用域完全包含根据规范定义的协议映射器, 但是,您可以自由编辑客户端范围并创建/更新/删除任何协议映射器 (或角色范围映射)。

客户端范围角色在OpenID Connect规范中未定义,也不会自动添加到范围 访问令牌中的声明。 此客户端作用域具有一些映射器,用于将用户的角色添加到访问令牌和 可能会为具有至少一个客户角色的客户添加一些受众,如观众部分

客户端范围网络起源也没有在OpenID Connect规范中定义,也没有添加到范围索赔。 这是用的 向访问令牌添加允许的web源允许-起源索赔。

客户端范围微轮廓-jwt是为了处理中定义的索赔而创建的MicroProfile/JWT Auth规范。 此客户端作用域为upn索赔和领域角色映射器索赔。 这些映射器 可以根据需要进行更改,以便可以使用不同的属性来创建MicroProfile/JWT特定的权利要求。

客户端范围包含与同意屏幕相关的选项。 这些选项只有在链接的客户端配置为 需要同意 (如果需要同意在客户端上启用了开关)。

在同意屏幕上显示

如果打开,并且如果在需要同意的情况下将此客户端范围添加到客户端,则由同意屏幕文本将 显示在同意屏幕上,该屏幕将在用户通过身份验证后显示,并且在从Keycloak重定向之前显示 给客户。 如果开关关闭,则此客户端作用域将不会显示在同意屏幕上。

同意屏幕文本

将此客户端范围添加到某些需要同意的客户端时,同意屏幕上显示的文本默认为 客户端范围的名称。 此文本的值可通过指定替换变量进行本地化 与${var-name}字符串。 然后在主题中的属性文件中配置本地化值。 请参阅 服务器开发指南有关本地化的更多信息。

将客户端范围与客户端链接

客户端范围和客户端之间的链接配置在客户端范围特定客户端的选项卡。 有两种方法 客户端范围和客户端之间的链接。

默认客户端范围

这适用于OpenID Connect和SAML客户端。 默认客户端作用域总是在发出OpenID Connect令牌时应用 或此客户端的SAML断言。 客户端将继承客户端上定义的协议映射器和角色范围映射 范围。 对于OpenID Connect协议,始终应用映射器和角色范围映射,而与范围使用的值无关 OpenID Connect授权请求中的参数。

可选客户端范围

这仅适用于OpenID Connect客户端。 在为该客户端发行令牌时应用可选的客户端作用域, 但只有当他们被范围OpenID Connect授权请求中的参数。

示例

对于此示例,我们假设客户端具有简介电子邮件链接为默认客户端作用域,以及电话地址 作为可选客户端作用域链接。 客户端在向OpenID Connect授权发送请求时将使用scope参数的值 终点:

scope = openid电话

范围参数包含字符串,范围值除以空格 (这也是客户端范围名称的原因 不能在其中包含空格字符)。 值openid是用于所有OpenID Connect请求的元值,因此我们将忽略 这个例子。 令牌将包含来自客户端范围的映射器和角色范围映射简介,电子邮件(哪些是 默认范围) 和电话(由scope参数请求的可选客户端作用域)。

评估客户端范围

标签映射器范围的客户端包含仅为此客户端声明的协议映射器和角色范围映射。 它们不包含从客户端范围继承的映射器和范围映射。 然而,看看 有效的协议映射器将是 (协议映射器定义在客户端本身以及从链接的客户端范围继承) 以及为特定客户端生成令牌时使用的有效角色范围映射。

当您单击客户端范围客户端的选项卡,然后打开子选项卡评估。 从这里你 可以选择要应用的可选客户端范围。 这也将向您显示范围参数,需要 从应用程序发送到Keycloak OpenID Connect授权端点。

评估客户端范围

客户端范围评估

如果您想查看如何发送自定义值范围参数来自您的应用程序,请参见 参数转发部分,如果您的应用程序使用servlet适配器,或者 javascript适配器部分,如果您的应用程序使用javascript适配器。
生成示例令牌和用户信息

如果您在评估屏幕上,生成以下示例数据:

  • 生成的访问令牌: 当选定用户通过身份验证时,将生成并发送到客户端的访问令牌。

  • 生成的ID令牌: 将在所选用户进行身份验证时生成并发送给客户端的ID令牌。

  • 生成的用户信息: UserInfo端点返回的用户信息。

所有示例均针对特定用户生成,并针对特定客户端发布,并具有指定的 的价值范围参数。 示例包括所使用的所有声明和角色映射。

客户端范围权限

为特定用户发行令牌时,仅在允许用户使用客户端作用域时才应用客户端作用域。 在这种情况下 客户端作用域本身没有定义任何角色作用域映射,则自动允许每个用户使用此 客户端范围。 但是,当客户端作用域具有在其自身上定义的任何角色作用域映射时,则用户必须至少是 其中一个角色。 换句话说,用户角色和客户端范围的角色之间必须有交叉。 复合材料 评估此交集时会考虑角色。

如果不允许用户使用客户端范围,则在生成令牌时将不使用协议映射器或角色范围映射 并且客户端作用域不会出现在范围令牌中的值。

领域默认客户端范围

领域默认客户端范围允许您定义一组客户端范围,这些范围将自动链接到新创建的客户端。

打开左侧菜单项客户端范围然后选择默认客户端范围

从这里,选择要添加为的客户端范围默认客户端范围给新创建的客户和可选客户端范围 给新创建的客户。

默认客户端范围

客户端范围默认

创建客户端后,如果需要,可以取消链接默认客户端范围。 这类似于你 移除默认角色

解释范围

术语范围在少数地方使用Keycloak。 作用域的各种出现相互关联,但可能有 不同的背景和意义。 为了澄清,这里我们解释各种范围用于Keycloak。

客户端范围

本章中引用的。 客户端作用域是Keycloak中的实体,它们是在领域级别配置的,它们可以是 链接到客户。 当将请求发送到Keycloak授权端点时,客户端范围由其名称引用 具有相应的值范围参数。 细节描述在关于 客户端范围链接

角色范围映射

这可以在您打开tab时看到范围客户端或客户端范围的。 角色范围映射允许您限制可以 在访问令牌中使用。 细节描述在角色范围映射部分

授权范围

这是由授权功能使用的。 的授权范围是可以在应用程序中完成的操作。 更多详细信息授权服务指南

客户端策略

为了使客户端应用程序的安全变得容易,以统一的方式实现以下几点是有益的。

  • 设置客户端可以具有哪些配置的策略

  • 客户端配置的验证

  • 符合所需的安全标准和配置文件,如金融级API (FAPI)

为了统一实现这些要点,客户端策略引入了概念。

用例

客户端策略实现以下几点。

设置客户端可以具有哪些配置的策略

客户端上的配置设置可以在客户端创建/更新期间由客户端策略强制执行,也可以在与特定客户端相关的OpenID连接到Keycloak server的请求期间强制执行。 Keycloak也通过中描述的客户端注册策略支持类似的事情保护应用程序和服务指南。 但是,客户端注册策略只能覆盖OIDC动态客户端注册。 客户端策略不仅涵盖客户端注册策略可以执行的操作,还涵盖其他客户端 注册和配置方式。 当前的计划是将客户注册替换为客户策略。

客户端配置的验证

Keycloak支持验证客户端是否遵循代码交换的证明键等设置, 请求对象签名算法、密钥持有者令牌等一些端点,如授权端点、令牌端点等。 这些可以由每个设置项指定 (在管理控制台,开关,下拉菜单等)。 为了使客户端应用程序安全,管理员需要设置 以适当的方式进行许多设置,这使得管理员很难保护客户端应用程序。 客户端策略可以对上面提到的客户端配置进行这些验证,它们也可以用于自动配置一些客户端配置开关以满足 高级安全要求。 将来,单个客户端配置设置可能会被直接执行所需验证的客户端策略所取代。

符合要求的安全标准和配置文件,如FAPI

全球客户档案默认情况下,客户端配置文件是否在Keycloak中预先配置。 它们预先配置为符合标准安全配置文件,如FAPI, 这使得管理员可以很容易地保护他们的客户端应用程序,使其符合特定的安全配置文件。 此时此刻,Keycloak拥有全球 支持FAPI 1规范的配置文件。 管理员只需要配置客户端策略来指定哪些客户端应该 符合FAPI。 管理员可以配置客户端配置文件和客户端策略,以便可以轻松地使Keycloak客户端与其他各种 安全配置文件,如SPA,本机应用程序,开放银行等。

协议

客户端策略概念独立于任何特定协议。 但是,Keycloak目前仅支持OpenID Connect (OIDC) 协议

建筑

客户端策略由四个构建块组成: 条件,执行器,配置文件和策略。

条件

条件确定策略被采用给哪个客户以及何时被采用。 当其他一些条件是 在客户端请求 (OIDC授权请求、令牌端点请求等) 期间检查。 条件检查是否满足一个指定的条件。 例如, 某些条件检查客户端的访问类型是否保密。

该条件不能单独使用。 它可以用于政策之后进行了描述。

条件可以与其他可配置提供者相同。 可以配置的内容取决于每种条件的性质。

提供以下条件:

创建/更新客户端的方式
  • 动态客户端注册 (使用初始访问令牌或注册访问令牌进行匿名或身份验证)

  • 管理REST API (管理控制台等)

因此,例如在创建客户端时,可以将条件配置为在不进行初始注册的OIDC动态客户端注册创建此客户端时评估为true 访问令牌 (匿名动态客户端注册)。 因此可以使用此条件例如确保通过OIDC动态客户端注册的所有客户端 是否符合FAPI。

客户的作者 (按特定角色或组的存在检查)

在OpenID Connect动态客户端注册中,客户端的作者是经过身份验证以获取用于生成新客户端而不是服务的访问令牌的最终用户 使用访问令牌实际访问注册端点的现有客户端的帐户。 在通过Admin REST API进行注册时,客户端的作者是最终用户 就像Keycloak的管理员。

客户端访问类型 (机密、公共、仅承载)

例如,当客户端发送授权请求时,如果该客户端是机密的,则采用策略。

客户端范围

如果客户端具有特定的客户端作用域 (作为默认作用域或作为当前请求中使用的可选作用域),则计算结果为true。 这可以用于例如确保 具有范围的OIDC授权请求fapi-示例-范围需要符合FAPI。

客户角色

适用于具有指定名称的客户端角色的客户端

客户端域名、主机或ip地址

申请客户端特定域名。 或者对于管理员从特定主机或ip地址注册/更新客户端的情况。

任何客户

此条件始终评估为真。 例如,它可以用于确保特定领域中的所有客户端都符合FAPI。

遗嘱执行人

执行器指定在采用策略的客户端上执行什么操作。 执行器执行一个或几个指定的操作。 例如, 一些执行器检查参数的值是否重定向uri在授权请求中,与预先注册的重定向uri中的一个完全匹配 授权端点,如果没有,则拒绝此请求。

执行者不能单独使用。 它可以用于简介之后进行了描述。

执行器可以与其他可配置提供程序相同。 可以配置什么取决于每个执行器的性质。

执行者对各种事件采取行动。 执行器实现可以忽略某些类型的事件 (例如,用于检查OIDC的执行器请求对象行为公正 在OIDC授权请求上)。 事件包括:

  • 创建客户端 (包括通过动态客户端注册创建)

  • 更新客户端

  • 发送授权请求

  • 发送令牌请求

  • 发送令牌刷新请求

  • 发送令牌撤销请求

  • 发送令牌自省请求

  • 发送userinfo请求

  • 发送带有刷新令牌的注销请求

在每个事件上,执行器可以在多个阶段工作。 例如,在创建/更新客户端时,执行器可以通过自动配置特定客户端来修改客户端配置 设置。 之后,执行器在验证阶段验证此配置。

此执行器的几个目的之一是实现诸如FAPI之类的客户端一致性配置文件的安全要求。 为此,需要以下执行人:

  • 强制安全客户端身份验证方法用于客户端

  • 强制执行钥匙持有者令牌被使用

  • 强制执行代码交换的证明密钥 (PKCE)被使用

  • 强制执行安全签名算法签名的JWT客户端身份验证 (私钥jwt)被使用

  • 强制执行HTTPS重定向URI,并确保配置的重定向URI不包含通配符

  • 强制OIDC请求满足高安全级别的对象

  • 强制执行OIDC混合流的响应类型,包括用作分离签名如FAPI 1规范中所述,这意味着从授权响应返回的ID令牌将不包含用户配置文件数据

  • 强制更安全随机性预防CSRF的参数处理

  • 客户端注册时实施更安全的签名算法

  • 强制执行绑定 _ 消息参数用于CIBA请求

简介

一个配置文件由几个执行程序组成,可以实现像FAPI这样的安全配置文件。 配置文件可以由Admin REST API (管理控制台) 及其执行程序一起配置。 三全球概况存在,并且默认情况下,它们在Keycloak中进行配置,并具有符合FAPI基线,FAPI高级和FAPI CIBA规范的预配置执行器。 更多详细信息存在于保护应用程序和服务指南

政策

策略由几个条件和配置文件组成。 该策略可以适用于满足该策略所有条件的客户。 该政策引用了几个配置文件和所有 这些配置文件的执行者针对采用此策略的客户端执行其任务。

配置

策略,配置文件,条件,执行程序可以由Admin REST API配置,这也意味着管理控制台。 要做到这一点,有一个标签境界领域设置客户端策略 ,这意味着管理员可以在每个领域拥有客户端策略。

全球客户档案在每个领域都自动可用。 但是没有客户端策略 默认配置。 这意味着,如果管理员希望例如其领域的客户端符合FAPI,则始终需要创建任何客户端策略。 全球 配置文件无法更新,但是管理员可以轻松地将它们用作模板并创建自己的配置文件,如果他们想在全局配置文件配置中做一些细微的更改。 管理控制台中有可用的JSON编辑器,它简化了基于某些全局配置文件的新配置文件的创建。

向后兼容性

客户端策略可以替换中描述的客户端注册策略保护应用程序和服务指南。 然而,客户注册政策也仍然共存。 这意味着例如在动态客户端注册请求创建/更新客户端期间,客户端策略和 应用客户端注册策略。

当前的计划是删除客户端注册策略功能,并且现有的客户端注册策略将自动迁移到新的客户端策略中。 = = 角色

角色标识用户的类型或类别。 管理员,用户,经理,以及员工都是可能存在的典型角色 在一个组织中。 应用程序通常将访问权限和权限分配给特定角色,而不是将单个用户分配为交易 用户的粒度可能太细,难以管理。 例如,管理控制台具有特定角色,这些角色向用户授予权限 访问管理控制台UI的部分并执行某些操作。 角色有一个全局名称空间,每个客户端也有自己的 可以定义角色的专用名称空间。

领域角色

领域级角色是定义角色的全局名称空间。 您可以通过单击角色左侧菜单项。

角色

要创建角色,请单击添加角色在此页面上,输入角色的名称和描述,然后单击保存

添加角色

角色

的值描述字段可通过以下方式指定替换变量来本地化${var-name}字符串。 本地化 然后在主题中的属性文件中配置值。 请参阅服务器开发指南有关更多信息 关于本地化。

客户角色

客户端角色基本上是专用于客户端的名称空间。 每个客户端都有自己的名称空间。 客户端角色在角色每个单独的客户端下的选项卡。 您与这个用户界面的交互方式与领域级角色的交互方式相同。

复合角色

任何领域或客户端级别的角色都可以变成一个复合角色。 A复合角色是具有与之关联的一个或多个附加角色的角色。 当复合角色映射到用户时,用户还获得与该复合角色相关联的角色。 这种继承 是递归的,所以复合材料的任何复合材料也会被继承。

要将常规角色转换为复合角色,请转到角色详细信息页面并翻转复合角色打开。

复合角色

复合角色

翻转此开关后,角色选择UI将显示在页面下方,您将能够关联 要创建的复合材料的领域级别和客户端级别角色。 在这个例子中,员工境界级 角色与开发者复合角色。 任何具有开发者角色现在也将继承 的员工角色也是。

创建令牌和SAML断言时,任何复合材料也将其关联角色添加到声明中,并且 发送回客户端的身份验证响应的断言。

用户角色映射

用户角色映射可以通过角色映射该单个用户的选项卡。

角色映射

用户角色映射

在上面的示例中,我们将要分配复合角色开发者是在复合角色 章。

有效角色映射

有效角色映射

一旦开发者分配了角色,您会看到员工开发者复合材料显示在有效角色有效角色是显式分配给用户的所有角色以及从复合材料继承的任何角色。

默认角色

默认角色允许您在通过新创建或导入任何用户时自动分配用户角色映射 身份经纪。 要指定默认角色,请转到角色左侧菜单项,然后单击默认角色标签,或者你可以 搜索默认-角色-${realmName}领域角色选项卡,然后单击编辑。 请注意默认-角色-${realmName} 不能删除角色,因为它同时充当领域和客户端默认角色的容器。

默认角色

默认角色

从屏幕截图中可以看到,已经有很多默认角色默认设置。

角色范围映射

创建OIDC访问令牌或SAML断言时,默认情况下,将用户的所有用户角色映射添加为声明 在令牌或断言中。 应用程序使用此信息对由该信息控制的资源做出访问决策 申请。 在Keycloak中,访问令牌是数字签名的,实际上可以由应用程序重新使用 在其他远程安全的REST服务上调用。 这意味着如果一个应用程序被泄露或者有一个流氓 客户端注册了领域,攻击者可以获得具有广泛权限的访问令牌和您的整个 网络受损。 这就是角色范围映射变得重要。

角色范围映射是一种限制在访问令牌中声明的角色的方法。 当客户端请求用户 经过身份验证后,他们收到的访问令牌将仅包含您已明确指定的角色映射 为了客户的范围。 这允许您限制每个单独的访问令牌拥有的权限,而不是给 客户端访问用户的所有权限。 默认情况下,每个客户端都获得用户的所有角色映射。 您可以在范围每个客户端的选项卡。

全范围

完整的客户端范围

从图片中可以看到,作用域的有效角色是领域中的每个声明角色。 要更改此默认行为,您必须显式关闭允许的全范围切换并声明您想要在每个人中的特定角色 客户。 或者,您也可以使用客户端范围 为一整套客户端定义相同的角色范围映射。

部分范围

客户端范围

Keycloak中的组允许您为一组用户管理一组通用的属性和角色映射。 用户可以是零个或多个组的成员。 用户继承分配给每个组的属性和角色映射。 要管理组,请转到左侧菜单 项。

组

群体是分层的。 一个组可以有许多子组,但一个组只能有一个父组。 子组从父组继承属性和角色映射。 这也适用于用户。 因此,如果您有一个父组和一个子组,并且一个仅属于该子组的用户,则该用户将继承父组和子组的属性和角色映射。 在这个例子中,我们有一个顶级销售小组和一个孩子北美分组。 要添加组,请单击 您要添加新的子级的父级,然后单击新的按钮。 选择树中的图标以组成顶级组。 在创建组屏幕和打击保存将带您进入个人组管理页面。

组

属性角色映射选项卡的工作方式与用户下名称相似的选项卡完全相同。 任何属性和角色映射 您定义的将由作为该组成员的组和用户继承。

要将用户添加到组中,您需要一直返回到用户详细信息页面,然后单击标签在那里。

用户组

用户组

可用组树并击中加入将用户添加到组的按钮。 反之亦然,删除一个组。 这里我们添加了用户吉姆北美销售组。 如果您返回该组的详细信息页面,并且 选择会员资格选项卡,吉姆现在显示在那里。

组成员资格

组成员资格

组与角色

在IT世界中,群体和角色的概念通常是模糊且可互换的。 在Keycloak中,组只是用户的集合,您可以在一个地方应用角色和属性。 角色定义一种类型的用户和应用程序将权限和访问控制分配给角色。

不是复合角色也类似于团体? 从逻辑上讲,它们提供了相同的完全功能,但区别是概念性的。 应使用复合角色将权限模型应用于您的服务和应用程序集。 组应关注用户的集合及其在组织中的角色。 使用组来管理用户。 使用复合角色来管理应用程序和服务。

默认组

默认组允许您在创建或通过以下方式导入任何新用户时自动分配组成员资格 身份经纪。 要指定默认组,请转到左侧菜单项,然后单击默认组tab。

默认组

默认组

管理控制台访问控制和权限

在Keycloak上创建的每个领域都有一个专用的管理控制台,可以从中管理该领域。 的大师realm是一个特殊的领域,允许管理员在系统上管理多个领域。 你也可以 定义对不同领域用户的细粒度访问,以管理服务器。 本章介绍了所有的情况。

主领域访问控制

大师Keycloak中的境界是一个特殊的境界,与其他境界不同。 Keycloak中的用户大师可以授予realm管理在Keycloak服务器上部署的零个或多个领域的权限。 创建领域时,Keycloak会自动创建各种角色,这些角色授予了访问该新领域的细粒度权限。 可以通过将这些角色映射到大师境界。 可以创建多个超级用户,以及只能管理特定领域的用户。

全球角色

大师境界。 这些是:

  • 管理员

  • 创造领域

具有管理员角色是超级用户,可以完全访问服务器上的任何领域。 具有创造领域角色 被允许创造新的领域。 他们将被授予对他们创造的任何新境界的完全访问权限。

领域特定角色

中的管理员用户大师可以将realm授予系统中一个或多个其他领域的管理权限。 Keycloak中的每个领域都由客户端表示大师境界。 客户端的名称是<境界名称>-境界。 这些客户端每个都有定义的客户端级别角色,这些角色定义了不同的 管理单个领域的访问级别。

可用的角色有:

  • 视图领域

  • 视图-用户

  • 视图-客户端

  • 视图-事件

  • 管理领域

  • 管理-用户

  • 创建-客户端

  • 管理-客户端

  • 管理-事件

  • 视图-身份-提供者

  • 管理-身份-提供者

  • 模仿

将您想要的角色分配给用户,他们将只能使用管理控制台的特定部分。

管理员与管理-用户角色将只能将管理员角色分配给他们自己拥有的用户。 所以,如果管理员有管理-用户角色,但没有管理领域角色,他们将无法分配此角色。

专用领域管理控制台

每个领域都有一个专用的管理控制台,可以通过转到url来访问/auth/admin/{领域名称}/控制台。 可以通过分配特定的用户角色映射来授予该领域内的用户领域管理权限。

每个领域都有一个内置的客户端,称为领域管理。 您可以通过转到 客户你领域的左侧菜单项。 此客户端定义客户端级别的角色,这些角色指定可以授予管理领域的权限。

  • 视图领域

  • 视图-用户

  • 视图-客户端

  • 视图-事件

  • 管理领域

  • 管理-用户

  • 创建-客户端

  • 管理-客户端

  • 管理-事件

  • 视图-身份-提供者

  • 管理-身份-提供者

  • 模仿

将您想要的角色分配给用户,他们将只能使用管理控制台的特定部分。

精细谷物管理权限

细颗粒管理权限是技术预览并且没有得到完全支持。 默认情况下,此功能被禁用。

启用以启动服务器-Dkeycloak。个人资料 = 预览 或者-Dkeycloak.profile.feature.admin_fine_grained_authz = 启用 。 有关更多详细信息,请参见配置文件

有时角色像管理领域或者管理-用户太粗了,你想创建 具有更精细颗粒权限的受限管理员帐户。 Keycloak允许您定义 并分配用于管理领域的受限访问策略。 诸如:

  • 管理一个特定的客户端

  • 管理属于特定组的用户

  • 管理组的成员

  • 有限的用户管理。

  • 细粒模拟控制

  • 能够为用户分配一组特定的受限角色。

  • 能够为复合角色分配一组特定的受限角色。

  • 能够为客户的范围分配一组特定的受限角色。

  • 用于查看和管理用户、组、角色和客户端的新的通用策略。

关于细粒管理员权限,有一些重要的事情需要注意:

  • 精细谷物管理权限是在授权服务。 强烈建议您在进入细颗粒权限之前先阅读这些功能。

  • 细粒权限仅在专用管理控制台以及在这些领域中定义的管理员。 您不能定义跨领域的细粒度权限。

  • 细粒权限用于授予其他权限。 您不能覆盖 内置管理角色的默认行为。

管理一个特定的客户端

让我们先看看允许 仅管理一个客户端和一个客户端的管理员。 在我们的例子中,我们有一个境界 被称为测试一个客户叫销售-应用。 在领域测试我们会给一个 该领域中的用户权限仅管理该应用程序。

您不能执行跨领域精细颗粒权限。 管理员在大师领域仅限于前几章中定义的预定义管理角色。
权限设置

我们必须做的第一件事是登录到管理控制台,这样我们就可以为该客户端设置权限。 我们导航到管理部分 对于客户端,我们要定义细粒度的权限。

客户管理

细粮客户

您应该看到一个名为权限。 单击该选项卡。

客户端权限选项卡

fine grain客户端权限选项卡关闭

默认情况下,每个客户端都不启用精细颗粒权限。 所以转动已启用权限切换到on 初始化权限。

如果你转动已启用权限切换到关闭,它将删除您为此客户端定义的所有权限。
客户端权限选项卡

上的细颗粒客户端权限选项卡

当你切换时已启用权限on,它在幕后初始化各种权限对象 使用授权服务。 对于这个例子,我们 对管理客户端的权限。 点击它会重定向你 到处理管理客户端的权限。 所有授权 对象包含在领域管理客户的授权tab。

客户端管理权限

细粒客户端管理权限

第一次初始化时管理权限没有与之关联的任何策略。 您需要通过转到 “策略” 选项卡来创建一个。 要快速到达那里,请点击 的授权上图所示的链接。 然后单击 “策略” 选项卡。

这个页面上有一个下拉菜单,叫做创建策略。 有很多政策 你可以定义。 您可以定义与角色或组相关联的策略,甚至可以定义 JavaScript中的规则。 对于这个简单的例子,我们将创建一个用户策略

用户策略

细粮客户端用户策略

此策略将匹配用户数据库中的硬编码用户。 在这种情况下,它是销售管理员用户。 然后我们必须回到 销售-应用客户的管理权限页面,并将策略分配给权限对象。

分配用户策略

细粒客户端分配用户策略

销售管理员用户现在可以拥有管理销售-应用客户。

我们还有一件事要做。 去角色映射选项卡并分配查询-客户端销售管理员

分配查询-客户端

细粒度分配查询客户端

你为什么要这么做? 此角色告诉管理控制台 当销售管理员访问管理控制台。 的查询-客户端 角色告诉管理控制台,它应该为销售管理员用户。

重要的是,如果您没有设置查询-客户端角色,受限制的管理员,如销售管理员登录管理控制台时不会看到任何菜单选项

测试一下。

接下来,我们注销主领域,然后重新登录到专用管理控制台对于测试境界 使用销售管理员作为用户名。 这位于/授权/管理/测试/控制台

销售管理员登录

细粮销售管理员登录

这个管理员现在可以管理这个客户端了。

限制用户角色映射

您可能要做的另一件事是限制管理员允许的角色集 分配给用户。 继续我们的最后一个示例,让我们扩展 “sales-admin” 的权限集 用户,以便他还可以控制允许哪些用户访问此应用程序。 通过细粒权限,我们可以 启用它,以便销售管理员只能分配授予特定访问权限的角色 的销售-应用。 我们还可以对其进行限制,以便管理员只能映射角色 并且不执行任何其他类型的用户管理。

销售-应用定义了三个不同的客户端角色。

销售应用程序角色

细粮销售应用角色

我们想要销售管理员用户能够将这些角色映射到系统中的任何用户。 的 执行此操作的第一步是允许管理员映射角色。 如果我们点击 查看线索角色,你会看到有一个权限此角色的选项卡。

查看线索角色权限选项卡

细颗粒视图线索角色选项卡

如果我们点击该选项卡并打开已启用权限上,你会看到 是我们可以应用策略的许多操作。

查看线索权限

细颗粒视图线索权限

我们感兴趣的是地图-角色。 单击此权限并添加相同的 在前面的示例中创建的用户策略。

地图角色权限

细粒度映射角色权限

我们所做的是说销售管理员可以映射查看线索作用。 我们所拥有的 未完成的是指定允许管理员映射此角色的用户。 要做到这一点 我们必须去用户此领域的管理控制台部分。 点击 用户左侧菜单项将我们带到领域的用户界面。 你应该看到一个 权限tab。 单击并启用它。

用户权限

细粮用户权限

我们感兴趣的许可是地图-角色。 这是一项限制性政策 因为它只允许管理员将角色映射到用户。 如果我们点击 地图-角色权限,并再次添加我们为此创建的用户策略,我们的销售管理员 将能够将角色映射到任何用户。

我们要做的最后一件事是添加视图-用户销售管理员。 这将 允许管理员查看他想要添加的领域中的用户销售-应用角色。

添加视图用户

细粒添加视图用户

测试一下。

接下来,我们注销主领域,然后重新登录到专用管理控制台对于测试境界 使用销售管理员作为用户名。 这位于/授权/管理/测试/控制台

现在你会看到销售管理员可以查看系统中的用户。 如果您选择其中一个 用户您将看到每个用户详细信息页面都是只读的,除了角色映射tab。 转到此选项卡,您会发现没有可用管理员的角色 映射到用户,除非我们浏览销售-应用角色。

添加视图

细颗粒添加视图引线

我们只指定了销售管理员可以映射查看线索作用。

每个客户端地图-角色快捷方式

如果我们必须对每个客户角色都这样做,那将是乏味的销售-应用出版。 为了使事情变得更容易,有一种方法可以指定管理员可以映射定义的任何角色 被客户。 如果我们重新登录到管理控制台到我们的主领域管理员,然后返回 到销售-应用权限页面,您将看到地图-角色许可。

客户端映射-角色权限

上的细颗粒客户端权限选项卡

如果您向管理员授予对此特定权限的访问权限,则该管理员将能够 映射客户端定义的任何角色。

权限的完整列表

除了管理特定的客户端或客户端的特定角色之外,您还可以使用精细的权限做更多的事情。 本章定义了可以描述的权限类型的整个列表 一个境界。

角色

当去权限特定角色的选项卡,您将看到这些 列出了权限类型。

地图-角色

决定管理员是否可以将此角色映射到用户的策略。 这些政策 仅指定角色可以映射到用户,而不是允许管理员 执行用户角色映射任务。 管理员还必须管理或 角色映射权限。 见用户权限有关更多信息。

地图-角色-复合

决定管理员是否可以将此角色作为复合角色映射到另一个角色的策略。 如果管理员必须管理客户端的权限,则可以为该客户端定义角色 但他将无法为这些角色添加复合材料,除非他拥有 地图-角色-复合他想作为复合材料添加的角色的特权。

地图-角色-客户-范围

决定管理员是否可以将此角色应用于客户端范围的策略。 即使管理员可以管理客户端,他也没有权限 为包含此角色的客户端创建令牌,除非此权限 被授予。

客户

当去权限特定客户端的选项卡,您将看到这些 列出了权限类型。

视图

决定管理员是否可以查看客户端配置的策略。

管理

决定管理员是否可以查看和管理客户端配置的策略。 这有一些问题,特权可能会无意中泄露。 例如,管理员可以定义一个对角色进行硬编码的协议映射器 即使管理员没有将角色映射到客户端范围的权限。 这是目前协议映射器的限制,因为他们没有办法 像角色一样为他们分配单独的权限。

配置

减少了管理客户端的权限集。 就像管理范围除外 不允许管理员定义协议映射器,更改客户端模板, 或者客户的范围。

地图-角色

决定管理员是否可以将客户端定义的任何角色映射到用户的策略。 这是一个捷径,易于使用的功能,可以避免必须定义策略 对于客户端定义的每个角色。

地图-角色-复合

决定管理员是否可以映射客户端定义的任何角色的策略 作为另一个角色的复合材料。 这是一个捷径,易于使用的功能,可以避免必须定义策略 对于客户端定义的每个角色。

地图-角色-客户端-范围

决定管理员是否可以映射客户端定义的任何角色的策略 到另一个客户端的范围。 这是一个捷径,易于使用的功能,可以避免必须定义策略 对于客户端定义的每个角色。

用户

当去权限标签对于所有用户,您将看到这些 列出了权限类型。

视图

决定管理员是否可以查看领域中的所有用户的策略。

管理

决定管理员是否可以管理领域中的所有用户的策略。 这个 权限授予管理员执行用户角色映射的权限,但是 它没有指定允许管理员映射哪些角色。 你需要 为您希望管理员能够映射的每个角色定义权限。

地图-角色

这是由管理范围。 在这个 如果管理员只允许映射角色。 管理员不允许执行 任何其他用户管理操作。 还有,就像管理, 允许管理员申请,如果要处理,则必须为每个角色或每个角色集指定 具有客户端角色。

管理-组-成员资格

类似于地图-角色除了它与组成员资格有关: 可以添加或删除用户的组。 这些 策略只是授予管理员权限来管理组成员身份,而不是 允许管理员管理成员的组。 你必须 为每个组的指定策略管理成员许可。

模拟

决定是否允许管理员模拟其他用户的策略。 这些 策略应用于管理员的属性和角色映射。

用户模拟

决定可以模拟哪些用户的策略。 这些政策将是 应用于被模仿的用户。 例如,您可能想要定义 禁止任何人冒充具有管理员的用户的策略 特权。

当去权限特定组的选项卡,您将看到这些 列出了权限类型。

视图

决定管理员是否可以查看有关组的信息的策略。

管理

决定管理员是否可以管理组配置的策略。

视图-成员

决定管理员是否可以查看组成员的用户详细信息的策略。

管理成员

决定管理员是否可以管理属于该组的用户的策略。

管理成员资格

决定管理员是否可以更改组成员的策略。 添加或 从组中删除成员。

领域键

Keycloak使用的身份验证协议需要加密签名,有时 加密。 Keycloak使用非对称密钥对 (私钥和公钥) 来完成此操作。

Keycloak一次有一个有源键,但也可以有几个无源键。 活动键盘 用于创建新签名,而被动keypairs可用于验证以前的签名。 这使得它 可以定期旋转按键,而不会造成任何停机或用户中断。

创建领域时,将自动生成密钥对和自签名证书。

要查看领域的活动键,请在管理控制台中选择领域,单击领域设置然后钥匙。 这个 将显示领域的当前活动密钥。

要查看被动或禁用键,请选择被动或者禁用。 键盘可以具有状态活动,但仍未被选为该领域当前活动的keypair。 根据按优先级排序的第一个密钥提供程序选择用于签名的所选活动对 能够提供活动的键盘。

旋转键

建议定期旋转按键。 为此,您应该从创建优先级高于 现有的活动密钥。 或创建具有相同优先级的新密钥,并使以前的密钥变得被动。

一旦新密钥可用,所有新令牌和cookie都将使用新密钥进行签名。 当用户向 应用程序SSO cookie使用新签名进行更新。 当OpenID Connect令牌刷新时,新令牌是 用新钥匙签名。 这意味着随着时间的推移,所有的cookie和令牌将使用新的密钥,并在一段时间后 旧钥匙可以移除。

您等待多长时间删除旧密钥是安全性和确保所有cookie和令牌都已更新之间的权衡。 一般来说,几周后放下旧钥匙应该是可以接受的。 期间未活跃的用户 在添加的新密钥和删除的旧密钥之间必须重新进行身份验证。

这也适用于离线令牌。 为了确保它们已更新,应用程序需要先刷新令牌 旧钥匙被移除。

作为指导方针,最好每3-6个月创建一次新密钥,并在新密钥后1-2个月删除旧密钥 创建了密钥。

添加生成的keypair

要添加新生成的keypair,请选择提供商并选择rsa生成从下拉列表中。 您可以更改优先级 以确保新的keypair成为活动的keypair。 您也可以更改关键大小如果你想要更小或更大的键 (默认为2048, 支持的值是1024、2048和4096)。

点击保存添加新密钥。 这将生成一个新的keypair,包括自签名证书。

更改提供程序的优先级不会导致重新生成密钥,但是如果要更改密钥大小 您可以编辑提供程序,并将生成新的密钥。

添加现有的keypair和证书

要添加在其他地方获得的keypair和证书,请选择提供商并选择rsa从下拉列表中。 你可以改变 确保新的keypair成为活动的keypair的优先级。

点击选择文件对于私有RSA密钥上传您的私钥。 文件应该以PEM格式编码。 你 不需要上传公钥,因为它是从私钥中自动提取的。

如果您有密钥的签名证书,请单击选择文件旁边X509证书。 如果你没有 您可以跳过此操作,然后将生成自签名证书。

从Java密钥库加载密钥

要添加存储在主机上的Java密钥库文件中的keypair和证书,请选择提供商并选择java密钥库 从下拉列表中。 您可以更改优先级,以确保新的keypair成为活动的keypair。

填写以下值密钥库,密钥库密码,密钥别名密钥密码然后点击保存

使钥匙被动

找到键盘活动然后在提供者列。 这将把你带到 密钥提供程序的配置屏幕。 点击活动转动它,然后点击保存。 的 密钥将不再处于活动状态,只能用于验证签名。

禁用键

找到键盘活动然后在提供者列。 这将把你带到 密钥提供程序的配置屏幕。 点击已启用转动它,然后点击保存。 的 密钥将不再启用。

或者,您可以从提供商表。

受损钥匙

Keycloak的签名密钥仅存储在本地,并且永远不会与客户端应用程序,用户或其他 实体。 但是,如果您认为您的领域签名密钥受到损害,则应首先如上所述生成新的keypair,并且 然后立即移除受损的keypair。

然后,为了确保客户端应用程序不会接受由受损密钥签名的令牌,您应该更新并推送之前的策略 可以从管理控制台执行的领域。 推动新政策将确保客户端应用程序不会接受现有的 由受损密钥签名的令牌,但客户端应用程序也将被迫从Keycloak下载新的keypair,因此 被破坏的密钥签名的令牌将不再有效。 请注意,您的休息和机密客户必须已设置管理网址,这样 Keycloak能够向他们发送有关未推送策略的请求。

身份经纪

身份代理是一种中介服务,它将多个服务提供商与不同的身份提供商联系起来。 作为中介服务,身份经纪人负责创建 与外部身份提供者的信任关系,以便使用其身份访问服务提供者公开的内部服务。

从用户的角度来看,身份代理提供了一种以用户为中心的集中式方式来管理跨不同安全性的身份 域或领域。 现有帐户可以与来自不同身份提供者的一个或多个身份链接,甚至可以创建 根据从他们那里获得的身份信息。

身份提供者通常基于特定协议,该协议用于对其用户进行身份验证和传达身份验证和授权信息。 它可以是社交提供商,例如Facebook,Google或Twitter。 它可以是一个业务合作伙伴,其用户需要访问您的服务。 或者它可以是基于云的身份 您想要与之集成的服务。

通常,身份提供者基于以下协议:

  • SAML v2.0

  • OpenID连接v1.0

  • OAuth v2.0

在接下来的部分中,我们将看到如何配置和使用Keycloak作为身份代理,涵盖一些重要方面,例如:

  • 社会认证

  • OpenID连接v1.0代理

  • SAML v2.0经纪业务

  • 身份联合会

经纪概述

当将Keycloak用作身份代理时,用户不会被迫提供其凭据以在特定领域进行身份验证。 相反,它们会显示一个可以从中进行身份验证的身份提供者列表。

您还可以配置默认身份提供程序。 在这种情况下,将不会给用户选择,而是直接将其重定向到默认提供程序。

下图演示了使用Keycloak代理外部身份提供程序时涉及的步骤:

身份代理流程

身份代理流程

  1. 用户未通过身份验证,并在客户端应用程序中请求受保护的资源。

  2. 客户端应用程序将用户重定向到Keycloak进行身份验证。

  3. 此时,向用户显示登录页面,其中有一个在领域中配置的身份提供者列表。

  4. 用户通过单击其相应的按钮或链接来选择其中一种身份提供者。

  5. Keycloak向要求身份验证的目标身份提供者和用户发出身份验证请求 被重定向到身份提供者的登录页面。 身份提供程序的连接属性和其他配置选项以前是由管理员在管理控制台中设置的。

  6. 用户提供其凭据或同意,以便与身份提供者进行身份验证。

  7. 身份提供者成功进行身份验证后,用户将通过身份验证响应重定向回Keycloak。 通常,此响应包含一个安全令牌,Keycloak将使用该令牌来信任身份提供者执行的身份验证 并检索有关用户的信息。

  8. 现在,Keycloak将检查来自身份提供者的响应是否有效。 如果有效,它将导入并创建一个新用户,或者如果该用户已经存在,则跳过该用户。 如果是新用户,如果令牌中不存在该信息,则Keycloak可能会向身份提供者询问有关该用户的信息。 这就是我们所说的身份联合会。 如果用户已经存在,则Keycloak可能会要求他将从身份提供者返回的身份与现有帐户链接。 我们称之为这个过程帐户链接。 到底做了什么是可配置的,可以通过设置首次登录流程。 在此步骤结束时,Keycloak对用户进行身份验证并发出自己的令牌,以便访问服务提供商中请求的资源。

  9. 一旦用户经过本地身份验证,Keycloak通过发送先前在本地身份验证期间发出的令牌,将用户重定向到服务提供商。

  10. 服务提供商从Keycloak接收令牌,并允许访问受保护的资源。

这个流程有一些变化,我们稍后会讨论。 例如,客户端应用程序可以请求特定的身份提供者,而不是呈现身份提供者列表。 或者,您可以告诉Keycloak在联合其身份之前强制用户提供其他信息。

不同的协议可能需要不同的身份验证流程。 目前,Keycloak支持的所有身份提供程序都使用如上所述的流程。 但是,无论使用哪种协议,用户体验都应该大致相同。

您可能会注意到,在身份验证过程结束时,Keycloak将始终向客户端应用程序发出自己的令牌。 这意味着客户端应用程序与外部身份提供者完全脱钩。 他们不需要知道使用了哪种协议 (例如: SAML,OpenID Connect,OAuth等) 或如何验证用户的身份。 他们只需要知道Keycloak。

默认身份提供程序

可以自动重定向到身份提供者,而不是显示登录表单。 要启用此功能,请转到身份验证在管理控制台中的页面,然后选择浏览器流。 然后单击配置身份提供商重定向器认证器。 设置默认身份提供程序到您要自动将用户重定向到的身份提供程序的别名。

如果找不到配置的默认身份提供程序,则将显示登录表单。

该认证器还负责处理kc_idp_hint查询参数。 见客户建议的身份提供者部分了解更多详细信息。

一般配置

identity broker配置全部基于identity provider。 为每个领域创建身份提供程序,默认情况下,它们为每个应用程序启用。 这意味着来自领域的用户在登录应用程序时可以使用任何注册的身份提供者。

为了创建身份提供者,请单击身份提供者左侧菜单项。

身份提供者

身份提供者

在下拉列表框中,选择要添加的身份提供程序。 这将把你带到 该身份提供程序类型的配置页面。

添加身份提供程序

添加身份提供程序

以上是配置Facebook社交登录提供商的示例。 配置IDP后,它将显示在Keycloak上 登录页面作为选项。 每个身份提供者的登录屏幕上都有可能有自定义图标。 有关更多详细信息,请参阅自定义图标

IDP登录页面

身份提供者登录页面

社会

社交提供商允许您在您的领域中启用社交身份验证。 Keycloak使用户可以使用社交网络的现有帐户轻松登录您的应用程序。 目前支持的提供商包括: Twitter、Facebook、Google、LinkedIn、Instagram、Microsoft、PayPal、Openshift v3、GitHub、GitLab、Bitbucket和Stack Overflow。

基于协议的

基于协议的提供者是那些依赖于特定协议以对用户进行身份验证和授权的提供者。 它们允许您连接到符合特定协议的任何身份提供商。 Keycloak提供了对SAML v2.0和OpenID Connect v1.0协议的支持。 它使基于这些开放标准配置和代理任何身份提供者变得容易。

尽管每种类型的身份提供者都有自己的配置选项,但它们都共享一些非常常见的配置。 无论您正在创建哪个身份提供程序,您都将看到以下可用配置选项:

表1。 通用配置
配置 描述

别名

别名是身份提供者的唯一标识符。 它用于在内部引用身份提供程序。 某些协议 (例如OpenID Connect) 需要重定向URI或回调url才能与身份提供者进行通信。 在这种情况下,别名用于构建重定向URI。 每个身份提供者都必须有一个别名。 例子有脸书,谷歌,idp.acme.com等。

已启用

打开/关闭提供程序。

在登录页面上隐藏

当此开关打开时,此提供程序将不会在登录页面上显示为登录选项。 客户端仍然可以通过使用其用于请求登录的URL中的 “kc_idp_hint” 参数来请求使用此提供程序。

仅帐户链接

当此开关打开时,此提供程序不能用于登录用户,并且不会在登录页面上显示为选项。 现有帐户仍然可以与此提供商链接。

存储令牌

是否存储从身份提供者接收的令牌。

存储的令牌可读

是否允许用户检索存储的身份提供者令牌。 这也适用于经纪人客户级别 角色读取令牌

信任电子邮件

如果身份提供商提供了电子邮件地址,则该电子邮件地址将受到信任。 如果领域需要电子邮件验证, 从此IDP登录的用户无需经过电子邮件验证过程。

图形用户界面顺序

排序可用idp在登录页面上的列出方式的订单号。

首次登录流程

这是将通过此IDP登录Keycloak的用户触发的身份验证流程 有史以来第一次。

发布登录流程

用户完成使用外部身份提供程序登录后触发的身份验证流。

同步模式

如何通过映射器更新idp用户信息的策略: 选择时遗产,保留当前行为, 导入永远不会更新用户数据,而将始终在可能的情况下更新用户数据。 另请参阅文档身份提供者映射器有关更多详细信息。

社会身份提供者

对于面向互联网的应用程序,用户必须在您的站点注册才能获得访问权限是相当繁重的。 它要求他们记住另一个用户名和密码组合。 社交身份提供者允许您委托 对用户可能已经拥有帐户的半可信且受尊重的实体进行身份验证。 Keycloak为最常见的社交网络提供内置支持,例如Google,Facebook,Twitter,GitHub,LinkedIn,Microsoft和Stack Overflow。

比特桶

您必须完成许多步骤才能启用Bitbucket登录。

首先,打开身份提供者左侧菜单项并选择比特桶添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

bitbucket添加身份提供程序

在您可以单击之前保存,您必须获得一个客户端ID客户秘密从比特桶。

你将使用重定向URI在稍后的步骤中,您将在此页面上注册Keycloak作为客户端时提供给Bitbucket。
添加新应用

要使用Bitbucket启用登录,您必须首先在 Bitbucket云上的OAuth

Bitbucket经常会更改应用程序注册的外观和感觉,因此您在Bitbucket站点上看到的内容可能会有所不同。 如果有疑问,请参阅Bitbucket文档。

bitbucket开发应用程序

单击添加消费者按钮。

注册应用

比特桶注册应用

复制重定向URI从Keycloak添加身份提供程序页面,并将其输入到Bitbucket Add OAuth Consumer页面的回调URL字段中。

在同一页面上,标记电子邮件阅读下面的盒子账户以允许您的应用程序读取用户电子邮件。

Bitbucket应用页面

bitbucket应用页面

完成注册后,单击保存。 这将打开Bitbucket中的应用程序管理页面。 从此页面中找到客户端ID和秘密,以便您可以将它们输入到Keycloak中添加身份提供程序页。 点击保存

脸书

要启用Facebook登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择脸书添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

facebook添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自Facebook。 你需要的一条数据 页面是重定向URI。 当你在Facebook注册Keycloak为客户时,你必须把它提供给Facebook,所以 把这个URI复制到你的剪贴板上。

要使用Facebook启用登录,您首先必须在Facebook开发者控制台

Facebook经常会更改Facebook开发人员控制台的外观,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。

登录控制台后,屏幕右上角有一个下拉菜单,显示我的应用程序。 选择添加新应用 菜单项。

添加新应用

facebook添加新应用

选择网站图标。 单击跳过并创建应用程序ID按钮。

创建新的应用ID

facebook创建应用程序id

电子邮件地址和应用程序类别是必填字段。 完成此操作后,您将被带到仪表板 对于应用程序。 单击设置左侧菜单项。

创建新的应用ID

facebook应用设置

点击+ 添加平台此页面末尾的按钮,然后选择网站图标。 复制并粘贴重定向URI从 Keycloak添加身份提供程序页面进入网站网址脸书的网站设置块。

指定网站

facebook应用设置网站

之后,有必要将Facebook应用程序公开。 点击应用审查左侧菜单项并将按钮切换为 “是”。

您还需要从此页面获取应用程序ID和应用程序秘密,以便您可以将它们输入到Keycloak中添加身份提供程序页。 要获得此信息,请单击仪表板左侧菜单项,然后单击显示应用秘密。 返回Keycloak并指定这些项目,最后保存您的Facebook身份提供商。

一个配置选项,用于在添加身份提供程序Facebook的页面是默认范围场。 此字段允许您手动指定用户在与此提供程序进行身份验证时必须授权的范围。 有关范围的完整列表,请查看https://developers.facebook.com/docs/ 图-api。 默认情况下,Keycloak 使用以下范围:电子邮件

需要注意的另一件事是,Keycloak将配置文件请求发送到graph.facebook.com/me?字段 = id、名称、电子邮件、first_name、last_name默认情况下,响应仅包含指定的字段。 如果要从Facebook个人资料中获取其他字段 (例如生日),则必须按照上面的段落中所述添加相应的作用域,并将字段名称添加到其他用户配置文件字段配置选项字段。 您可以通过探索脸书GraphQL应用编程接口浏览器

GitHub

要启用GitHub登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择GitHub添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

github添加身份提供程序

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自GitHub。 你需要的一条数据 页面是重定向URI。 当您在那里注册Keycloak为客户端时,您必须将其提供给GitHub,因此 把这个URI复制到你的剪贴板上。

要启用GitHub登录,您首先必须在 GitHub开发人员应用程序

GitHub经常会更改应用程序注册的外观和感觉,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。
添加新应用

github开发人员应用程序

单击注册新申请按钮。

注册应用

github注册应用

你必须复制重定向URI从Keycloak添加身份提供程序页面并将其输入到 授权回调URLGitHub上的字段注册新的OAuth应用程序页。 一旦你完成了这个 页面您将被带到应用程序的管理页面。

GitHub应用程序页面

github应用程序页面

您需要从此页面获取客户端ID和机密,以便将它们输入到Keycloak中添加身份提供程序页。 返回Keycloak并指定这些项目。

GitLab

要启用GitLab登录,您必须完成许多步骤。

首先,去身份提供者左侧菜单项并选择GitLab添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

gitlab添加身份提供程序

在您可以单击之前保存,您必须获得一个客户端ID客户秘密来自GitLab。

你将使用重定向URI在稍后的步骤中,您将在此页面中注册Keycloak作为客户端时提供给GitLab。

要启用GitLab的登录,您首先必须在 GitLab作为OAuth2身份验证服务提供商

GitLab经常会更改应用程序注册的外观和感觉,因此您在GitLab网站上看到的内容可能会有所不同。 如有疑问,请参阅GitLab文档。
添加新应用

gitlab开发人员应用程序

复制重定向URI从Keycloak添加身份提供程序页面,并将其输入到GitLab添加新应用程序页面上的重定向URI字段中。

GitLab应用程序页面

gitlab应用程序页面

完成注册后,单击保存应用程序。 这将打开GitLab中的应用程序管理页面。 从此页面中找到客户端ID和秘密,以便您可以将它们输入到Keycloak中添加身份提供程序页。

要完成,请返回Keycloak并输入它们。 点击保存

谷歌

要启用Google登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择谷歌添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

谷歌添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自谷歌。 你需要的一条数据 页面是重定向URI。 当你在谷歌注册Keycloak作为客户时,你必须把它提供给谷歌,所以 把这个URI复制到你的剪贴板上。

要启用Google登录,您首先必须在谷歌开发者控制台。 然后,您需要将客户端ID和秘密复制到Keycloak管理控制台。

Google经常会更改Google开发人员控制台的外观,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。

让我们先看看如何使用Google创建项目。

谷歌开发者控制台

谷歌开发者控制台

单击创建项目按钮。 使用任何值项目名称项目ID您想要的,然后单击创建按钮。 等待项目创建 (这可能需要一段时间)。 创建后,您将被带到项目的仪表板。

仪表板

谷歌仪表板

然后导航到Api和服务Google开发人员控制台中的部分。 在该屏幕上,导航到凭据行政管理。

当用户从Keycloak登录到Google时,他们将看到来自Google的同意屏幕,该屏幕将询问用户 如果允许Keycloak查看有关其用户配置文件的信息。 因此,在为其创建任何秘密之前,Google需要有关该产品的一些基本信息。 对于新项目,您必须首先配置OAuth同意屏幕

对于非常基本的设置,填写应用程序名称就足够了。 您还可以在此页面中设置其他详细信息,例如Google api的范围。

填写OAuth同意屏幕详细信息

谷歌oauth同意屏幕

下一步是创建OAuth客户端ID和客户端秘密。 回到凭据管理,导航到凭据选项卡并选择OAuth客户端标识创建凭据按钮。

创建凭据

谷歌创建凭据

然后你将被带到创建OAuth客户端ID页。 选择Web应用程序作为应用程序类型。 为您的客户指定您想要的名称。 你还需要 复制并粘贴重定向URI从Keycloak添加身份提供程序页面进入 授权重定向uri场。 完成此操作后,单击创建按钮。

创建OAuth客户端ID

谷歌创建oauth id

单击后创建你将被带到凭据页。 单击您的新OAuth 2.0客户端ID查看 您的新Google客户端的设置。

谷歌客户端凭证

谷歌客户端凭证

您需要从此页面获取客户端ID和机密,以便将它们输入到Keycloak中添加身份提供程序页。 返回Keycloak并指定这些项目。

一个配置选项,用于在添加身份提供程序谷歌的页面是默认范围场。 此字段允许您手动指定用户在与此提供程序进行身份验证时必须授权的范围。 有关范围的完整列表,请查看https://developers.google.com/oauthplayground/。 默认情况下,Keycloak 使用以下范围:openid 简介 电子邮件

如果您的组织使用G套件,并且您希望仅限制对组织成员的访问, 您必须将用于G套件的域输入到托管域字段来启用它。

领英

要启用LinkedIn登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择领英添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

在添加身份提供程序中链接

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自LinkedIn。 你需要的一条数据 页面是重定向URI。 当你在LinkedIn注册Keycloak为客户时,你必须把它提供给LinkedIn,所以 把这个URI复制到你的剪贴板上。

要启用LinkedIn登录,您首先必须在LinkedIn开发者网络

LinkedIn可能会改变应用程序注册的外观和感觉,因此这些方向可能并不总是最新的。
开发者网络

在开发者网络中链接

点击创建应用程序按钮。 这将把你带到创建新应用程序页。

创建应用

在创建应用程序中链接

用适当的值填写表格,然后单击提交按钮。 这将带您进入新应用程序的设置页面。

应用程序设置

在应用程序设置中链接

选择r_basicprofileR _ 电子邮件地址默认应用权限节。 你必须复制重定向URI从Keycloak添加身份提供程序页面并将其输入到 OAuth 2.0 授权重定向urlLinkedIn应用程序设置页面上的字段。 不要忘记点击更新按钮后 你这样做!

然后,您需要从此页面获取客户端ID和机密,以便可以将它们输入到Keycloak中添加身份提供程序页。 返回Keycloak并指定这些项目。

微软

要启用Microsoft登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择微软添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

微软添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自微软。 你需要的一条数据 页面是重定向URI。 当你在那里注册Keycloak作为客户时,你必须向微软提供这些信息,所以 把这个URI复制到你的剪贴板上。

要启用Microsoft帐户登录,您首先必须在Microsoft注册OAuth应用程序。 去微软应用程序注册url。

Microsoft经常会更改应用程序注册的外观和感觉,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。
注册申请

微软应用注册

输入应用程序名称,然后单击创建应用程序。 这将带您进入您的应用程序设置页面 新的应用程序。

设置

微软应用程序设置

你必须复制重定向URI从Keycloak添加身份提供程序页面并将其添加到 重定向uriMicrosoft应用程序页面上的字段。 请务必单击添加Url按钮和保存你的改变。

最后,您需要从此页面获取应用程序ID和机密,以便可以将它们重新输入到Keycloak上添加身份提供程序页。 返回Keycloak并指定这些项目。

从2018年11月开始,微软将取消对实时SDK应用编程接口的支持,转而支持新的微软图形应用编程接口。 Keycloak Microsoft identity provider已更新为使用新的端点,因此请确保升级到 Keycloak版本4.6.0或更高版本,以便使用此提供程序。 此外,在 “实时SDK应用程序” 下向Microsoft注册的客户端应用程序将需要重新注册 在微软应用程序注册门户以获取应用程序id,该应用程序id 与微软图形应用编程接口兼容。

开放式轮班3

OpenShift Online目前处于开发者预览模式。 本文档基于内部安装和本地迷你开发环境。

您只需完成几个步骤即可启用OpenShift登录。 首先,去身份提供者左侧菜单项 并选择开放班次添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

openshift添加身份提供程序

注册OAuth客户端

您可以使用oc命令行工具。

$ oc create -f <(回声'
种类: OAuthClient
apiVersion: v1
元数据:
 名称: kc-客户端(1)
秘密: “&hellip;&hellip;”(2)
重定向:
 -"http://www.example.com/"(3)
Grantmethop: 提示(4)
')
1 名称你的OAuth客户。 传递为客户id请求参数时,向<openshift_master>/oauth/授权<openshift_master>/oauth/令牌
2 秘密用作客户 _ 秘密请求参数。
3 重定向uri在请求中指定的参数<openshift_master>/oauth/授权<openshift_master>/oauth/令牌必须等于 (或前缀为) 中的一个uri重定向
4 grantMethod用于确定当此客户端请求令牌且尚未被用户授予访问权限时要采取的操作。

使用由oc创建命令将它们放回Keycloak添加身份提供程序页。 返回Keycloak并指定这些项目。

请参考官方OpenShift文档有关更详细的指南。

开放班次4

在配置OpenShift 4身份提供程序之前,请找到正确的OpenShift 4 API URL。 在某些情况下,该URL可能对用户隐藏。 获取它的最简单方法是调用以下命令 (这可能需要安装jq单独命令)curl -s -k -H “授权: 承载 $(oc whoami -t)”。状态。apiServerURL”。 在大多数情况下,地址会被HTTPS保护。 因此,配置X509 _ ca _ 捆绑包在容器中,并将其设置为/var/run/secrets/kubernetes.io/serviceaccount/ca.crt。 否则,Keycloak将无法通信 与API服务器。

您只需完成几个步骤即可启用OpenShift 4的登录。 首先,去身份提供者左侧菜单项并选择开放式转换v4添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

openshift 4添加身份提供程序

注册OAuth客户端

您可以使用oc命令行工具。

$ oc create -f <(回声'
种类: OAuthClient
apiVersion: v1
元数据:
 名称: Keycloak经纪人(1)
秘密: “&hellip;&hellip;”(2)
重定向:
 -"<从OpenShift 4身份提供程序页面复制粘贴的重定向URI>"(3)
Grantmethop: 提示(4)
')
1 名称你的OAuth客户。 传递为客户id请求参数时,向<openshift_master>/oauth/授权<openshift_master>/oauth/令牌。 的名称参数需要相同 在OAuthClient对象以及Keycloak配置中。
2 秘密用作客户 _ 秘密请求参数。
3 重定向uri在请求中指定的参数<openshift_master>/oauth/授权<openshift_master>/oauth/令牌必须等于 (或前缀为) 中的一个uri重定向。 正确配置它的最简单方法是复制粘贴 它来自Keycloak OpenShift 4身份提供程序配置页面 (重定向URI字段)。
4 grantMethod用于确定当此客户端请求令牌且尚未被用户授予访问权限时要采取的操作。

使用由oc创建命令将它们放回Keycloak添加身份提供程序页。 返回Keycloak并指定这些项目。

OpenShift API服务器返回客户端无权使用此方法请求令牌每当OAuthClient 名称,秘密或者重定向是不正确的。 确保将它们正确复制粘贴到Keycloak OpenShift 4身份提供程序页面中。

请参考官方OpenShift文档有关更详细的指南。

贝宝

您必须完成许多步骤才能启用PayPal登录。 首先,去身份提供者左侧菜单项 并选择贝宝添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

贝宝添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自贝宝。 你需要的一条数据 页面是重定向URI。 当您在那里注册Keycloak为客户时,您必须将其提供给PayPal,因此 把这个URI复制到你的剪贴板上。

要启用PayPal登录,您首先必须在 贝宝开发者应用程序

添加新应用

贝宝开发者应用程序

单击创建应用按钮。

注册应用

贝宝注册应用

您现在将被带到应用程序设置页面。

进行以下更改
  • 选择配置沙箱或Live (如果尚未启用目标沙箱打开添加身份提供程序页面)

  • 复制客户端ID和秘密,以便您可以将它们粘贴到密钥斗篷中添加身份提供程序页。

  • 向下滚动到应用程序设置

  • 复制重定向URI从Keycloak添加身份提供程序页面并将其输入到返回URL场。

  • 检查使用贝宝登录复选框。

  • 检查全名个人信息部分下的复选框。

  • 检查电子邮件地址地址信息部分下的复选框。

  • 添加指向您域中相应页面的隐私和用户协议URL。

堆栈溢出

您必须完成许多步骤才能启用堆栈溢出登录。 首先,去身份提供者左侧菜单项 并选择堆栈溢出添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

堆栈溢出添加身份提供程序

要启用堆栈溢出登录,您首先必须在堆栈应用。 去在堆栈应用程序上注册您的应用程序URL和登录。

堆栈溢出通常会更改应用程序注册的外观和感觉,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。
注册申请

堆栈溢出应用程序注册

输入应用程序名称和应用程序的OAuth域名,然后单击注册您的申请。 输入你想要的任何东西 对于其他项目。

设置

堆栈溢出应用设置

最后,您需要从此页面获取客户端ID,密钥和密钥,以便可以将它们重新输入到密钥斗篷上添加身份提供程序页。 返回Keycloak并指定这些项目。

推特

要启用Twitter登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择推特添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

twitter添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密从推特上。 你需要的一条数据 页面是重定向URI。 当你在那里注册Keycloak为客户时,你必须把它提供给Twitter,所以 把这个URI复制到你的剪贴板上。

要使用Twtter启用登录,您首先必须在Twitter应用管理

注册申请

twitter应用注册

点击创建新应用按钮。 这将把你带到创建应用程序页。

注册申请

twitter应用程序创建

输入名称和描述。 该网站可以是任何东西,但不能有一个本地主机地址。 对于 回调URL您必须复制重定向URI从Keycloak添加身份提供程序页。

你不能使用本地主机回调URL。 取而代之的是用127.0.0.1如果您试图在笔记本电脑上测试驱动器Twitter登录。

点击保存后,您将被带到详细信息页。

应用详细信息

twitter详细信息

接下来转到密钥和访问令牌tab。

密钥和访问令牌

推特密钥

最后,您需要从此页面获取API密钥和密钥,然后将它们复制回客户端ID客户秘密Keycloak上的字段添加身份提供程序页。

Instagram

要启用Instagram登录,您必须完成许多步骤。 首先,去身份提供者左侧菜单项 并选择Instagram添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

instagram添加身份提供商

您还不能单击保存,因为您需要获取一个客户端ID客户秘密来自Instagram。 你需要的一条数据 页面是重定向URI。 当你在Instagram上注册Keycloak作为客户时,你必须把它提供给Instagram,所以 把这个URI复制到你的剪贴板上。

要启用Instagram登录,您首先必须创建一个项目和一个客户端。 Instagram API通过Facebook开发者控制台

Facebook经常会更改Facebook开发人员控制台的外观,因此这些方向可能并不总是最新的,并且 配置步骤可能略有不同。

登录控制台后,屏幕右上角有一个菜单,显示我的应用程序。 选择添加新应用 菜单项。

添加新应用

instagram添加新应用

选择对于其他一切

创建新的应用ID

instagram创建应用程序id

填写所有必填字段。 完成此操作后,您将被带到仪表板 对于应用程序。 在左侧导航面板的菜单中选择基本设置

添加平台

instagram添加平台

选择+ 添加平台在底部,然后单击[网站]带有地球仪图标。 指定您网站的URL。

添加产品

instagram添加产品

选择仪表板从左侧菜单中单击设置在Instagram框中。 在左侧菜单中,然后选择基本显示Instagram 并点击创建新应用

创建新的Instagram应用程序ID

instagram创建instagram应用id

指定显示名称

设置应用程序

instagram应用设置

复制并粘贴重定向URI从Keycloak添加身份提供程序页面进入有效的OAuth重定向uriInstagram的客户端OAuth设置设置块。

您也可以将此URL用于取消授权回调URL数据删除请求URL。 Keycloak目前不支持它们中的任何一个, 但是Facebook开发人员控制台要求将两者都填满。

您还需要从此页面获取应用程序ID和应用程序秘密,以便您可以将它们输入到Keycloak中添加身份提供程序页。 要获得这个点击显示应用秘密。 返回Keycloak并指定这些项目,最后保存您的Instagram身份提供商。

之后,有必要将Instagram应用程序公开。 点击应用审查左侧菜单项,然后请求。 之后,按照屏幕上的说明进行操作。

OpenID Connect v1.0身份提供商

Keycloak可以基于OpenID Connect协议代理身份提供者。 这些国内流离失所者必须支持授权代码流 如规范所定义的,以便对用户进行身份验证并授权访问。

要开始配置OIDC提供程序,请转到身份提供者左侧菜单项 并选择OpenID连接v1.0添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

oidc添加身份提供商

此页面上的初始配置选项在一般IDP配置。 您还必须定义OpenID Connect配置选项。 他们基本上描述了您正在与之交流的OIDC IDP。

表2。 OpenID连接配置
配置 描述

授权URL

OIDC协议要求的授权URL端点。

令牌URL

OIDC协议要求的令牌URL端点。

注销网址

OIDC协议中定义的注销URL端点。 此值是可选的。

反向通道注销

反向通道注销是对IDP的后台,带外,REST调用以注销用户。 一些国内流离失所者只能通过浏览器重定向执行注销,因为他们可能 只能通过浏览器cookie识别会话。

用户信息网址

OIDC协议定义的用户信息URL端点。 这是一个端点,可以从中下载用户配置文件信息。

客户端身份验证

切换以定义要与授权码流一起使用的客户端身份验证方法。 在JWT用私钥签名的情况下,领域私钥 被使用。 在其他情况下,必须定义客户端秘密。 有关更多详细信息,请参见客户端身份验证规范

客户端ID

该领域将充当外部IDP的OIDC客户端。 使用授权码流时,您的领域将需要OIDC客户端ID 与外部国内流离失所者互动。

客户秘密

在使用授权代码流时,此领域将需要客户端秘密来使用。 此字段的值可以引用外部的值保险库

客户端断言签名算法

签名算法创建JWT断言作为客户端身份验证。 在使用私钥或客户端机密作为JWT签名的jwt的情况下,它是必需的。 如果未指定算法,则调整以下算法。 RS256适用于使用私钥签名的JWT的情况。 HS256在客户秘密的情况下改编为jwt。

发行人

国内流离失所者的答复可能包含发行人的索赔。 此配置值是可选的。 如果指定,此声明将根据您提供的值进行验证。

默认范围

与身份验证请求一起发送的OIDC范围的空间分隔列表。 默认为openid

提示

另一个可选开关。 这是OIDC规范定义的提示参数。 通过它,你可以强制重新认证和其他选项。 参见规范 更多细节。

接受提示 = 无来自客户端的转发

指定IDP是否接受包含prompt = none查询参数的转发的身份验证请求。 当一个领域收到一个带有提示 = 无它检查 如果用户当前已通过身份验证,并且通常返回登录 _ 必需如果用户未登录,则错误。 但是,当可以确定默认的IDP时 对于身份验证请求 (或者通过kc_idp_hint查询参数或通过为领域设置默认IDP),我们应该能够转发身份验证请求 提示 = 无到默认的IDP,以便它检查用户当前是否在那里进行了身份验证。 因为并非所有国内流离失所者都支持提示 = 无这个开关 用于指示默认IDP是否支持重定向auth请求之前的param。

重要的是要注意,如果用户未在IDP中进行身份验证,则客户端仍将获得登录 _ 必需错误。 即使用户当前在IDP中进行了身份验证, 客户可能仍然会得到一个交互 _ 需要如果需要用户交互的身份验证或同意页面会显示错误。 这包括所需的操作 (例如更改密码),同意屏幕以及设置为由首次经纪人登录流动或邮政经纪人登录流。

验证签名

另一个可选开关。 这是为了指定Keycloak是否将验证此身份提供者签名的外部ID令牌上的签名。 如果这是打开的, 密钥斗篷将需要知道外部OIDC身份提供程序的公钥。 有关如何设置,请参见下文。 警告: 出于性能目的,Keycloak缓存外部OIDC身份提供程序的公钥。 如果你认为你的身份提供者的私钥 被破坏了,更新密钥显然是好的,但清除密钥缓存也很好。 见 清除缓存部分了解更多详细信息。

使用JWKS网址

适用于验证签名开了。 如果开关打开,则将从给定的JWKS URL下载身份提供者公钥。 这允许很大的灵活性,因为当身份提供者生成新的keypair时,新密钥将始终被重新下载。 如果开关关闭, 然后使用来自Keycloak DB的公钥 (或证书),因此,每当身份提供者keypair更改时,您将始终需要将新密钥也导入Keycloak DB。

JWKS网址

存储身份提供者JWK密钥的URL。 请参阅JWK规范有关更多详细信息。 如果您使用外部Keycloak作为身份提供者,那么您可以使用像http:// broker-keycloak:8180/auth/realms/test/protocol/openid-connect/certs假设你的经纪人 Keycloak正在运行http:// broker-keycloak:8180它的境界是测试

验证公钥

适用于使用JWKS网址关了。 这是PEM格式的公钥,必须用于验证外部IDP签名。

验证公钥Id

适用于使用JWKS网址关了。 此字段以PEM格式指定公钥的ID。 此配置值是可选的。 因为没有标准的方法 为了从密钥中计算密钥ID,各种外部身份提供者可能会使用与Keycloak不同的算法。 如果此字段的值 如果未指定,则上面指定的验证公钥用于所有请求,而与外部IDP发送的密钥ID无关。 设置时,此值 字段用作Keycloak用于验证来自此类提供商的签名的密钥ID,并且必须与IDP指定的密钥ID匹配。

您还可以通过提供指向OpenID提供程序元数据的URL或文件来导入所有这些配置数据 (请参阅OIDC发现规范)。 如果要连接到Keycloak外部IDP,则可以从url导入IDP设置<root>/auth/realms/{realm-name}/。知名/openid-configuration。 此链接是描述有关IDP的元数据的JSON文档。

SAML v2.0身份提供商

Keycloak可以基于SAML v2.0协议代理身份提供者。

要开始配置SAML v2.0提供程序,请转到身份提供者左侧菜单项 并选择SAML v2.0添加提供程序下拉列表。 这将把你带到添加身份提供程序页。

添加身份提供程序

saml添加身份提供者

此页面上的初始配置选项在一般IDP配置。 您还必须定义SAML配置选项。 他们基本上描述了你正在交流的SAML IDP。

表3。 SAML配置
配置 描述

服务提供商实体ID

这是必填字段,并指定远程身份提供程序将用于标识来自此服务提供程序的请求的SAML实体ID。 默认情况下,它被设置为领域基础URL<root>/auth/realms/{领域名称}

单点登录服务URL

这是必填字段,并指定用于启动身份验证过程的SAML端点。 如果您的SAML IDP发布IDP实体描述符,则 该字段将在那里指定。

单一注销服务URL

这是一个可选字段,用于指定SAML注销端点。 如果您的SAML IDP发布IDP实体描述符,则 该字段将在那里指定。

反向通道注销

如果您的SAML IDP支持反向通道注销,请启用。

NameID策略格式

指定与名称标识符格式相对应的URI引用。 默认为urn:oasis: 名称: tc:SAML:2.0:nameid-格式: 持久

主体类型

指定SAML断言的哪一部分将用于识别和跟踪外部用户身份。 可以是主题名称id或SAML属性 (按名称或友好名称)。 无法将主题名称id值与 'urn:oasis:names:tc:SAML:2.0: NameID-format: transient'nameid策略格式值一起设置。

主体属性

如果将主体设置为 “属性 [名称]” 或 “属性 [友好名称]”,则此字段将分别指定标识属性的名称或友好名称。

允许创建

允许外部身份提供程序创建一个新的标识符来表示主体。

HTTP-POST绑定响应

当这个领域响应外部IDP发送的任何SAML请求时,应该使用哪个SAML绑定? 如果设置为,那么将使用重定向绑定。

授权请求的HTTP-POST绑定

当这个领域从外部SAML IDP请求身份验证时,应该使用哪个SAML绑定? 如果设置为,那么将使用重定向绑定。

想要授权请求签名

如果为true,它将使用领域的keypair对发送到外部SAML IDP的请求进行签名。

签名算法

如果想要授权请求签名是on,那么你也可以选择签名算法来使用。

SAML签名键名称

通过POST绑定发送的签名SAML文档包含签名密钥的标识关键字名称 元素。 默认情况下,它包含Keycloak密钥ID。 然而,各种外部SAML国内流离失所者可能 期望一个不同的键名或根本没有键名。 此开关控制是否关键字名称 包含密钥ID (选项密钥id),主题来自与领域密钥相对应的证书 (选项证书主题-例如由微软活动目录联盟 服务),或者从SAML消息中完全省略了密钥名称提示 (选项)。

强制认证

表示即使用户已经登录,用户也将被迫在外部IDP上输入其凭据。

验证签名

领域是否应该期望来自外部IDP的SAML请求和响应进行数字签名。 强烈建议你打开这个!

验证X509证书

将用于验证SAML请求和外部IDP响应的签名的公共证书。

签署服务提供商元数据

如果为真,它将使用领域的keypair在SAML服务提供商元数据描述符

通过主题

是否登录提示查询参数应转发给IDP。 提供时,此login_hint参数将添加到AuthnRequest的主题中。 这允许目标提供商预先填写其登录表单。 如果未提供login_hint,则不会将任何内容作为AuthnRequest主题转发。

属性消费服务索引

标识要向远程IDP请求的属性集。 Keycloak自动将身份提供程序配置中映射的属性添加到自动生成的SP元数据文档中。

属性消费服务名称

在自动生成的SP元数据文档中通告的属性集的描述性名称。

您还可以通过提供指向外部IDP的SAML IDP实体描述符的URL或文件来导入所有这些配置数据。 如果要连接到Keycloak外部IDP,则可以从URL导入IDP设置<根>/auth/领域/{领域名称}/协议/saml/描述符。 此链接是描述有关IDP的元数据的XML文档。

您还可以通过提供指向要连接的外部SAML IDP的实体描述符的URL或XML文件来导入所有这些配置数据。

请求特定的授权上下文

一些身份提供者允许客户端对用于验证用户身份的身份验证方法指定特定约束 (例如请求MFA、Kerberos身份验证、安全要求等)。 这些约束是使用特定的AuthnContext标准指定的。 客户端可以要求一个或多个标准,还可以指定身份提供者应如何精确地或通过满足相同或更好的等效方式匹配所请求的AuthnContext。

您可以通过在 “请求的AuthnContext约束” 部分中添加一个或多个ClassRef或DeclRef来列出服务提供商所需的标准。 通常,您需要提供ClassRefs或DeclRefs; 您应该与您的身份提供者文档核对支持哪些值。 如果不存在ClassRefs或DeclRefs,则身份提供程序将不会强制执行其他约束。

表4。 请求的AuthnContext约束
配置 描述

比较

身份提供者应使用的比较方法来评估上下文要求。 可用值为精确,最小值,最大值或者更好。 默认值为精确

授权上下文类参考

描述所需标准的一个或多个AuthnContext类refs。

授权上下文解密

描述所需标准的一个或多个AuthnContext DeclRefs。

SP描述符

如果您需要访问提供程序的SAML SP元数据,请查找端点身份提供程序配置设置中的项。 它包含一个名为 SAML 2.0服务提供商元数据为服务提供者生成SAML实体描述符。 您可以下载它或复制其URL,然后将其导入远程身份提供程序中。

通过转到URL,此元数据也可以公开获得:

http[s]:// {主机: 端口}/auth/realms/{realm-name}/broker/{broker-alias}/端点/描述符

确保在访问描述符之前保存任何配置更改,否则它们不会反映在元数据中。

在SAML请求中发送主题

默认情况下,指向SAML身份提供者的社交按钮将用户重定向到登录URL:

http[s]://{host:port}/auth/realms/${realm-name}/broker/{broker-alias}/login

添加名为的查询参数登录提示此URL将其值作为主题属性添加到SAML请求中。 当此查询参数不存在或为空时,不会向请求添加任何主题。

必须启用 “传递主题” 选项。

客户建议的身份提供者

OIDC应用程序可以通过指定一个提示来绕过Keycloak登录页面 他们想使用的身份提供者。

这是通过设置kc_idp_hint查询授权代码流授权端点中的参数。

Keycloak OIDC客户端适配器还允许您在访问安全资源时指定此查询参数 在应用程序中。

例如:

获取/myapplication.com?kc_idp_hint = 脸书HTTP/1.1
主机: 本地主机: 8080

在这种情况下,预计您的领域具有别名的身份提供者脸书。 如果此提供程序不存在,则将显示登录表单。

如果你正在使用Keycloak适配器,您也可以实现相同的行为:

varKeycloak =新的Keycloak ('Keycloak。json');

keycloak.createLoginUrl({
        idpHint:'脸书'
});

kc_idp_hint查询参数还允许客户端覆盖默认身份提供程序,如果为身份提供商重定向器认证器。 客户端还可以通过设置kc_idp_hint查询参数为空值。

映射声明和断言

您可以将您正在进行身份验证的外部IDP提供的SAML和OpenID Connect元数据导入到环境中 这个领域。 这允许您提取用户配置文件元数据和其他信息,以便您可以将其提供给您的 应用程序。

通过外部身份提供者登录到您的领域的每个新用户都将在本地为他们创建一个条目 Keycloak数据库,基于来自SAML或OIDC断言和声明的元数据。

如果您单击在身份提供者您的领域页面,您将被带到国内流离失所者 设置tab。 在这一页上还有一个映射器tab。 单击该选项卡以开始映射传入的IDP元数据。

身份提供者映射器

有一个创建这个页面上的按钮。 单击此创建按钮可以创建代理映射器。 代理映射器可以将SAML属性或OIDC ID/访问令牌声明导入用户属性和用户角色映射。

身份提供者映射器

映射器类型列表。 将鼠标悬停在工具提示上,以查看映射器的工作描述。 的 工具提示还描述了您需要输入哪些配置信息。 点击保存你的新映射器将被添加。

当用户重复登录时,映射器会根据同步模式覆盖:

  • 选择遗产来使用以前的Keycloak版本中的行为。

  • 选择导入在使用特定身份提供者首次登录Keycloak期间,仅从首次在Keycloak中创建用户时导入数据。

  • 选择在每次用户登录时更新用户数据。

  • 选择继承要使用在身份提供程序中配置的同步模式,所有其他选项将覆盖此同步模式。

对于基于JSON的声明,您可以使用嵌套的点表示法和方括号按索引访问数组字段。 例如 “联系人。地址 [0]。国家”。

要调查社交提供商提供的用户配置文件JSON数据的结构,您可以启用调试水平记录器组织。Keycloak。社交。用户 _ 配置文件 _ 转储。 这是在服务器的应用程序-服务器配置文件 (domain.xml或standalone.xml) 中完成的。

可用用户会话数据

用户从外部IDP登录后,Keycloak存储了一些其他用户会话注释数据,您可以访问这些数据。 可以通过使用适当的客户端映射器将令牌或SAML断言传递给请求登录的客户端。

身份 _ 提供者

这是用于执行登录的经纪人的IDP别名。

身份 _ 提供者 _ 身份

这是当前经过身份验证的用户的IDP用户名。 这通常与Keycloak用户名相同,但不一定需要。 例如Keycloak用户约翰可以链接到Facebook用户john123@gmail.com,因此在这种情况下,用户会话注释的值将为john123@gmail.com

您可以使用协议映射器类型用户会话注释将此信息传播给您的客户。

首次登录流程

当用户通过身份代理登录时,用户的某些方面将被导入并链接到领域的本地数据库中。 当Keycloak通过外部身份提供者成功验证用户时 可以有两种情况:

  • 已经有一个Keycloak用户帐户导入并与经过身份验证的身份提供者帐户链接。 在这种情况下,Keycloak将只是作为现有用户进行身份验证,并重定向回应用程序。

  • 尚未为此外部用户导入和链接现有的Keycloak用户帐户。 通常您只想注册新帐户并将其导入Keycloak数据库,但是如果存在 使用相同电子邮件的Keycloak帐户? 自动将现有本地帐户链接到外部 身份提供者是一个潜在的安全漏洞,因为您不能总是信任从外部身份提供者那里获得的信息。

不同的组织在处理上面列出的一些冲突和情况时有不同的要求。 为此,有一个首次登录流程IDP设置中的选项,允许您选择工作流那将是 用户第一次从外部IDP登录后使用。 默认情况下,它指向首次经纪人登录流,但您可以配置和使用自己的流,并为不同的身份提供程序使用不同的流。

流本身是在管理控制台下配置的身份验证tab。 当你选择首次经纪人登录流,您将看到默认情况下使用的身份验证器。 您可以重新配置现有流程。 (例如,您可以禁用某些身份验证器,将其中一些标记为必需,配置一些身份验证器等)。

您还可以创建一个新的身份验证流和/或编写自己的身份验证器实现,并在您的流中使用它。 见服务器开发指南有关更多详细信息。

默认首次登录流程

让我们描述由首次经纪人登录流。

审查档案

此身份验证器可能会显示 “配置文件信息” 页面,用户可以在其中查看从身份提供者检索的配置文件。 身份验证器是可配置的。 您可以设置首次登录时更新配置文件选项。 当,将始终向用户显示个人资料页面,以询问其他信息以联合其身份。 当失踪,仅当身份提供者未提供某些强制性信息 (电子邮件,名字,姓氏) 时,才会向用户显示个人资料页面。 如果,除非用户在以后的阶段单击,否则不会显示个人资料页面查看个人资料信息链接 (后期阶段显示的页面 由确认链接现有帐户身份验证器)。

创建用户 (如果唯一)

此身份验证器检查是否已经存在具有与身份提供商的帐户相同的电子邮件或用户名的现有Keycloak帐户。 如果不是,那么身份验证器只需创建一个新的本地Keycloak帐户并将其与身份提供程序链接,整个流程就完成了。 否则它会转到下一个处理现有帐户子流。 如果您始终希望确保没有重复的帐户,则可以将此身份验证器标记为必需。 在这种情况下,用户 如果存在现有的Keycloak帐户,并且用户需要通过帐户管理链接身份提供商帐户,则会看到错误页面。

如果您希望跳过创建新用户的功能,但希望通过身份提供者身份验证的用户必须已经存在于Keycloak中,具有与来自身份提供者的用户相同的用户名或电子邮件,则可以创建新流程并替换创建用户 (如果存在)认证器检测现有代理用户。 更多详细信息下面的示例
确认链接现有帐户

在信息页面上,用户将看到一个现有的Keycloak帐户具有相同的电子邮件。 他们可以再次查看他们的个人资料,并使用不同的电子邮件或用户名 (flow重新启动并返回到审查档案身份验证器)。 或者他们可以确认他们想要将他们的身份提供者帐户与他们现有的Keycloak帐户联系起来。 如果您不希望用户看到此确认页面,而是通过电子邮件验证或重新身份验证直接转到链接身份提供商帐户,请禁用此身份验证器。

通过电子邮件验证现有帐户

这个认证器是替代方案默认情况下,因此仅在领域配置了SMTP设置时才使用。 它将向用户发送电子邮件,在那里他们可以确认他们想要将身份提供商与他们的Keycloak帐户链接。 如果您不想通过电子邮件确认链接,而是始终希望用户使用其密码 (或者OTP) 重新进行身份验证,请禁用此功能。

通过重新认证验证现有帐户

如果电子邮件验证器被禁用或不可用 (SMTP未为领域配置),则使用此验证器。 它将显示一个登录屏幕 其中用户需要进行身份验证以将其Keycloak帐户与身份提供者链接。 用户还可以使用已经链接到其Keycloak帐户的某些不同身份提供者重新进行身份验证。 您也可以强制用户使用OTP。 否则,它是可选的,并且仅在已经为用户帐户设置OTP的情况下才使用。

在用户可以使用任意用户名/电子邮件地址注册自己的通用环境中,自动链接认证器将是危险的。 除非精心策划了用户注册并分配了用户名/电子邮件地址,否则请勿使用此身份验证器。

为了配置在其中自动链接用户而无需提示的第一个登录流程,请使用以下两个身份验证器创建一个新流程:

创建用户 (如果唯一)

此身份验证器可确保处理唯一用户。 将验证器要求设置为 “替代”。

自动设置现有用户

自动将现有用户设置为身份验证上下文,而无需任何验证。 将验证器要求设置为 “替代”。

所描述的设置使用两个身份验证器。 这种设置是最简单的,但是可以使用其他 根据您的需要进行身份验证。 例如,如果您仍然希望,可以将审阅配置文件身份验证器添加到流程的开头 最终用户确认他们的个人资料信息。 您还可以在此流中添加身份验证机制,从而迫使用户验证其凭据。 这个 将需要更复杂的流,例如在 “替代” 子流中设置 “自动设置现有用户” 和 “密码表单” 为 “必需”。

禁用自动用户创建

默认的第一个登录流程将查找与外部身份匹配的Keycloak帐户,然后将提供链接它们; 如果没有匹配的Keycloak帐户,它将自动创建一个。 这种默认行为可能不适合某些设置,例如,当使用只读LDAP用户存储时 (这意味着所有用户都是预先创建的)。 在这种情况下,应该关闭自动用户创建。 要禁用用户创建:

  • 打开首次经纪人登录流量配置;

  • 设置创建用户 (如果唯一)禁用;

  • 设置确认链接现有帐户禁用

此配置还意味着Keycloak本身将无法确定哪个内部帐户将与外部标识相对应。 因此,通过重新认证验证现有帐户身份验证器将要求用户提供用户名和密码。

检测现有用户首次登录流程

为了配置第一个登录流程,其中:

  • 只有已经在这个领域注册的用户才能登录,

  • 用户自动链接,无需提示,

使用以下两个身份验证器创建一个新流程:

检测现有代理用户

此身份验证器可确保处理唯一用户。 将验证器要求设置为强制性

自动设置现有用户

自动将现有用户设置为身份验证上下文,而无需任何验证。 将验证器要求设置为强制性

你必须设置首次登录流程该流的身份提供者配置。 您可以设置也可以设置同步模式如果要使用identity provider属性更新用户配置文件 (姓氏,名字&hellip;&hellip;)。

如果您想将身份委托给其他身份提供商 (如github、facebook &hellip; ),但您想管理哪些用户可以登录,则可以使用此流程。

检索外部IDP令牌

Keycloak允许您使用外部IDP存储来自身份验证过程的令牌和响应。 为此,您可以使用存储令牌IDP设置页面上的配置选项。

应用程序代码可以检索这些令牌和响应,以获取额外的用户信息,或在外部IDP上安全地调用请求。 例如,应用程序可能希望使用Google令牌在其他Google服务和REST api上进行调用。 要检索特定身份提供者的令牌,您需要发送如下请求:

GET /auth/realms/{realm}/broker/{provider_alias}/令牌HTTP/1.1
主机: 本地主机: 8080
授权: 承载 <密钥斗篷访问令牌>

应用程序必须已通过Keycloak进行身份验证,并已收到访问令牌。 此访问令牌 将需要有经纪人客户级角色读取令牌集。 这意味着用户必须具有此角色的角色映射 并且客户端应用程序必须在其范围内具有该角色。 在这种情况下,鉴于您正在Keycloak中访问受保护的服务,您需要在用户身份验证期间发送Keycloak发出的访问令牌。 在broker配置页面中,您可以通过打开存储的令牌可读开关。

可以通过提供者再次登录或使用客户端发起的帐户链接API来重新建立这些外部令牌。

身份代理注销

当触发从Keycloak注销时,Keycloak将向外部身份提供程序发送请求 用于登录Keycloak,并且用户也将从该身份提供程序中注销。 可以跳过此行为并避免在外部身份提供者处注销。 见适配器注销文档有关更多详细信息。

用户会话管理

当用户登录到一个领域时,Keycloak为他们维护一个用户会话,并记住他们的每个客户端 在会议期间访问过。 有很多行政管理 领域管理员可以在这些用户会话上执行的功能。 他们可以查看整个领域的登录统计信息,然后向下潜 进入每个客户端,看看谁登录了,在哪里。 管理员可以从管理控制台注销一个用户或一组用户。 他们 可以撤销令牌并在那里设置所有令牌和会话超时。

管理会议

如果你去会议左侧菜单项您可以看到该领域中当前活动的会话数的顶层视图。

会议

会议

给出了客户端列表以及该客户端当前有多少个活动会话。 你也可以全部注销 通过单击领域中的用户全部注销此列表右侧的按钮。

的局限性全部注销操作

现在,任何SSO cookie集都将无效,并且在活动浏览器会话中请求身份验证的客户端现在必须 重新登录。 只有某些客户端会收到此注销事件的通知,特别是正在使用Keycloak的客户端 OIDC客户端适配器。 其他客户端类型 (例如SAML) 将不会收到反向通道注销请求。

重要的是要注意,任何未完成的访问令牌都不会通过单击来撤销全部注销。 他们必须 自然到期。 你必须推一个撤销策略出去到 客户端,但这也仅适用于使用Keycloak OIDC客户端适配器的客户端。

应用钻速

会议页,您也可以向下钻取到每个客户端。 这将把你带到会议那个客户的标签。 点击显示会话那里的按钮允许您查看哪些用户登录到该应用程序。

申请会话

申请会话

用户向下钻进

如果你去会议单个用户的选项卡,您还可以查看会话信息。

用户会话

用户会话

撤销策略

如果您的系统受到威胁,您将需要一种撤销已分发的所有会话和访问令牌的方法。 你可以通过去撤销的选项卡会议屏。

撤销

撤销

您只能设置基于时间的撤销策略。 控制台允许您指定任何会话的时间和日期 或在该时间和日期之前发行的令牌无效。 的设置为现在会将策略设置为当前时间和日期。 的按钮会将此撤销策略推送给任何具有Keycloak的已注册OIDC客户端 安装了OIDC客户端适配器。

会话和令牌超时

Keycloak为您提供了对会话、cookie和令牌超时的精细控制。 这都是在 令牌选项卡中的领域设置左侧菜单项。

令牌选项卡

令牌选项卡

让我们浏览一下此页面上的每个项目。

配置 描述

默认签名算法

用于为此领域分配令牌的默认算法。

撤销刷新令牌

对于正在执行刷新令牌流的OIDC客户端,此标志 (如果启用) 将撤消该刷新令牌,并向另一个令牌发出客户端必须使用的请求。 结果是每个刷新令牌只使用一次。

SSO会话空闲

也与OIDC客户有关。 如果用户不活动的时间超过此超时时间,则用户会话将无效。 客户端请求身份验证或刷新令牌请求重置空闲超时。 在会话无效生效之前,总是在空闲超时中添加一个小的时间窗口。 请参阅下面的注释。

SSO会话最大值

用户会话到期和失效之前的最长时间。 此选项控制用户会话可以保持活动的最长时间,而与用户活动无关。

SSO会话空闲记住我

与标准SSO会话空闲配置相同,但特定于启用 “记住我” 的登录。 它允许更长的规格 在登录过程中选择了 “记住我” 时的会话空闲超时。 这是可选配置,如果未设置为值 大于0它使用与SSO会话空闲配置中设置的相同的空闲超时。

SSO会话Max记住我

与标准SSO会话最大值相同,但特定于启用 “记住我” 的登录。 它允许使用寿命更长的规格 在登录过程中选择了 “记住我” 时的会话。 这是可选配置,如果未设置为大于0的值 它使用与SSO会话最大配置中设置的相同的会话寿命。

离线会话空闲

对于离线访问,这是在撤消脱机令牌之前允许会话保持空闲的时间。 在会话无效生效之前,总是在空闲超时中添加一个小的时间窗口。 请参阅下面的注释。

离线会话最大值有限

对于离线访问,如果此标志为on,则启用脱机会话Max,以控制脱机令牌保持活动的最长时间,而与用户活动无关。 还启用了客户端脱机会话空闲和客户端脱机会话最大。

离线会话最大值

对于离线访问,这是撤销相应的离线令牌之前的最长时间。 此选项控制离线令牌保持活动的最长时间,而与用户活动无关。

客户端离线会话空闲

对于离线访问,如果用户不活动的时间超过此超时时间,则脱机令牌请求将增加空闲超时时间。 它允许指定脱机令牌的空闲超时比脱机会话空闲超时更短。 但是,它可以在单个客户端上覆盖。 这是一个可选配置,如果未设置为大于0的值,则使用在脱机会话空闲配置中设置的相同空闲超时。

客户端离线会话最大值

对于离线访问,离线令牌过期和失效之前的最长时间。 它允许指定脱机令牌的超时时间比脱机会话超时时间短。 但是,它可以在单个客户端上覆盖。 这是一个可选配置,如果未设置为大于0的值,则使用在脱机会话最大配置中设置的相同空闲超时。

客户端会话空闲

如果用户不活动的时间超过此超时时间,则刷新令牌请求将增加空闲超时时间。 它允许指定比会话空闲超时更短的刷新令牌空闲超时。 它可以在单个客户端上被覆盖。 这是一个可选配置,如果未设置为大于0的值,则使用在SSO会话空闲配置中设置的相同空闲超时。

客户端会话最大值

刷新令牌过期和失效之前的最长时间。 它允许指定比会话超时更短的刷新令牌超时。 它可以在单个客户端上被覆盖。 这是一个可选配置,如果未设置为大于0的值,则使用在SSO会话最大配置中设置的相同空闲超时。

访问令牌寿命

创建OIDC访问令牌时,此值会影响过期。

隐式流的访问令牌寿命

使用隐式流,不提供刷新令牌。 因此,使用隐式流创建的访问令牌有一个单独的超时。

客户端登录超时

这是客户端在OIDC中完成授权码流的最长时间。

登录超时

登录必须花费的总时间。 如果身份验证花费的时间超过此时间,则用户将不得不重新开始身份验证过程。

登录操作超时

用户在身份验证过程中可以在任何一个页面上花费的最长时间。

用户启动的操作寿命

用户发送的操作许可 (例如,忘记密码电子邮件) 过期之前的最长时间。 建议将此值设为短值,因为预计用户会迅速对自创动作做出反应。

默认管理员启动的操作寿命

管理员发送给用户的操作许可到期之前的最长时间。 建议此值较长,以允许管理员为当前处于脱机状态的用户发送电子邮件。 默认超时可以在发出令牌之前被覆盖。

覆盖用户启动的操作寿命

允许每个操作具有独立超时的可能性 (例如,电子邮件验证,忘记密码,用户操作和身份提供商电子邮件验证)。 此字段是可选的。 如果未指定任何内容,则默认为在以下位置配置的值用户启动的操作寿命

对于空闲超时,有一个小的时间窗口 (2分钟),在此期间会话保持未过期。 例如,当你有 超时设置为30分钟,实际上是会话到期前的32分钟。 这对于在 集群和跨数据中心环境,如果令牌在一个集群节点上刷新了很短的时间, 过期,同时其他群集节点将错误地将会话视为已过期,因为它们尚未收到 关于从进行刷新的节点成功刷新的消息。

离线访问

离线访问是中描述的功能OpenID连接规范。 这个想法是,在登录期间,您的客户端应用程序将请求脱机令牌,而不是经典的刷新令牌。 应用程序可以将此脱机令牌保存在数据库或磁盘上,即使用户已注销,也可以稍后使用它。 如果您的应用程序需要代表用户执行一些 “离线” 操作,即使用户不在线,这也很有用。 一个例子是每天晚上定期备份一些数据。

您的应用程序负责在某些存储 (通常是数据库) 中保留脱机令牌,然后使用它从Keycloak服务器检索新的访问令牌。

经典刷新令牌和离线令牌的区别在于,离线令牌默认情况下永远不会过期,并且不受SSO会话空闲超时SSO会话最大寿命。 即使在用户注销或服务器重新启动后,脱机令牌也是有效的。 但是,默认情况下,您确实需要每30天至少使用一次脱机令牌进行刷新令牌操作 (此值,离线会话空闲超时,可以在管理控制台中更改令牌选项卡下领域设置)。 此外,如果您启用该选项离线会话最大值有限,则脱机令牌将在60天后过期,无论是否使用脱机令牌进行刷新令牌操作 (此值,离线会话最大值,也可以在 “领域设置” 下的 “令牌” 选项卡中的管理控制台中进行更改)。 另外,如果您启用该选项撤销刷新令牌,那么每个离线令牌只能使用一次。 因此,刷新后,您始终需要将来自刷新响应的新脱机令牌存储到您的数据库中,而不是前一个。

用户可以在用户帐户服务。 管理员用户可以在管理控制台中撤销单个用户的离线令牌同意书特定用户的选项卡。 管理员还可以查看在离线访问每个客户端的选项卡。 离线令牌也可以通过设置撤销策略

为了能够发布离线令牌,用户需要具有领域级别角色的角色映射离线访问。 客户还需要在其范围内扮演该角色。 最后,客户端需要有一个离线访问客户端范围添加为可选 客户端范围到它,这是默认情况下完成的。

客户端可以通过添加参数来请求离线令牌范围 = 离线访问向Keycloak发送授权请求时。 当您使用Keycloak OIDC客户端适配器访问应用程序的安全URL时,它会自动添加此参数 (即 http:// localhost:8080/customer-portal/secsed?scope = offline_access)。 直接访问赠款和服务账户也 支持离线令牌,如果您包括范围 = 离线访问在身份验证请求的正文中。

离线会话预加载

除了Infinispan缓存之外,脱机会话还存储在数据库中,这意味着即使在服务器重新启动后它们也将可用。 默认情况下,脱机会话在服务器启动期间从数据库预加载到Infinispan缓存中。 然而,如果有许多离线会话要预加载,这种方法有一个缺点。 它可以显著减慢服务器的启动时间。

为了克服这个问题,可以将Keycloak配置为按需将离线会话提取到Infinispan缓存中。 它可以通过设置来实现从数据库预加载离线会话中的财产用户会话SPI至

下面的示例演示如何配置延迟脱机会话加载。

<子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
    ...
    <spi 名称=用户会话>
        <默认提供程序>infinispan</默认提供程序>
        <提供者 名称=infinispan 已启用=>
            <属性>
                <属性 名称=从数据库预加载离线会话 =/>
            </属性>
        </提供者>
    </spi>
    ...
</子系统>

使用CLI命令的等效配置:

/子系统 = 密钥斗篷-服务器/spi = 用户会话: 添加 (默认提供程序 = infinispan)
/子系统 = keycloak-server/spi = 用户会话/提供程序 = infinispan: 添加 (属性 ={preloadOfflineSessionsFromDatabase => "false"},enabled = true)

短暂会话

Keycloak具有瞬态会话的概念。 当使用临时会话时,在成功身份验证后没有创建真正的用户会话。 仅为成功验证用户身份的当前请求的范围创建临时临时会话。 此瞬态会话允许Keycloak 要运行协议映射器身份验证后。

当使用临时会话时,客户端应用程序无法刷新或内省令牌或检查特定会话是否有效。 在某些情况下,不需要这些操作,因此可以避免用户会话持久化的额外开销。 这将意味着节省性能,内存和网络通信 (在群集和跨数据中心环境的情况下)。

用户存储联盟

许多公司都有现有的用户数据库,这些数据库保存有关用户及其密码或其他凭据的信息。 在许多情况下,不可能从那些现有商店迁移到纯Keycloak部署。 Keycloak可以联合现有的外部用户数据库。 默认情况下,我们支持LDAP和Active Directory,但是您也可以为任何自定义扩展编写自己的扩展名 使用我们的用户存储SPI的用户数据库。

它的工作方式是,当用户登录时,Keycloak会查看自己的内部用户存储以查找用户。 如果它在那里找不到它,它将迭代 在您为领域配置的每个用户存储提供商上,直到找到匹配项。 来自外部存储的数据被映射到由Keycloak消耗的公共用户模型中 运行时。 然后可以将此通用用户模型映射到OIDC令牌声明和SAML断言属性。

外部用户数据库很少有支持Keycloak拥有的所有功能所需的每一条数据。 因此,用户存储提供商可以选择在Keycloak用户存储中本地存储一些东西。 一些提供商甚至在本地导入用户并定期与外部存储同步。 这种方法取决于提供者的能力及其配置方式。 例如,您的 外部用户商店可能不支持OTP。 根据提供商的不同,此OTP可以由Keycloak处理和存储。

添加提供程序

要添加存储提供程序,请转到用户联合管理控制台中的左侧菜单项。

用户联合

用户联合

在中心,有一个添加提供程序列表框。 选择要添加的提供程序类型,您将被带到该提供程序的配置页面。

处理提供商故障

如果用户存储提供程序失败 (例如,您的LDAP服务器已关闭),则您可能无法登录,并且可能无法在管理控制台中查看用户。 使用存储提供程序查找用户时,Keycloak不会捕获故障。 它将中止调用。 所以,如果你有一个更高的存储提供商 在用户查找期间失败的优先级,登录或用户查询将完全失败,并出现异常并中止。 它不会故障转移到下一个配置的提供程序。

在任何LDAP或自定义用户存储提供程序之前,始终首先搜索本地Keycloak用户数据库以解析用户。 您可能需要考虑创建一个存储在本地Keycloak用户数据库中的管理员帐户,以防连接中出现任何问题 到您的LDAP和自定义后端。

每个LDAP和自定义用户存储提供程序都有一个启用在其管理控制台页面上切换。 禁用用户存储提供程序将在以下情况下跳过提供程序 进行用户查询,以便您可以查看和登录可能存储在优先级较低的其他提供程序中的用户。 如果您的提供商正在使用 导入策略并禁用它,导入的用户仍然可以进行查找,但仅在只读模式下。 您将无法修改这些用户,直到 您重新启用提供商。

如果存储提供商查找失败,Keycloak不会故障转移的原因是用户数据库之间经常有重复的用户名或重复的电子邮件。 这可能会导致安全问题和不可预见的问题,因为当管理员期望用户从另一个外部存储加载时,用户可能会从一个外部存储加载。

LDAP和活动目录

Keycloak带有内置的LDAP/广告提供商。 可以将同一台不同的LDAP服务器联合起来 Keycloak领域。 您可以将LDAP用户属性映射到Keycloak公共用户模型中。 默认情况下,它映射用户名,电子邮件,名字和姓氏,但是您可以自由配置其他映射。 LDAP提供程序还支持通过LDAP/AD协议以及不同的存储,编辑和同步模式进行密码验证。

要配置联合LDAP存储,请转到管理控制台。 点击用户联合左侧菜单选项。 当你到达这一页时,有一个添加提供程序选择框。 你应该看看ldap在这个列表中。 选择ldap将带您进入LDAP配置页面。

存储模式

默认情况下,Keycloak会将用户从LDAP导入到本地Keycloak用户数据库中。 用户的这份副本 要么按需同步,要么通过周期性的后台任务同步。 唯一的例外是密码的同步。 密码永远不会导入。 它们的验证总是委托给LDAP服务器。 这种方法的好处是,所有Keycloak功能都可以工作,因为所需的任何额外的每用户数据都可以存储在本地。 这种方法的缺点是,每次第一次查询特定用户时,都会执行相应的Keycloak数据库插入。 导入可能还必须与您的LDAP服务器同步。 但是,在 LDAP映射器被配置为始终从LDAP而不是从数据库中读取特定属性的情况。

或者,您可以选择不将用户导入Keycloak用户数据库。 在这种情况下,公共用户模型 Keycloak运行时使用的仅由LDAP服务器支持。 这意味着如果LDAP不支持 Keycloak功能需要该功能的一条数据将不起作用。 这种方法的好处是,您没有将LDAP用户的副本导入和同步到 Keycloak用户数据库。

此存储模式由导入用户开关。 设置为导入用户。

如果禁用了用户导入,则无法将用户配置文件属性保存到Keycloak数据库中。 你也不能保存 元数据,但映射到LDAP的用户配置文件元数据除外。 唯一的例外是用户配置文件元数据, 它们被映射到LDAP。 这可能包括角色映射、组映射和其他基于配置的元数据 你的LDAP映射器。 当尝试更改一些非LDAP映射的用户数据时,将无法更新用户。 例如 您将无法禁用LDAP映射用户,除非已启用用户的标志被映射到某个LDAP 属性 (通常情况并非如此)。

编辑模式

用户,通过用户帐户服务,以及管理员通过管理控制台 具有修改用户元数据的能力。 根据您的设置,您可能具有或不具有LDAP更新权限。 的 编辑模式配置选项定义您在LDAP存储中拥有的编辑策略。

只读

用户名、电子邮件、名字、姓氏和其他映射属性将不可更改。 每当有人尝试更新这些字段时,Keycloak都会显示错误。 此外,将不支持密码更新。

可写

用户名、电子邮件、名字、姓氏以及其他映射的属性和密码都可以更新,并将自动与您的LDAP存储同步。

未同步

对用户名,电子邮件,名字,姓氏和密码的任何更改都将存储在Keycloak本地存储中。 由您决定如何同步回LDAP。 这允许Keycloak部署支持 只读LDAP服务器上用户元数据的更新。 仅当您将用户从LDAP导入本地Keycloak用户数据库时,此选项才适用。

创建LDAP提供程序时,初始LDAP映射器创建。 映射器是在 “尽力而为” 的基础上配置的 基于所选择的组合供应商,编辑模式,以及导入用户开关。 例如,在未同步编辑模式的情况下,映射程序是预先配置的 优选地从数据库而不是从LDAP读取特定用户属性的方式。 但是,当您以后更改编辑模式时, 映射器配置将不会更改,因为在此期间不容易检测到它们是否被手动更改。 这意味着建议不要更新编辑模式切换,但总是决定编辑模式当创建 LDAP提供程序。 这适用于导入用户也要切换。

其他配置选项

控制台显示名称

在管理控制台中引用此提供程序时使用的名称

优先级

查找用户或添加用户时,此提供程序的优先级。

同步注册

您的LDAP是否支持添加新用户? 如果要在管理控制台或注册页面中通过Keycloak创建新用户,请单击此开关 要添加到LDAP。

允许Kerberos身份验证

使用从LDAP提供的用户数据在领域中启用Kerberos/SPNEGO身份验证。 更多信息Kerberos部分

其他选项

其余的配置选项应该是不言自明的。 您可以将鼠标指针悬停在管理控制台中的工具提示上,以查看有关它们的更多详细信息。

通过SSL连接到LDAP

当您配置LDAP存储的安全连接URL (例如,'ldaps:// myhost.com:636 ') 时,Keycloak将使用SSL与LDAP服务器进行通信。 重要的是在Keycloak服务器端正确配置一个truststore,否则Keycloak无法信任到LDAP的SSL连接。

可以使用truststore SPI配置Keycloak的全局Truststore。 请查看服务器安装和配置指南有关更多详细信息。 如果您没有计算truststore SPI,则truststore将回退Java提供的默认机制 (由system property提供的文件)javax.net.ssl.信任商店 或来自JDK的cacerts文件 (如果未设置系统属性)。

有一个配置属性使用信任商店SPI在LDAP联合身份验证提供程序配置中,您可以在其中选择是否使用Truststore SPI。 默认情况下,该值为仅适用于ldap,这对于大多数部署来说都很好。 仅使用Truststore SPI 如果LDAP的连接URL以ldaps

将LDAP用户同步到Keycloak

如果启用 “导入用户” 选项,LDAP提供程序将自动处理所需LDAP用户到Keycloak本地数据库的同步 (导入)。 当用户登录时,LDAP提供程序将导入LDAP用户 进入Keycloak数据库,然后根据LDAP密码进行身份验证。 这是唯一一次导入用户。 如果你去用户在管理控制台中向左菜单项,然后单击查看所有用户按钮,你只会看到那些LDAP用户 至少被Keycloak认证过一次。 它以这种方式实现,以便此操作不会触发整个LDAP用户数据库的导入。

如果要将所有LDAP用户同步到Keycloak数据库中,则可以配置并启用同步设置在LDAP提供程序配置页面上。 存在两种类型的同步:

定期完全同步

此类型会将所有LDAP用户同步到Keycloak数据库中。 那些已经存在于Keycloak中并直接在LDAP中更改的LDAP用户将在Keycloak数据库中更新。 例如,用户玛丽·凯利在LDAP中更改为玛丽·史密斯

定期更改的用户同步

当同步发生时,只有那些在上次同步之后创建或更新的用户才会被更新和/或导入。

处理同步的最佳方法是单击同步所有用户按钮当您第一次创建LDAP提供程序时, 然后设置更改用户的定期同步。

LDAP映射器

LDAP映射器是听众,由LDAP提供程序在各个点触发,并为LDAP集成提供另一个扩展点。 当用户通过LDAP登录并需要导入时,在启动Keycloak注册期间或从管理控制台查询用户时,会触发它们。 当您创建LDAP联合提供程序时,Keycloak将自动提供一组内置映射器对于这个提供商。 您可以自由更改此集并创建新的映射器或更新/删除现有的映射器。

用户属性映射器

这允许您指定哪个LDAP属性映射到Keycloak用户的哪个属性。 因此,例如,您可以配置LDAP属性邮件到属性电子邮件在Keycloak数据库中。 对于此映射器实现,始终存在一对一的映射 (一个LDAP属性映射到一个Keycloak属性)

全名映射器

这允许您指定用户的全名,该全名保存在某些LDAP属性中 (通常cn) 将映射到名字姓氏Keycloak数据库中的属性。 有cn包含用户名是某些LDAP部署的常见情况。

在Keycloak和同步注册对于LDAP提供程序,即全名映射器 允许回退到用户名的可能性。 此回退在Microsoft Active Directory的情况下特别有用。 共同的 MSAD的设置是配置cnLDAP属性为fullName,同时,cn通常用作RDN LDAP属性 在LDAP提供程序的配置中。 通过此设置,将使用对用户名的回退。 例如,当您创建 Keycloak用户 “john123” 并保留firstName和lastName为空,然后fullname映射器将 “john123” 保存为cn在LDAP中。 当您稍后为名字和姓氏输入 “John Doe” 时,全名映射器将更新LDAPcn值 “John Doe” 为 不再需要回退到用户名。
硬编码属性映射器

此映射器将硬编码属性值添加到与LDAP链接的每个Keycloak用户。 此映射器还可以强制执行已启用或者电子邮件已验证用户属性。

角色映射器

这允许您将角色映射从LDAP配置为Keycloak角色映射。 一个角色映射器可用于将LDAP角色 (通常是来自LDAP树的特定分支的组) 映射为与指定客户端的领域角色或客户端角色相对应的角色。 为同一LDAP提供程序配置更多角色映射器不是问题。 因此,例如,您可以指定来自下的组的角色映射 ou = 主要,dc = 示例,dc = 组织将映射到来自下的组的领域角色映射和角色映射 ou = 金融,dc = 示例,dc = 组织将映射到客户端的客户端角色映射金融

硬编码角色映射器

此映射器将从LDAP提供程序向每个Keycloak用户授予指定的Keycloak角色。

组映射器

这允许您将LDAP组从LDAP树的特定分支映射到Keycloak中的组。 它还将从LDAP传播用户组映射到Keycloak中的用户组映射。

MSAD用户帐户映射器

此映射器特定于Microsoft Active Directory (MSAD)。 它能够紧密集成MSAD用户帐户状态 进入Keycloak帐户状态 (帐户已启用,密码已过期,依此类推)。 它正在使用用户帐户控制pwdLastSetLDAP属性,既特定于MSAD,也不是LDAP标准。 例如,如果pwdLastSet0,则要求Keycloak用户更新其密码 并且将向用户添加UPDATE_PASSWORD必需的操作。 如果用户帐户控制514(禁用帐户) 也禁用了Keycloak用户。

证书映射器

此映射器特定于映射X.509证书。 它通常会与X.509身份验证结合使用 和PEM格式的完整证书作为身份来源。 它的行为与用户属性映射器,但允许Keycloak过滤存储LDAP属性 PEM或DER格式的证书。 通常建议启用始终从LDAP读取值用这个映射器。

默认情况下,有用户属性映射器将基本的Keycloak用户属性 (如用户名、firstname、lastname和email) 映射到相应的LDAP属性。 您可以自由扩展这些并提供其他属性映射。 管理控制台提供了工具提示,这应该有助于配置相应的映射器。

密码散列

当用户的密码从Keycloak更新并发送到LDAP时,它总是以纯文本发送。 这与 将密码更新到内置的Keycloak数据库,当在将密码发送到DB之前对密码应用散列和加盐时。 对于LDAP,Keycloak依靠LDAP服务器提供密码的散列和加盐。

默认情况下,LDAP服务器 (如Microsoft Active Directory、RHDS或FreeIPA) 提供此功能。 其他如OpenLDAP或ApacheDS可能存储密码 默认情况下以纯文本显示,除非您使用LDAPv3密码修改扩展操作根据RFC3062。 LDAPv3密码修改扩展操作 必须在LDAP配置页面中显式启用。 有关更多详细信息,请参阅LDAP服务器的文档。

始终通过检查已更改的内容来验证用户密码是否已正确散列且未存储为明文 目录条目使用ldapsearch和base64解码用户密码属性值。

故障排除

  • 增加日志记录级别以跟踪类别是有用的组织。Keycloak。存储。ldap。 您在日志记录中增加了此级别 中的子系统独立 (-ha).xml文件。 使用此设置,将发送许多日志记录消息 到服务器。日志文件中的痕迹级别,包括对LDAP服务器的所有查询的日志记录和参数,这些参数是 用于发送查询。 当您在用户论坛或JIRA上创建任何LDAP问题时,请考虑将服务器日志附加到 启用跟踪日志记录。 如果太大,好的选择是仅将服务器日志中的代码段与消息一起包含,这些消息是 在操作过程中添加到日志中,这会给您带来问题。

  • 创建LDAP提供程序时,信息级别的服务器日志中会出现消息,开头是:

为LDAP存储提供程序创建新的LDAP存储:...

它显示您的LDAP提供程序的配置。 在您提出问题或报告错误之前,最好将其包括在内 显示您的LDAP配置的消息。 最终,您可以随意将一些您不想包含的配置更改替换为一些 占位符值。 一个例子是bindDn = 某个占位符。 对于连接url,也可以随意更换,但通常 至少包括使用的协议 (ldapvsldaps) '。 同样,包括以下内容的详细信息可能是有用的 LDAP映射器的配置,在调试级别显示如下消息:

提供者的映射器: XXX,映射器名称: YYY,提供者: ZZZ...

请注意,这些消息仅与启用的调试日志记录一起显示。

  • 为了跟踪性能或连接池问题,请考虑设置属性的值连接池调试级别的 LDAP提供程序的价值全部。 这将为服务器日志添加大量附加消息,其中包含LDAP连接的日志记录 池。 这可用于跟踪与连接池或性能相关的问题。

更改连接池的配置后,您可能需要重新启动Keycloak服务器以强制重新初始化 LDAP提供程序连接的。

如果即使服务器重新启动后,连接池也没有更多消息出现,则表明连接池不起作用 使用您的LDAP服务器。

  • 对于报告LDAP问题的情况,您可以考虑将LDAP树的某些部分附加到目标数据中,这会导致问题 在你的环境中。 例如,如果某些用户的登录需要花费大量时间,则可以考虑附加其LDAP条目,以显示成员属性 各种 “团体” 条目。 在这种情况下,添加这些组条目是否映射到某个组LDAP映射器 (或角色LDAP映射器) 可能会很有用 穿着Keycloak等。

SSSD和FreeIPA身份管理集成

Keycloak还带有内置的SSSD(系统安全服务守护程序) 插件。 SSSD是最新的Fedora或Red Hat Enterprise Linux的一部分,并提供对多个身份和身份验证提供程序的访问。 它提供了故障转移和离线支持等好处。 要查看配置选项和更多信息,请参见红帽企业Linux身份管理文档

SSSD还与FreeIPA身份管理 (IdM) 服务器集成,提供身份验证和访问控制。 对于Keycloak,我们受益于这种针对PAM服务进行身份验证并从SSSD检索用户数据的集成。 有关在Linux环境中使用Red Hat身份管理的更多信息,请参见红帽企业Linux身份管理文档

Keycloaksssd freeipa集成概述

Keycloak和SSSD之间的大多数通信都是通过只读D总线接口进行的。 因此,提供和更新用户的唯一方法是使用FreeIPA/IdM管理接口。 默认情况下,与LDAP联合提供程序一样,它仅设置为导入用户名,电子邮件,名字和姓氏。

组和角色会自动注册,但不会同步,因此Keycloak管理员直接在Keycloak中进行的任何更改都不会与SSSD同步。

有关如何配置FreeIPA/IdM服务器的信息如下。

FreeIPA/IdM服务器

为简单起见,一个FreeIPA Docker图像已经可用。 要设置服务器,请参见FreeIPA文档

使用Docker运行FreeIPA服务器需要以下命令:

docker运行-名称freeipa-服务器-容器-it \
-h服务器。免费ipa.local -e密码 = 您的密码 \
-v /sys/fs/cgroup:ro \
-v /var/lib/ipa-数据:/数据: Z freeipa/freeipa-服务器

参数-h服务器。免费ipa。本地表示FreeIPA/IdM服务器主机名。 一定要改变你的密码输入您选择的密码。

容器启动后,更改/etc/主机致:

x.x服务器.freeipa.local

如果不进行此更改,则必须设置DNS服务器。

您必须在IPA域中注册您的Linux机器,以便SSSD联合程序提供程序在Keycloak上启动并运行:

ipa-客户端-安装-mkhomedir -p admin -w密码

要确保一切都按预期工作,请在客户端计算机上运行:

kinit管理员

应该提示您输入密码。 之后,您可以使用以下命令将用户添加到IPA服务器:

$ ipa用户-添加约翰-第一 = 约翰-最后 = 史密斯-电子邮件 = john@smith.com-电话 = 042424242-街道 = "测试街" \-城市 = "测试城市"-州 = "测试州"-邮政编码 = 0000000000-密码

要强制设置用户的密码,请使用kinit。 给定用户john,您将输入以下命令:

基尼特·约翰

要恢复正常的IPA操作,您将输入以下命令:

克毁-A
kinit管理员

SSSD和D总线

如前所述,联盟提供程序使用D-BUS从SSSD获取数据,并使用PAM进行身份验证。

首先,您必须安装sssd-dbus RPM,该RPM允许通过系统总线传输来自sssd的信息。

$ sudo yum安装sssd-dbus

您必须运行Keycloak发行版中可用的配置脚本:

$ bin/federation-sssd-setup.sh

此脚本对/etc/sssd.conf:

[域/your-hostname.local]
...
ldap_user_extra_attrs = 邮件: 邮件,sn:sn,givenname:givenname,电话号码: 电话号码
...
[sssd]
服务 = nss、sudo、pam、ssh、ifp
...
[ifp]
允许的 _ uids = 根,你的用户名
用户属性 = + 邮件,+ 电话号码,+ givenname,+ sn

还有,一个Keycloak文件包含在/etc/pam.d/:

身份验证要求pam_sss.so
帐户需要pam_sss.so

通过运行确保一切正常运行dbus-发送:

sudo dbus-发送-打印-回复-系统-dest = 组织。自由桌面

您应该能够看到用户的组。 如果此命令返回超时或错误,则意味着在Keycloak上运行的联合程序提供程序也将无法检索任何内容。

大多数情况下,这是因为计算机未在FreeIPA IdM服务器中注册,或者您无权访问SSSD服务。

如果您没有权限,请确保运行Keycloak服务器的用户包含在/etc/sssd.conf以下部分中的文件:

[ifp]
允许的 _ uid = 根,你的 _ 用户名

启用SSSD联盟提供程序

Keycloak使用DBus-Java与D-Bus进行低级通信,这取决于Unix套接字库

这个库的RPM可以在此存储库。 在安装之前,请务必检查RPM签名:

$ rpm -K libunix-dbus-java-0.8.0-1.fc24.x86_64.rpm
libunix-dbus-java-0.8.0-1.fc24.x86_64.rpm:
  标题V4 RSA/SHA256签名,密钥标识84dc9914: 确定
  Header SHA1 digest: OK (d17bb7ebaa7a5304c1856ee4357c8ba4ec9c0b89)
  V4 RSA/SHA256签名,密钥标识84dc9914: 确定
  MD5摘要: OK (770c2e68d052cb4a4473e1e9fd8818cf)
$ sudo yum安装libunix-dbus-java-0.8.0-1.fc24.x86_64.rpm

对于使用PAM Keycloak进行身份验证,使用JNA。 确保您已安装此软件包:

$ sudo yum安装jna

使用sssctl用户检查命令来验证您的设置:

$ sudo sssctl用户检查管理员的Keycloak

配置联合SSSD存储

安装后,您需要配置联合SSSD存储。

要配置联合SSSD存储,请完成以下步骤:

  1. 导航到管理控制台。

  2. 从左侧菜单中,选择用户联合。

  3. 添加提供程序下拉列表,选择sssd。 sssd配置页面打开。

  4. 点击保存

现在,您可以使用FreeIPA/IdM凭据对Keycloak进行身份验证。

自定义提供商

Keycloak确实有一个用于用户存储联合的SPI,您可以使用它来编写自己的自定义提供程序。 你可以在我们的服务器开发指南

审计和事件

Keycloak提供了丰富的审计功能。 每个登录操作都可以记录并存储在 在管理控制台中查看数据库和 所有管理员操作也可以被记录和审查。 还有一个监听器SPI 用这些插件可以监听这些事件并执行一些操作。 内置侦听器包括一个简单的日志文件和能力 如果发生事件,发送电子邮件。

登录事件

登录事件发生在用户成功登录,某人输入错误密码或用户帐户时 已更新。 可以记录和查看发生在用户身上的每个事件。 默认情况下,不存储任何事件 或在管理控制台中查看。 只有错误事件被记录到控制台和服务器的日志文件中。 开始 坚持您需要启用存储。 去事件左侧菜单项,然后选择配置tab。

事件配置

登录事件配置

要开始存储事件,您需要将保存事件登录事件设置

保存事件

登录事件设置

保存的类型字段允许您指定要在事件存储中存储的事件类型。 的清除事件 按钮允许您删除数据库中的所有事件。 的过期字段允许您指定所需的时间 保持事件存储。 启用登录事件的存储并确定设置后,请不要忘记单击 的保存此页面底部的按钮。

要查看事件,请转到登录事件tab。

登录事件

登录事件

如您所见,存储了很多信息,如果要存储每个事件,则存储了很多事件 每个登录操作。 的过滤器此页面上的按钮可让您过滤您真正感兴趣的事件。

登录事件过滤器

登录事件过滤器

在此屏幕截图中,我们仅过滤登录事件。 单击更新按钮运行过滤器。

事件类型

登录事件:

  • 登录-用户已登录。

  • 注册-用户已注册。

  • 注销-用户已注销。

  • 代码到令牌-应用程序/客户端已将代码交换为令牌。

  • 刷新令牌-应用程序/客户端已刷新令牌。

帐户事件:

  • 社交链接-帐户已链接到社交提供商。

  • 删除社交链接-社交提供商已从帐户中删除。

  • 更新电子邮件-帐户的电子邮件地址已更改。

  • 更新配置文件-帐户的配置文件已更改。

  • 发送密码重置-已发送密码重置电子邮件。

  • 更新密码-帐户的密码已更改。

  • 更新TOTP-帐户的TOTP设置已更改。

  • 删除TOTP-已从帐户中删除TOTP。

  • 发送验证电子邮件-已发送电子邮件验证电子邮件。

  • 验证电子邮件-帐户的电子邮件地址已验证。

对于所有事件,都有一个相应的错误事件。

事件监听器

事件侦听器侦听事件并根据该事件执行操作。 有两个内置的 Keycloak附带的侦听器: 记录事件侦听器和电子邮件事件侦听器。

每当发生错误事件时,日志事件侦听器都会写入日志文件,并且默认情况下处于启用状态。 下面是一个示例日志消息:

11:36:09,965警告 [org.keycloak.events] (默认任务-51) 类型 = LOGIN_ERROR,realmId = master,
                    clientId = 我的应用程序,
                    userId = 19aeb848-96fc-44f6-b0a3-59a17570d374,ipAddress = 127.0.0.1,
                    错误 = 无效 _ 用户 _ 凭据,auth_method = openid-connect,auth_type = 代码,
                    redirect_uri = http:// 本地主机: 8180/myapp,
                    代码id = b669da14-cdbb-41d0-b055-0810a0334607,用户名 = 管理员

如果您想使用Fail2Ban之类的工具来检测某个地方是否有黑客机器人,则此日志记录非常有用 试图猜测用户密码。 您可以解析日志文件登录错误并拔出ip地址。 然后输入这些信息 进入Fail2Ban,以便它可以帮助防止攻击。

日志记录事件侦听器将事件记录到组织。Keycloak。事件记录器类别。 默认情况下,调试日志事件不是 包含在服务器日志中。

要在服务器日志中包含调试日志事件,请编辑独立。xml文件并更改日志记录使用的日志级别 事件监听器。 或者,您可以配置日志级别组织。Keycloak。事件

例如,要更改日志级别,请添加以下内容:

<子系统 xmlns=urn:jboss: 域: 日志记录:...>
    ...
    <记录器 类别=组织。Keycloak。事件>
        <级别 名称=调试/>
    </记录器>
</子系统>

要更改日志事件侦听器使用的日志级别,请添加以下内容:

<子系统 xmlns=urn:jboss: 域: 密钥斗篷-服务器:...>
    ...
    <spi 名称=事件监听器>
      <提供者 名称=jboss-日志记录 已启用=>
        <属性>
          <属性 名称=成功级别 =信息/>
          <属性 名称=错误级别 =错误/>
        </属性>
      </提供者>
    </spi>
</子系统>

日志级别的有效值是调试,信息,警告,错误,以及致命

当事件发生时,电子邮件事件侦听器将电子邮件发送到用户的帐户。

当前,电子邮件事件侦听器支持以下事件:

  • 登录错误

  • 更新密码

  • 更新TOTP

  • 移除TOTP

要启用电子邮件侦听器,请转到配置选项卡,然后单击事件监听器场。 这将显示一个下拉列表框 您可以在其中选择电子邮件。

您可以通过编辑独立。xml,standalone-ha.xml,或者域。xml 这与您的分发和添加例如:

<spi 名称=事件监听器>
  <提供者 名称=电子邮件 已启用=>
    <属性>
      <属性 名称=排除-事件 =[& quot;更新 _ totp& quot;,& quot;移除totp& quot;]/>
    </属性>
  </提供者>
</spi>

您还可以通过编辑设置存储在数据库中的事件详细信息的最大长度独立。xml,standalone-ha.xml,或者 域。xml。 如果某些字段 (例如redirect_uri) 很长,此设置可能很有用。 以下是定义最大长度的示例。:

<spi 名称=事件存储>
    <提供者 名称=jpa 已启用=>
        <属性>
            <属性 名称=最大细节长度 =1000/>
        </属性>
    </提供者>
</spi>

请参阅服务器安装和配置指南有关更多详细信息 在哪里独立。xml,standalone-ha.xml,或者域。xml档案生活。

管理事件

可以记录管理员在管理控制台中执行的任何操作,以进行审核。 管理控制台通过调用Keycloak REST接口来执行管理功能。 Keycloak 审核这些REST调用。 然后可以在管理控制台中查看生成的事件。

要启用对管理员操作的审核,请转到事件左侧菜单项,然后选择配置tab。

事件配置

登录事件配置

管理事件设置部分,打开保存事件开关。

管理事件配置

管理事件设置

包括表示switch将包括通过admin REST API发送的任何JSON文档。 这使您可以准确查看管理员所做的工作,但可能会导致存储在 数据库。 的清除管理事件按钮允许您清除存储的当前信息。

要查看管理事件,请转到管理事件tab。

管理事件

管理事件

如果详细信息列有一个表示框,您可以单击该框以查看随该操作发送的JSON。

管理员代表

管理事件表示

您还可以通过单击过滤器按钮。

管理事件过滤器

管理事件过滤器

导出和导入

Keycloak具有导出和导入整个数据库的能力。 如果要将整个Keycloak数据库从一个环境迁移到另一个环境或迁移到其他数据库 (例如从MySQL迁移到Oracle),这可能特别有用。 导出和导入在服务器启动时触发,其参数通过Java系统属性传入。 重要的是要注意,由于导入和导出发生在服务器启动时,因此在发生这种情况时,不应在服务器或数据库上采取其他操作。

您可以将数据库导出/导入到:

  • 本地文件系统上的目录

  • 文件系统上的单个JSON文件

使用目录策略导入时,请注意文件需要遵循下面指定的命名约定。 如果要导入以前导出的文件,则这些文件已经遵循此约定。

  • <REALM_NAME>-realm.json,例如 “acme-roadrunner-affairs-realm.json” 为名为 “acme-roadrunner-affairs” 的领域

  • <REALM_NAME>-用户-<INDEX>.json,例如 “acme-roadrunner-affairs-users-0.json”,用于名为 “acme-roadrunner-affairs” 的领域的第一个用户文件

如果导出到目录,还可以指定将存储在每个JSON文件中的用户数。

如果您的数据库中有更多的用户 (500或更多),则强烈建议将其导出到目录中,而不是 而不是单个文件。 导出到单个文件可能会导致非常大的文件。 目录提供程序还为每个 “页面” (带有用户的文件) 使用单独的事务, 这导致更好的性能。 每个文件 (和事务) 的默认用户数为50,这向我们展示了最佳性能,但是您可以覆盖 (请参见下文)。 导出到单个文件的整个导出和整个导入使用一个事务,这导致大量用户的性能不佳。

要导出到未加密的目录,您可以使用:

bin/独立。sh -Dkeycloak。迁移。操作 = 导出
-Dkeycloak.migration.provider = dir -Dkeycloak.migration.dir =<DIR导出到>

要导出到单个JSON文件,您可以使用:

bin/独立。sh -Dkeycloak。迁移。操作 = 导出
-Dkeycloak.migration.provider = singleFile -Dkeycloak.migration.file = <要导出到的文件>

同样,对于导入,只需使用-Dkeycloak。迁移。操作 = 导入而不是导出。 以下是导入的示例:

bin/独立。sh -Dkeycloak。迁移。操作 = 导入
-Dkeycloak.migration.provider = singleFile -Dkeycloak.migration.file = <要导入的文件>
-Dkeycloak.migration.strategy = 覆盖 _ 存在

其他可用选项包括:

-Dkeycloak.迁移.realmName

如果您只想导出一个指定的领域而不是全部,则使用此属性。 如果未指定,则将导出所有领域。

-Dkeycloak。迁移。用户端口策略

此属性用于指定导出用户的位置。 可能的值是:

  • DIFFERENT_FILES-用户将根据每个文件的最大用户数导出到不同的文件中。 这是默认值。

  • 跳过-用户的导出将被完全跳过。

  • REALM_FILE-所有用户都将导出到具有领域设置的同一文件。 (结果将是一个像 “foo-realm.json” 这样的文件,其中包含领域数据和用户。)

  • SAME_FILE-所有用户将导出到同一文件,但与realm文件不同。 (结果将是一个文件,例如带有领域数据的 “foo-realm.json” 和带有用户的 “foo-users.json”。)

-Dkeycloak。迁移。用户文件

此属性用于指定每个文件 (以及每个DB事务) 的用户数。 默认为50。 仅当用户端口策略不同时才使用

-Dkeycloak.迁移.策略

此属性在导入过程中使用。 如果要导入数据的数据库中已经存在具有相同名称的领域,则可以使用它来指定如何进行。 可能的值是:

  • IGNORE_EXISTING-如果已经存在此名称的领域,则忽略导入。

  • Overwrite_imisting-删除现有领域,并使用JSON文件中的新数据再次导入它。 如果要将一个环境完全迁移到另一个环境,并确保新环境将包含相同的数据 作为旧的,你可以指定这个

导入以前没有导出的领域文件时,选项Keycloak。导入可以使用。 如果需要导入多个领域文件,则可以指定逗号分隔的文件名列表。 这比以前的情况更合适,因为只有在初始化主领域之后才会发生这种情况。 示例:

  • -Dkeycloak.import =/tmp/realm1.json

  • -Dkeycloak.import =/tmp/realm1.json,/tmp/realm2.json

基于Keycloak。导入不能与基于Keycloak。迁移。X属性。 如果一起使用,Keycloak。导入将被忽略。 的Keycloak。导入机制总是忽略领域,这些领域已经 存在于Keycloak中。 一般来说Keycloak。导入机制可以方便一些开发目的,但如果更多 需要灵活性,我们建议您坚持基于Keycloak。迁移。X属性。

管理控制台导出/导入

可以从管理控制台执行大多数资源的导入以及大多数资源的导出。 不支持导出用户。

包含秘密或私人信息的属性将在导出文件中被屏蔽。 通过管理控制台获得的导出文件 因此不适合服务器之间的备份或数据传输。 只有启动时导出才适合。

在 “启动” 导出期间创建的文件也可以用于从管理用户界面导入。 这样,您可以从一个领域导出并导入到另一个领域。 或者,您可以从一台服务器导出并导入到另一台服务器。

管理控制台导出/导入每个文件只允许一个领域。
如果您选择,管理控制台导入允许您 “覆盖” 资源。 谨慎使用此功能,尤其是在生产系统上。 导出。管理控制台的json文件导出操作 通常不适合数据导入,因为它们包含无效的机密值。
管理控制台导出允许您导出客户端、组和角色。 如果有很多这样的 资产在你的领域,操作可能需要一些时间才能完成。 在此期间,服务器可能无法响应用户请求。 谨慎使用此功能,尤其是在生产系统上。

使用金库获取秘密

管理中的几个字段支持从外部保管库获取秘密的值。

要从保管库获取秘密而不是直接输入,请输入 以下特制字符串进入适当的字段: $ {保险库。钥匙}在那里你替换钥匙 金库识别的秘密名称。

为了防止秘密跨领域泄漏,实现可以将领域名称与钥匙 从vault表达式获得。 这意味着钥匙不会直接映射到金库中的条目,而是 用于根据将其与领域名称结合使用的算法创建最终条目名称。

目前,可以在以下字段从保险库中获取秘密:

SMTP密码

在领域SMTP设置

LDAP绑定凭证

LDAP设置基于LDAP的用户联合。

OIDC身份提供商秘密

客户秘密内部身份提供商OpenID连接配置

要使用保管库,必须在Keycloak中注册保管库提供程序。 可以使用下面描述的内置提供商,或者 实现您自己的提供商。 请参阅服务器开发指南有关更多信息。

每个Keycloak实例最多有一个vault提供程序处于活动状态 在任何给定的时间,以及集群内每个实例中的vault提供程序 必须配置一致。

Kubernetes / OpenShift文件明文保管库提供程序

Keycloak支持vault实现Kubernetes秘密。 这些秘密 可以作为数据卷挂载,它们显示为具有平面文件结构的目录,其中每个秘密由一个文件名为秘密名称的文件表示,该文件的内容为秘密值。

此目录中的文件必须命名为以领域名称和下划线为前缀的秘密名称。 秘密名称或领域名称中的所有下划线必须在文件名中加倍。 例如,对于一个叫做sso_realm,对带有名称的秘密的引用秘密名称会被写成${vault.secret-name},并且查找的文件名将为sso _ realm_secret-name(请注意,下划线在领域名称中增加了一倍)。

要使用这种类型的秘密商店,你必须声明文件-明文standalone.xml中的vault提供程序,并为包含已安装卷的目录设置其参数。 下面的示例显示了文件-明文 提供程序,其中搜索vault文件的目录设置为独立/配置/保险库相对于Keycloak基目录:

<spi 名称=保险库>
    <默认提供程序>文件-明文</默认提供程序>
    <提供者 名称=文件-明文 已启用=>
        <属性>
            <属性 名称=目录 =${jboss.home.dir}/独立/配置/保险库/ />
        </属性>
    </提供者>
</spi>

下面是使用CLI命令的等效配置:

/子系统 = keycloak-server/spi = vault/: 添加
/子系统 = keycloak-server/spi = vault/provider = files-plaintext/:add(enabled = true,properties ={dir => "${jboss.home.dir}/standalone/configuration/vault"})

Elytron凭证存储库提供商

Keycloak还提供了阅读Elytron凭据商店中存储的秘密的支持。 的elytron-cs-密钥库 vault provider能够从凭证存储的基于密钥库的实现中检索机密, 也是Elytron提供的默认实现。

此凭据存储由密钥存储 (JCEKS是默认格式,但可以使用其他格式,例如PKCS12) 用户可以使用elytronWildFly/JBoss EAP中的子系统,或使用 elytron-tool.sh脚本。

要使用此提供程序,您必须声明elytron-cs-密钥库Keycloak-服务器子系统并设置位置 还有Elytron创建的密钥库的主要秘密。 提供程序的最小配置示例如下:

<spi 名称=保险库>
    <默认提供程序>elytron-cs-密钥库</默认提供程序>
    <提供者 名称=elytron-cs-密钥库 已启用=>
        <属性>
            <属性 名称=位置 =${jboss.home.dir}/独立/配置/保险库/credential-store.jceks />
            <属性 名称=秘密 =秘密1!/>
        </属性>
    </提供者>
</spi>

如果底层密钥库的格式不是JCEKS,此格式必须使用密钥库类型:

<spi 名称=保险库>
    <默认提供程序>elytron-cs-密钥库</默认提供程序>
    <提供者 名称=elytron-cs-密钥库 已启用=>
        <属性>
            <属性 名称=位置 =${jboss.home.dir}/独立/配置/保险库/credential-store.p12 />
            <属性 名称=秘密 =秘密1!/>
            <属性 名称=密钥库类型 =PKCS12/>
        </属性>
    </提供者>
</spi>

对于秘密,elytron-cs-密钥库提供程序既支持明文值 (如上所示),也支持 被用elytron-tool.sh脚本:

<spi 名称=保险库>
   ...
            <属性 名称=秘密 =MASK-3u2HNQaMogJJ8VP7J6gRIl;12345678;321/>
   ...
</spi>

有关如何创建/管理elytron凭证存储以及如何掩盖密钥库秘密的更多详细信息, 请参考Elytron文档。

elytron-cs-密钥库vault provider已实现为WildFly扩展,因此仅可用 如果Keycloak服务器在WildFly/JBoss EAP上运行。

关键解析器

所有内置提供程序都支持配置一个或多个密钥解析器。 密钥解析器实质上实现了 将领域名称与密钥组合的算法或策略 (从${vault.key}表达) 成 将用于从保险库中检索秘密的最终条目名称。 的关键解析器属性用于配置 提供程序将使用的解析器。 该值是一个逗号分隔的解析器名称列表。 一个例子 配置文件-明文提供程序如下:

<spi 名称=保险库>
    <默认提供程序>文件-明文</默认提供程序>
    <提供者 名称=文件-明文 已启用=>
        <属性>
            <属性 名称=目录 =${jboss.home.dir}/独立/配置/保险库/ />
            <属性 名称=关键解析器 =REALM_UNDERSCORE_KEY,仅KEY_ONLY/>
        </属性>
    </提供者>
</spi>

解析器的执行顺序与配置中声明的顺序相同。 对于每个解析器,最终条目 将领域与vault密钥结合在一起的解析器产生的名称用于搜索vault中的秘密。 如果发现了秘密,将立即返回。 如果没有,则使用下一个解析器,并且继续进行直到非空 找到秘密或已尝试所有解析器,在这种情况下,返回空秘密。 在上面的示例中,首先 的REALM_UNDERSCORE_KEY使用解析器。 如果在vault中找到具有其产生名称的条目,则返回该条目。 如果没有,那么仅键 _使用解析器。 同样,如果在保险库中找到具有其产生的名称的条目,则为 返回。 如果没有,则返回一个空的秘密,因为没有更多的解析器要使用。

当前可用的解析器列表如下:

  • 仅键 _: 领域名称将被忽略,并且vault表达式中的键将按顺序使用。

  • REALM_UNDERSCORE_KEY: 境界和键使用下划线组合在一起_性格。 下划线的出现 境界或键被另一个下划线字符转义。 所以如果这个领域被称为主领域关键是smtp_key, 组合密钥将是主 __ realm_smtp __ 密钥

  • REALM_FILESEPARATOR_KEY: 使用平台文件分隔符将realm和key组合在一起。 这在情况下很有用 其中使用目录结构按领域对键进行分组。

  • 工厂 _ 提供: 领域和密钥使用VaultKeyResolver由保管库提供商工厂提供, 通过扩展现有工厂并实现getFactoryResolver方法。

如果没有为内置提供程序配置解析器,则REALM_UNDERSCORE_KEY默认情况下为选中。

工厂 _ 提供解析器提供了一个钩子,可用于通过扩展提供程序来实现自定义解析器 工厂的选择和覆盖getFactoryResolver方法,因此它返回自定义解析器。 例如,如果你想要 要使用elytron-cs-密钥库提供程序,但没有一个内置解析器与您的密钥库中使用的格式匹配,您 可以扩展ElytronCSKeystoreProvider并实施getFactoryResolver方法:

    公众  定制提供工厂 延伸ElytronCSKeyStoreProviderFactory {
        ...
        @ 覆盖
        受保护VaultKeyResolver getFactoryResolver() {
            返回(境界,键) -> 境界 +###+ 钥匙;
        }

        @ 覆盖
        公众 字符串getId() {
            返回 定制-elytron-cs-keystore;
        }

        ...
    }

自定义工厂返回一个密钥解析器,该密钥解析器将境界和密钥与三重 性格。 所以一个条目看起来 喜欢主领域# # smtp_key,例如。 然后必须像任何定制提供商一样安装该工厂。

请注意,自定义工厂必须覆盖getFactoryResolvergetId方法。 需要第二种方法,以便 我们可以在Keycloak中正确配置定制工厂。

要安装和使用上述自定义提供程序,配置将如下所示:

<spi 名称=保险库>
    <默认提供程序>定制-elytron-cs-密钥库</默认提供程序>
    <提供者 名称=定制-elytron-cs-密钥库 已启用=>
        <属性>
            <属性 名称=位置 =${jboss.home.dir}/独立/配置/保险库/credential-store.p12 />
            <属性 名称=秘密 =MASK-3u2HNQaMogJJ8VP7J6gRIl;12345678;321/>
            <属性 名称=密钥库类型 =PKCS12/>
            <属性 名称=关键解析器 =工厂 _ 提供/>
        </属性>
    </提供者>
</spi>

上面的配置告诉Keycloak设置自定义Elytron提供程序,并使用由 定制工厂。

示例配置

以下是配置保管库和凭证存储的示例。 该过程涉及两个部分:

  • 创建凭证存储和保管库,其中凭证存储和保管库密码为纯文本。

  • 更新凭据存储和保管库以使密码使用由提供的掩码elytron-tool.sh

在此示例中,使用的测试目标是LDAP实例,具有绑定DN凭证: secret12。 使用领域中的用户联合来映射目标ldaptest

配置没有掩码的凭证存储和保管库

您可以创建凭证存储和保管库,其中凭证存储和保管库密码为纯文本。

先决条件
  • 正在运行的LDAP实例具有绑定DN凭证: secret12

  • 使用默认密钥解析器时,别名使用格式 <realm-name >_< key-value>。 在这种情况下,实例在领域中运行ldaptestldaptest_ldap_secret是对应于值的别名ldap_secret在那个领域。

解析器将域和键名中的双下划线字符替换为下划线字符。 例如,对于密钥ldaptest_ldap_secret,最后的关键将是ldaptest_ldap __ 秘密
程序
  1. 创建Elytron凭证商店。

    [独立 @ 本地主机: 9990 /] /子系统 = elytron/凭证存储 = 测试存储: 添加 (创建 = 真,位置 =/主页/测试/test-store.p12,凭证引用 = {明文 = testpwd1!},实现-属性 ={keyStoreType = PKCS12})
  2. 将别名添加到凭据存储中。

    /子系统 = elytron/credential-store = test-store:add-alias (别名 = ldaptest_ldap __ secret,secret-value = secret12)

    注意解析器是如何导致密钥的ldaptest_ldap __ 秘密使用双下划线。

  3. 列出凭据存储中的别名,以检查Elytron生产的密钥库的内容。

    keytool -list -keystore /home/test/test-store.p12 -storetype PKCS12 -storepass testpwd1!
    密钥库类型: PKCS12
    密钥库提供商: SUN
    
    您的密钥库包含1个条目
    
    ldaptest_ldap __ 秘密/密码凭证/清除/,2020年10月12日,SecretKeyEntry,
  4. 在Keycloak中配置vault SPI。

    /子系统 = keycloak-server/spi = vault:add (默认-provider = elytron-cs-keystore)
    
    /子系统 = keycloak-server/spi = vault/provider = elytron-cs-keystore: 添加 (启用 = true,属性 = {位置 =>/home/test/test-store.p12,秘密 =>testpwd1!,keyStoreType =>PKCS12})

    此时,vault和凭据存储密码不会被屏蔽。

            <spi名称 = "保险库">
                    <默认提供程序> elytron-cs-密钥库 </默认提供程序>
                    <提供者名称 = "elytron-cs-keystore" enabled = "true">
                        <属性>
                            <属性名称 = “位置” 值 = “/home/test/test-store.p12”/>
                            <属性名称 = “秘密” 值 = “testpwd1!”/>
                            <属性名称 = "keyStoreType" 值 = "PKCS12"/>
                        </属性>
                    </提供者>
                </spi>
    
             <凭证-商店>
                    <凭据商店名称 = “测试商店” 位置 = “/home/test/test-store.p12” create = “true”>
                        <实现-属性>
                            <属性名称 = "keyStoreType" 值 = "PKCS12"/>
                        </实现-属性>
                        <凭据-引用明文 = "testpwd1!"/>
                    </凭证存储>
             </凭证商店>
  5. 在LDAP提供程序中,替换binDN凭据${vault.ldap_secret}

  6. 测试您的LDAP连接。

    LDAP保险库

    LDAP保险库

屏蔽凭证存储和保管库中的密码

现在,您可以更新凭据存储和保管库,使其具有使用由elytron-tool.sh

  1. 使用以下值创建屏蔽密码迭代参数:

    $ EAP_HOME/bin/elytron-tool.sh掩码-盐-迭代迭代 _ 计数-秘密密码

    例如:

    elytron-tool.sh掩码-盐12345678-迭代123-secret testpwd1!
    MASK-3BUbFEyWu0lRAu8.fCqyUk;12345678;123
  2. 更新Elytron凭据存储配置以使用屏蔽密码。

    /子系统 = elytron/credential-store = cs-store: 写属性 (名称 = credential-reference.clear-text,值 = “MASK-3BUbFEyWu0lRAu8.fCqyUk;12345678;123”)
  3. 更新Keycloak vault配置以使用屏蔽密码。

    /子系统 = keycloak-server/spi = vault/provider = elytron-cs-keystore:remove()
    /子系统 = 密钥衣-服务器/spi = 保险库/提供者 = elytron-cs-密钥库: 添加 (启用 = true,属性 = {位置 =>/home/test/test-store.p12,秘密 => ???MASK-3BUbFEyWu0lRAu8.fCqyUk;12345678;123?,keyStoreType =>PKCS12})

    保险库和凭证商店现在被掩盖了:

            <spi名称 = "保险库">
                    <默认提供程序> elytron-cs-密钥库 </默认提供程序>
                    <提供者名称 = "elytron-cs-keystore" enabled = "true">
                        <属性>
                            <属性名称 = “位置” 值 = “/home/test/test-store.p12”/>
                            <属性名称 = “秘密” 值 = “MASK-3BUbFEyWu0lRAu8.fCqyUk;12345678;123”/>
                            <属性名称 = "keyStoreType" 值 = "PKCS12"/>
                        </属性>
                    </提供者>
                </spi>
             ....
             .....
             <凭证-商店>
                    <凭据商店名称 = “测试商店” 位置 = “/home/test/test-store.p12” create = “true”>
                        <实现-属性>
                            <属性名称 = "keyStoreType" 值 = "PKCS12"/>
                        </实现-属性>
                        <credential-reference clear-text = "MASK-3BUbFEyWu0lRAu8.fCqyUk;12345678;123"/>
                    </凭证存储>
             </凭证商店>
  4. 现在,您可以使用以下方法测试与LDAP的连接${vault.ldap_secret}

额外资源

有关Elytron工具的更多信息,请参见使用Elytron客户端的凭证商店

用户帐户服务

Keycloak有一个内置的用户帐户服务,每个用户都可以访问。 该服务允许用户管理他们的帐户, 更改其凭据,更新其配置文件并查看其登录会话。 此服务的URL为<server-root>/auth/realms/{realm-name}/account

帐户服务

帐户服务配置文件

初始页面是用户的个人资料,即账户左侧菜单项。 这是他们指定关于自己的基本数据的地方。 这个屏幕可以扩展 以允许用户管理其他属性。 请参阅服务器开发指南有关更多详细信息。

密码左侧菜单项允许用户更改密码。

密码更新

账号服务密码

认证器菜单项允许用户根据需要设置OTP。 只有当OTP是您领域的有效身份验证机制时,这才会显示。 向用户提供安装指导FreeOTP或者谷歌认证器在他们的移动设备上成为他们的OTP发生器。 您在屏幕截图中看到的QR码可以扫描到FreeOTP或Google Authenticator移动应用程序中,以方便快捷地进行设置。

OTP认证器

帐户服务验证器

联邦身份菜单项允许用户将其帐户与身份经纪人(这通常用于链接社交提供商 账户在一起)。 这将显示您为您的领域配置的外部身份提供程序的列表。

联邦身份

帐户服务联合身份

会议菜单项允许用户查看和管理哪些设备登录以及从何处登录。 他们也可以从此屏幕上注销这些会话。

会议

帐户服务会话

应用菜单项显示用户可以访问哪些应用程序。

应用

帐户服务应用

可主题

与Keycloak中的所有UIs一样,用户帐户服务是完全可主题且可国际化的。 请参阅服务器开发指南有关更多详细信息。

威胁模型缓解

本章讨论任何身份验证服务器可能存在的安全漏洞,以及Keycloak如何 减轻这些漏洞。 可以在 的OAuth 2.0威胁模型文档及其最近的扩展OAuth 2.0安全最佳当前实践由IETF推出。 这里讨论了许多这些漏洞。

主机

Keycloak在许多事情上使用公共主机名。 例如,在发送的令牌发行方字段和url中 密码重置电子邮件。

默认情况下,主机名基于请求头,并且没有检查以确保此主机名有效。

如果您没有在Keycloak前面使用负载平衡器或代理来防止无效的主机标头,则必须 显式配置应该接受哪些主机名。

主机名SPI提供了一种为请求配置主机名的方法。 开箱即用的提供程序允许设置 前端请求的固定URL,同时允许后端请求基于请求URI。 也有可能 在内置提供商不提供所需功能的情况下,开发自己的提供商。

管理端点和控制台

默认情况下,Keycloak管理REST API和web控制台与非管理员在同一端口上公开 用法。 如果不需要从外部访问管理控制台,我们建议不要在 互联网。

这可以直接在Keycloak中或使用Apache或nginx等代理来实现。

对于代理选项,请遵循代理文档。 您需要控制对任何请求的访问 到/授权/管理

要直接在Keycloak中实现此目的,有几种选择。 本文档涵盖了两个选项,IP限制 和单独的端口。

一旦无法在Keycloak的前端URL上访问管理控制台,您需要配置一个固定的管理员 默认主机名提供程序中的URL

知识产权限制

有可能限制访问/授权/管理仅适用于特定的ip地址。

以下示例限制访问/授权/管理到该范围内的ip地址10.0.0.110.0.0.255

<子系统 xmlns=urn:jboss: 域: undertow:12.0>
    ...
    <服务器 名称=默认服务器>
        ...
        <主机 名称=默认主机 别名=本地主机>
            ...
            <过滤器-参考 名称=ipAccess/>
        </主机>
    </服务器>
    <过滤器>
        <表达式-过滤器 名称=ipAccess 表达=路径前缀 ('/auth/admin') ->ip-access-control(acl ={'10.0.0.0/24 allow'})"/>
    </过滤器>
    ...
</子系统>

使用CLI命令的等效配置:

/subsystem = undertow/configuration = filter/expression-filter = ipAccess:add (,expression = "path-prefix[/auth/admin] -> ip-access-control(acl ={'10.0.0.0/24 allow'})")
/子系统 = undertow/服务器 = 默认-服务器/主机 = 默认-主机/过滤器-ref = ipAccess:add()
对于IP限制,如果您使用的是代理,请正确配置它以确保Keycloak 接收客户端ip地址,而不是代理ip地址

端口限制

有可能曝光/授权/管理到互联网上没有公开的另一个端口。

以下示例公开/授权/管理在港口8444同时不允许使用默认端口访问8443

<子系统 xmlns=urn:jboss: 域: undertow:12.0>
    ...
    <服务器 名称=默认服务器>
        ...
        <https-监听器 名称=https 套接字-绑定=https 安全领域=应用领域 enable-http2=/>
        <https-监听器 名称=https-admin 套接字-绑定=https-admin 安全领域=应用领域 enable-http2=/>
        <主机 名称=默认主机 别名=本地主机>
            ...
            <过滤器-参考 名称=端口访问/>
        </主机>
    </服务器>
    <过滤器>
        <表达式-过滤器 名称=端口访问 表达=路径前缀 ('/auth/admin') 和不等于 (% p,8444) ->响应代码 (403)"/>
    </过滤器>
    ...
</子系统>

...

<套接字-绑定-组 名称=标准插座 默认接口=公众 端口偏移=${jboss.socket.binding.port-offset:0}>
    ...
    <套接字绑定 名称=https 港口=${jboss.https.port:8443}/>
    <套接字绑定 名称=https-admin 港口=${jboss.https.port:8444}/>
    ...
</套接字-绑定-组>

使用CLI命令的等效配置:

/socket-binding-group = 标准套接字/socket-binding = https-admin/: 添加 (端口 = 8444)

/子系统 = undertow/服务器 = 默认服务器/https-侦听器 = https-admin: 添加 (套接字绑定 = https-admin,安全领域 = 应用领域,enable-http2 = true)

/子系统 = undertow/configuration = filter/expression-filter = portAccess:add (,expression = "path-prefix('/auth/admin') 和不等于 (% p,8444) -> 响应代码 (403)")
/子系统 = undertow/服务器 = 默认服务器/主机 = 默认主机/过滤器-ref = 端口访问: 添加 ()

密码猜测: 暴力攻击

当攻击者试图猜测用户密码时,就会发生暴力攻击。 Keycloak具有一些有限的蛮力检测功能。 如果打开,如果达到登录失败的阈值,用户帐户将被暂时禁用。 要启用此功能,请转到领域设置左侧菜单项,单击安全防御选项卡,然后附加 去蛮力检测子选项卡。

默认情况下禁用蛮力检测。 强烈建议启用此功能以防止此类攻击。
蛮力检测

蛮力

有2种不同的配置用于暴力检测; 永久锁定和临时锁定。 在检测到攻击后,永久锁定将禁用用户的帐户; 该帐户将被禁用,直到管理员将其重命名。 临时锁定将在检测到攻击后的一段时间内禁用用户的帐户; 禁用帐户的时间越长,攻击持续的时间越长。

当用户被暂时锁定并尝试登录时,默认错误消息无效的用户名或密码显示。 这是与提供无效用户名或无效密码时显示的消息相同的错误消息。 这是根据设计 我们不想向攻击者透露用户被暂时禁用。

公共参数

最大登录失败

允许的最大登录失败次数。 默认值为30。

快速登录检查毫秒

登录尝试之间所需的最短时间。 默认值为1000。

最小快速登录等待

如果登录尝试比快速登录检查毫秒。 默认为1分钟。

临时锁定参数

等待增量

每次用户被暂时禁用的时间增加的时间量最大登录失败达到了。 默认为1分钟。

最大等待

用户将被暂时禁用的最长时间。 默认为15分钟。

故障复位时间

之后将重置失败计数的时间; 计时器从上次失败的登录开始运行。 默认为12小时。

永久锁定算法

  1. 登录成功

    1. 重置计数

  2. 登录失败时

    1. 增量计数

    2. 如果计数大于最大登录失败

      1. 永久禁用用户

    3. 否则,如果此故障与上次故障之间的时间少于快速登录检查毫秒

      1. 暂时禁用用户最小快速登录等待

禁用用户后,他们无法登录,直到管理员启用该用户; 启用帐户会重置计数

临时锁定算法

  1. 登录成功

    1. 重置计数

  2. 登录失败时

    1. 如果此故障与上次故障之间的时间大于故障复位时间

      1. 重置计数

    2. 增量计数

    3. 计算等待使用等待增量* (计数/最大登录失败)。 除法是整数除法,因此将始终四舍五入为整数

    4. 如果等待等于0,并且此故障与上次故障之间的时间小于快速登录检查毫秒然后设置等待最小快速登录等待相反

      1. 暂时禁用较小的用户等待最大等待

暂时禁用用户时登录失败不增加计数

Keycloak暴力检测的缺点是服务器容易受到拒绝服务攻击。 攻击者可以简单地尝试猜测它知道的任何帐户的密码,这些帐户将被禁用。 最终,我们将扩展此功能,以在决定是否阻止用户时考虑客户端ip地址。

更好的选择可能是这样的工具故障2禁令。 您可以将此服务指向Keycloak服务器的日志文件。 Keycloak记录每个登录失败和失败的客户端ip地址。 Fail2Ban可以用来修改 防火墙检测到攻击以阻止来自特定ip地址的连接。

密码策略

防止密码猜测的另一件事是拥有足够复杂的密码策略,以确保 用户很难猜测密码。 请参阅密码策略章节了解更多细节。

防止密码猜测的最佳方法是将服务器设置为使用一次性密码 (OTP)。

只读用户属性

存储在Keycloak中的典型用户具有与其用户配置文件相关的各种属性。 这些属性包括电子邮件、名字或姓氏。 然而,用户也可能具有属性,这些属性不是典型的配置文件数据,而是元数据。 元数据属性通常应为用户只读 典型的用户永远不应该有办法从Keycloak用户界面或帐户REST API更新这些属性。 一些属性应该 使用Admin REST API创建或更新用户时,管理员甚至是只读的。

元数据属性通常是来自这些组的属性:

  • 与用户存储提供商相关的各种链接或元数据。 例如,在LDAP集成的情况下,LDAP_ID属性包含 LDAP服务器中用户的ID。

  • 由用户存储提供的元数据。 例如创建时间戳从LDAP提供的应始终由用户或管理员只读。

  • 与各种身份验证器相关的元数据。 例如Kerberos _ 校长属性可以包含特定用户的kerberos主体名称。 类似属性 用户证书可以包含与将用户与X.509证书中的数据绑定相关的元数据,该元数据通常在启用X.509证书身份验证时使用。

  • 与应用程序/客户端的用户识别器相关的元数据。 例如saml.persistent.name.id.for.my_app可以包含SAML NameID,它将 由客户端应用程序使用我的应用程序作为用户的标识符。

  • 与授权策略相关的元数据,用于基于属性的访问控制 (ABAC)。 这些属性的值可以用于 授权决定。 因此,重要的是用户不能更新这些属性。

从长远来看,Keycloak将具有适当的用户配置文件SPI,这将允许对每个用户属性进行细粒度配置。 目前 此功能尚未完全可用。 因此,Keycloak具有用户属性的内部列表,该列表对于用户是只读的,对于配置的管理员是只读的 在服务器级别。

这是只读属性的列表,这些属性由Keycloak默认提供程序和功能内部使用,因此始终是只读的:

  • 对于用户:Kerberos _ 校长,LDAP_ID,LDAP_ENTRY_DN,创建 _ 时间戳,创建时间戳,修改时间戳,用户证书,saml.persistent.name.id.for.*,已启用,电子邮件 _ 已验证

  • 对于管理员:Kerberos _ 校长,LDAP_ID,LDAP_ENTRY_DN,创建 _ 时间戳,创建时间戳,修改时间戳

系统管理员可以在此列表中添加其他属性。 该配置当前在服务器级别可用。 您可以将此配置添加到您的独立 (-*)。xmlKeycloak服务器子系统配置的文件:

<spi名称 = "用户配置文件">
    <提供者名称 = “旧版用户配置文件” 已启用 = “true”>
        <属性>
            <属性名称 = "只读属性" value = "[& quot;foo & quot ;,& quot;bar * & quot;]"/>
            <属性名称 = "admin-read-only-attributes" value = "[& quot;foo & quot;]"/>
        </属性>
    </提供者>
</spi>

可以使用以下命令配置JBoss CLI的用法:

/子系统 = 密钥斗篷-服务器/spi = 用户配置文件/: 添加
/subsystem = keycloak-server/spi = userProfile/provider = legacy-user-profile/:add (属性 ={},enabled = true)
/子系统 = keycloak-server/spi = 用户配置文件/提供程序 = 传统用户配置文件/: 地图放置 (名称 = 属性,键 = 只读属性,值 =[foo,bar *])
/子系统 = keycloak-server/spi = 用户配置文件/提供程序 = 传统用户配置文件/: 地图放置 (名称 = 属性,键 = 管理员只读属性,值 =[foo])

对于此示例,用户和管理员将无法更新属性foo。 用户将无法编辑从酒吧。 例如酒吧或者屏障。 配置不区分大小写,因此属性如FOO或者屏障对于这个例子也将被拒绝。 通配符*支持 仅在属性名称的末尾,因此管理员可以有效地拒绝所有以指定字符开头的属性。 的*在属性的中间被认为 作为一个正常的角色。

点击劫持

通过点击劫持,恶意站点将目标站点加载到覆盖在一组假人顶部的透明iFrame中 精心构造的按钮可直接放置在目标站点上的重要按钮下方。 当用户单击可见按钮时,他们实际上是在单击隐藏页面上的按钮 (例如 “登录” 按钮)。 攻击者可以窃取用户的身份验证凭据并访问其资源。

默认情况下,Keycloak的每个响应都会设置一些特定的浏览器标头,以防止这种情况发生。 具体地说,它设置了X-FRAME_OPTIONS内容安全策略。 您应该看看这两个标题的定义,因为您可以控制很多细粒度的浏览器访问。 在管理控制台中,您可以指定这些标题将具有的值。 去领域设置左侧菜单项和 单击安全防御tab并确保您在标题子选项卡。

安全标题

默认情况下,Keycloak仅设置一个同源iframes的策略。

SSL/HTTPS要求

如果您不使用SSL/HTTPS进行Keycloak auth服务器与其保护的客户端之间的所有通信,那么您将非常容易受到中间攻击。 OAuth 2.0/OpenID Connect使用访问令牌以确保安全性。 如果没有SSL/HTTPS,攻击者可以嗅探您的网络并获得访问令牌。 一旦他们有了访问令牌,他们就可以执行令牌被授予权限的任何操作。

Keycloak有SSL/HTTPS的三种模式。 SSL可能很难设置,因此开箱即用,Keycloak允许通过私有ip地址进行非HTTPS通信,例如 localhost、192.168.x和其他私有IP地址。 在生产中,您应该确保启用了SSL,并且需要全面使用。

在适配器/客户端,Keycloak允许您关闭SSL信任管理器。 信任管理器确保客户正在与之交谈的身份。 它根据服务器的证书检查DNS域名。 在生产中,您应确保将每个客户端适配器配置为使用truststore。 否则,您在中间攻击中容易受到DNS攻击。

CSRF攻击

跨站点请求伪造 (CSRF) 是一种基于web的攻击,通过该攻击,从用户那里传输HTTP请求, 网站信任或已经与 (例如通过HTTP重定向或HTML表单)。 任何使用基于cookie的身份验证的网站都容易受到这些类型的攻击。 通过将状态cookie与已发布的表单或查询参数进行匹配,可以减轻这些攻击。

OAuth 2.0登录规范要求使用状态cookie并将其与传输的状态参数进行匹配。 Keycloak完全实现了规范的这一部分,因此所有登录都受到保护。

Keycloak管理控制台是一个纯JavaScript/HTML5应用程序,可以对后端Keycloak管理REST API进行REST调用。 这些调用都需要承载令牌身份验证,并且是通过JavaScript Ajax调用进行的。 CSRF在此不适用。 admin REST API也可以配置为验证CORS起源。

Keycloak中真正属于CSRF的唯一部分是用户帐户管理页面。 为了减轻此问题,请设置一个状态cookie,并将此状态cookie的值嵌入操作链接中的隐藏表单字段或查询参数中。 根据状态cookie检查此查询或表单参数,以验证调用是由用户进行的。

不特定的重定向uri

对于授权代码流,如果您注册了重定向uri 太笼统了,那么流氓客户端就有可能冒充一个范围更广的不同客户端 进入。 例如,如果两个客户端生活在同一域中,则可能会发生这种情况。 所以,让你的 注册的重定向uri尽可能具体。

FAPI合规性

为了确保Keycloak server将验证您的客户端更安全且符合FAPI,您可以配置客户端策略 对于FAPI支持。 的FAPI部分描述了详细信息保护应用程序和服务指南。 除其他外,这确保了一些安全最佳实践 如上所述,如客户端所需的SSL,使用的安全重定向URI以及更多类似的最佳实践。

受损访问和刷新令牌

您可以做一些事情来减轻访问令牌并刷新令牌被盗。 最重要的是在Keycloak及其客户端和应用程序之间强制执行SSL/HTTPS通信。 这似乎很明显,但是由于Keycloak默认情况下未启用SSL,因此管理员可能没有意识到这是必要的。

您可以做的另一件事来减轻泄漏的访问令牌是缩短它们的寿命。 您可以在超时页面。 客户端和应用程序的访问令牌的短寿命 (分钟),以在短时间后刷新其访问令牌。 如果管理员检测到泄漏,他们可以注销所有用户会话以使这些刷新令牌无效或设置撤销策略。 确保刷新令牌始终对客户端保持私有,并且永远不会传输,这一点也非常重要。

您还可以通过将这些令牌作为密钥持有者令牌发行来缓解泄露的访问令牌并刷新令牌。 见OAuth 2.0相互TLS客户端证书绑定访问令牌学习如何。

如果访问令牌或刷新令牌受到威胁,您应该做的第一件事是转到管理控制台,并将非撤销策略推送到所有应用程序。 这将强制在该日期之前发行的任何令牌现在无效。 推送新的非之前策略还将确保应用程序将被迫从Keycloak下载新的公钥,因此,当您认为领域签名密钥受到损害时,它也很有用。 更多信息关键章节

如果您觉得这些实体中的任何一个完全受损,您还可以禁用特定的应用程序、客户端和用户。

受损害的授权码

对于OIDC授权代码流程,攻击者很难破坏Keycloak授权码。 Keycloak为其授权码生成一个加密的强随机值,因此很难猜测访问令牌。 授权码只能使用一次以获取访问令牌。 在管理控制台中,您可以指定授权码在超时页面。 这个值应该非常短,短到几秒钟,并且足够长,以便客户端发出从代码中获取令牌的请求。

您还可以通过将PKCE应用于客户端来缓解泄漏的autorization代码。 见代码交换的证明密钥 (PKCE)学习如何。

开放式重新导演

攻击者可以使用最终用户授权端点和重定向URI参数来滥用授权服务器作为开放重定向器。 开放重定向器是使用参数自动将用户代理重定向到由参数值指定的位置而无需任何验证的端点。 攻击者可以利用用户对授权服务器的信任来发起网络钓鱼攻击。

Keycloak要求所有注册的应用程序和客户端至少注册一个重定向URI模式。 每当客户端要求Keycloak执行重定向时 (例如,在登录或注销时),Keycloak都会检查重定向URI与 有效注册的URI模式列表。 重要的是,客户端和应用程序应尽可能注册特定的URI模式,以减轻打开的重定向器攻击。

密码数据库受损

Keycloak不以原始文本存储密码。 它使用PBKDF2算法存储它们的哈希。 它实际上使用 20,000个哈希迭代的默认值! 这是安全社区推荐的迭代次数。 这可能会对您的系统造成相当大的性能影响,因为PBKDF2设计会吞噬大量的CPU。 由您决定要保护密码数据库的认真程度。

限制范围

默认情况下,每个新的客户端应用程序都有一个无限的角色范围映射。 这意味着每个创建的访问令牌 对于该客户端,将包含用户拥有的所有权限。 如果客户端受到威胁,并且访问令牌 泄露了,那么用户有权访问的每个系统现在也被泄露了。 强烈建议 您限制使用访问令牌分配的角色范围菜单对于每个客户。 或者,您可以在客户端范围级别设置角色范围映射,并通过使用 客户端范围菜单

限制令牌受众

在服务之间的信任度较低的环境中,限制令牌上的受众是一种很好的做法。 的 这背后的动机在OAuth2威胁模型文件和 更多细节在观众支持科

限制身份验证会话

在web浏览器中首次打开登录页面时,Keycloak会创建一个名为身份验证会话的对象,该对象存储有关请求的一些有用信息。 每当从同一浏览器中的不同选项卡打开新的登录页面时,Keycloak都会创建一个名为身份验证子会话的新记录,该记录存储在身份验证会话中。 身份验证请求可以来自任何类型的客户端,例如Admin CLI。 在这种情况下,还会使用一个身份验证子会话创建一个新的身份验证会话。 请注意,除了使用浏览器流之外,还可以通过其他方式创建身份验证会话。 无论源流如何,下面的文本都是适用的。

本节介绍使用Infinispan提供程序进行身份验证会话的部署。

身份验证会话内部存储为Rootautenticationsessionentity。 每个Rootautenticationsessionentity可以将多个身份验证子会话存储在 Rootautenticationsessionentity作为一个集合身份验证会话实体对象。 Keycloak将身份验证会话存储在专用的Infinispan缓存中。 的数量身份验证会话实体Rootautenticationsessionentity贡献每个缓存条目的大小。 身份验证会话缓存的总内存占用由 存储的数量Rootautenticationsessionentity按数量身份验证会话实体在每个Rootautenticationsessionentity

维持的数量Rootautenticationsessionentity对象对应于浏览器未完成的登录流的数量。 保持数量Rootautenticationsessionentity 在控制下,建议使用高级防火墙控制来限制入口网络流量。

对于有许多活动的部署,可能会出现更高的内存使用量Rootautenticationsessionentity有很多身份验证会话实体。 如果负载平衡器不支持或未配置为会话粘性,群集中的网络负载可以 大幅提升。 此负载的原因是,每个登录到不拥有适当身份验证会话的节点上的请求都需要检索 并更新所有者节点中的身份验证会话记录,该记录涉及用于检索和存储的单独网络传输。

的最大数量身份验证会话实体Rootautenticationsessionentity可以配置在身份验证会话SPI通过设置属性授权权限限制。 默认值设置为300身份验证会话实体每aRootautenticationsessionentity。 达到此限制后,将在新的身份验证会话请求后删除最旧的身份验证子会话。

下面的示例演示如何限制活动的数量身份验证会话实体每aRootautenticationsessionentity去100.

<子系统 xmlns=urn:jboss: 域: keycloak-服务器: 1.1>
    ...
    <spi 名称=身份验证会话>
        <默认提供程序>infinispan</默认提供程序>
        <提供者 名称=infinispan 已启用=>
            <属性>
                <属性 名称=授权权限限制 =100/>
            </属性>
        </提供者>
    </spi>
    ...
</子系统>

使用CLI命令的等效配置:

/子系统 = 密钥斗篷服务器/spi = 身份验证会话: 添加 (默认提供程序 = infinispan)
/子系统 = 密钥衣服务器/spi = 身份验证会话/提供程序 = infinispan: 添加 (属性 = {身份验证限制 => "100"},启用 = true)

SQL注入攻击

目前,不知道Keycloak中的任何SQL注入漏洞。

管理CLI

在前面的章节中,我们描述了如何使用Keycloak管理控制台执行管理任务。 您还可以使用Admin CLI命令行工具从命令行界面 (CLI) 执行这些任务。

安装管理命令行界面

管理CLI打包在Keycloak服务器分发中。 您可以在bin目录。

Linux脚本被称为kcadm.sh,并且Windows的脚本被称为kcadm.bat

您可以将Keycloak服务器目录添加到您的路径从文件系统上的任何位置使用客户端。

例如,在:

  • Linux:

$ 导出路径 = $ 路径: $ KEYCLOAK_HOME/bin
$ kcadm.sh
  • 窗口:

c :\> 设置路径 = % 路径 %;% KEYCLOAK_HOME % \ bin
c :\> kcadm

我们假设钥匙锁 _ 主页环境 (env) 变量设置为提取Keycloak服务器分发的路径。

为了避免重复,本文档的其余部分仅在CLI的差异不仅仅是在kcadm命令名称。

使用管理CLI

管理CLI通过向管理REST端点发出HTTP请求来工作。 对它们的访问受到保护,需要身份验证。

有关特定端点的JSON属性的详细信息,请参阅Admin REST API文档。

  1. 通过提供凭据 (即登录) 来启动经过身份验证的会话。 您可以执行创建、读取、更新和删除 (CRUD) 操作。

    例如,在

    • Linux:

      $ kcadm.sh配置凭据-服务器http:// localhost:8080/auth-领域演示-用户管理员-客户端管理员
      $ kcadm.sh创建领域-s领域 = demorealm -s enabled = true -o
      $ CID = $(kcadm.sh创建客户端-r demorealm -s clientId = my_client -s 'redirecturi = [“http:// localhost:8980/myapp/*”] ' -i)
      $ kcadm.sh获取客户端/$ CID/安装/提供商/密钥衣-oidc-密钥衣-json
    • 窗口:

      c :\> kcadm配置凭据-服务器http:// localhost:8080/auth-领域演示-用户管理员-客户端管理员
      c :\> kcadm创建领域-s领域 = demorealm -s enabled = true -o
      c :\> kcadm创建客户端-r demorealm -s clientId = 我的客户端-s "redirecturi = [" http:// 本地主机: 8980/我的app/* \ "]" -i> clientd.txt
      c :\> 设置/p CID = <clienti.txt
      c :\> kcadm获取客户端/% CID %/安装/提供商/密钥斗篷-oidc-密钥斗篷-json
  2. 在生产环境中,您必须使用https:以避免将令牌暴露给网络嗅探器。 如果服务器的证书不是由Java默认证书信任库中包含的受信任证书颁发机构 (ca) 之一颁发的,请准备一个信任商店。jks文件并指示管理员CLI使用它。

    例如,在:

    • Linux:

      $ kcadm.sh配置信任商店-信任通行证 $ 密码 ~/。密钥斗篷/信任商店。jks
    • 窗口:

      c :\> kcadm配置信任商店-信任通行证 % 密码 % % 主页 % \。密钥斗篷 \ 信任商店。jks

认证

使用Admin CLI登录时,指定服务器端点URL和领域,然后指定用户名。 另一种选择是仅指定clientId,这导致使用特殊的 “服务帐户”。 使用用户名登录时,必须使用指定用户的密码。 当您使用clientId登录时,您只需要客户端密钥,而不需要用户密码。 你也可以用签署JWT而不是客户秘密。

确保用于会话的帐户具有调用Admin REST API操作的适当权限。 例如,领域管理员的作用领域管理客户端允许用户管理定义用户的领域。

有两种主要的身份验证机制。 一种机制使用kcadm配置凭据启动经过身份验证的会话。

$ kcadm.sh配置凭据-服务器http:// localhost:8080/auth-领域主服务器-用户管理员-密码管理员

此方法在kcadm通过保存获取的访问令牌和关联的刷新令牌来调用命令。 它还可能在私有配置文件中维护其他秘密。 见下一章有关配置文件的更多信息。

第二种方法仅在调用期间对每个命令调用进行身份验证。 这种方法增加了服务器上的负载,并增加了往返获取令牌所花费的时间。 这种方法的好处是不需要在调用之间保存任何令牌,这意味着什么都不会保存到磁盘。 当-- 无配置指定参数。

例如,在执行操作时,我们指定身份验证所需的所有信息。

$ kcadm.sh获取领域 -- 无配置 -- 服务器http:// localhost:8080/auth -- 领域主-用户管理员-密码管理员

运行kcadm.sh帮助命令以获取有关使用Admin CLI的更多信息。

运行kcadm.sh配置凭据-帮助命令,以获取有关启动经过身份验证的会话的更多信息。

使用替代配置

默认情况下,管理员CLI会自动维护一个名为kcadm.config位于用户的主目录下。 在基于Linux的系统中,完整的路径名是$ HOME/.keycloak/kcadm.config。 在Windows上,完整的路径名为% HOMEPATH % \.keycloak \ kcadm.config。 您可以使用-配置选项指向不同的文件或位置,以便您可以并行维护多个经过身份验证的会话。

最好从单个线程执行绑定到单个配置文件的操作。

确保您没有使配置文件对系统上的其他用户可见。 它包含访问令牌和应该保密的秘密。 默认情况下,~/。Keycloak目录及其内容是在适当的访问限制下自动创建的。 如果目录已经存在,则其权限不会更新。

如果您的独特情况要求您避免将机密存储在配置文件中,则可以这样做。 这将不太方便,您将不得不提出更多令牌请求。 要不存储秘密,请使用-- 无配置选项与您的所有命令一起,并指定所需的所有身份验证信息配置凭据每个命令kcadm调用。

基本操作和资源uri

Admin CLI允许您通过简化执行某些任务的其他命令,对Admin REST API端点执行CRUD操作。

下面列出了主要的使用模式,其中创建,获取,更新,以及删除命令被映射到HTTP动词邮政,获取,,以及删除,分别。

$ kcadm.sh创建端点 [参数]
$ kcadm.sh获取端点 [参数]
$ kcadm.sh更新端点 [参数]
$ kcadm.sh删除端点 [参数]

端点是目标资源URI,可以是绝对的 (从http:或者https:) 或相对,用于组成以下格式的绝对URL:

服务器 _ uri/管理/领域/端点

例如,如果您对服务器进行身份验证http:// localhost:8080/auth领域是大师,然后使用用户作为端点结果在资源URLhttp:// localhost:8080/auth/admin/realms/master/users

如果您将端点设置为客户,则有效资源URI将为http:// localhost:8080/auth/admin/realms/master/clients

有一个领域端点的处理略有不同,因为它是领域的容器。 它解决为:

服务器 _ uri/管理/领域

还有一个服务器信息端点,它被以同样的方式对待,因为它独立于领域。

当您使用realm-admin权限作为用户进行身份验证时,您可能需要在多个领域执行命令。 在这种情况下,指定-r选项,明确告诉命令应该针对哪个领域执行。 而不是使用境界如通过-领域选项kcadm.sh配置凭据,目标领域被使用。

服务器 _ uri/管理/领域/目标 _ 领域/端点

例如,

$ kcadm.sh配置凭据-服务器http:// localhost:8080/auth-领域主服务器-用户管理员-密码管理员
$ kcadm.sh创建用户-s用户名 = testuser -s enabled = true -r demorealm

在此示例中,您将启动一个经过身份验证的会话管理员用户在大师境界。 然后,您对资源URL执行POST调用http:// localhost:8080/auth/admin/realms/demorealm/users

创建更新命令默认情况下向服务器发送JSON主体。 您可以使用-f文件名从文件中读取预制文档。 当你可以使用-f-选项,从标准输入读取消息正文。 您还可以指定单个属性及其值,如前面所示创建用户示例。 它们被组成一个JSON主体并发送到服务器。

有几种方法可以使用更新指挥。 您可以首先确定资源的当前状态并将其保存到文件中,然后编辑该文件并将其发送到服务器进行更新。

例如:

$ kcadm.sh获取领域/demorealm > demorealm.json
$ vi demorealm.json
$ kcadm.sh更新领域/demorealm -f demorealm.json

此方法使用发送的JSON文档中的所有属性更新服务器上的资源。

另一种选择是使用-s,-设置设置新值的选项。

例如:

$ kcadm.sh更新领域/demorealm -s启用 = false

该方法仅更新已启用属性为

默认情况下,更新命令首先执行获取,然后将新属性值与现有值合并。 这是首选行为。 在某些情况下,端点可能支持命令,但不是获取指挥。 您可以使用-n选项来执行 “不合并” 更新,该更新执行命令,而无需先运行获取指挥。

领域操作

开创新境界

使用创建命令领域端点创建一个新的启用的领域,并将属性设置为境界已启用

$ kcadm.sh创建领域-s领域 = demorealm -s enabled = true

默认情况下未启用领域。 通过启用它,您可以立即使用一个领域进行身份验证。

新对象的描述也可以是JSON格式。

$ kcadm.sh创建领域-f demorealm.json

您可以直接从文件发送具有领域属性的JSON文档,也可以通过管道发送到标准输入。

例如,在:

  • Linux:

$ kcadm.sh创建领域-f - << EOF
{"realm": "demorealm","enabled": true}
EOF
  • 窗口:

c :\> 回声 {"领域": "demorealm","enabled": true } | kcadm创建领域-f-

列出现有领域

以下命令返回所有领域的列表。

$ kcadm.sh获得领域

服务器上还会过滤一个领域列表,以仅返回用户可以看到的领域。

返回整个领域描述往往提供了太多的信息。 大多数用户只对属性的子集感兴趣,例如领域名称和领域是否启用。 您可以通过使用-领域选项。

$ kcadm.sh获取领域-领域领域,启用

您还可以将结果显示为逗号分隔的值。

$ kcadm.sh获取领域-字段领域-格式csv-无引号

获得特定领域

您将领域名称附加到集合URI以获取单个领域。

$ kcadm.sh获得领域/大师

更新领域

  1. 使用-s当您只想更改领域的某些属性时,可以选择为属性设置新值。

    例如:

    $ kcadm.sh更新领域/demorealm -s启用 = false
  2. 如果要使用新值设置所有可写属性,请运行获取命令,编辑JSON文件中的当前值,然后重新提交。

    例如:

    $ kcadm.sh获取领域/demorealm > demorealm.json
    $ vi demorealm.json
    $ kcadm.sh更新领域/demorealm -f demorealm.json

删除领域

执行以下命令删除某个领域。

$ kcadm.sh删除领域/demorealm

打开领域的所有登录页面选项

将控制特定功能的属性设置为

例如:

$ kcadm.sh更新领域/demorealm -s注册允许 = true -s注册emailusername = true -s remember = true -s verifyEmail = true -s resetpassword允许 = true -s editusername允许 = true

列出领域键

使用获取钥匙目标领域的端点。

$ kcadm.sh获取钥匙-r demorealm

生成新境界键

  1. 在添加新的RSA生成的密钥对之前,获取目标领域的ID。

    例如:

    $ kcadm.sh获取领域/demorealm-字段id-格式csv-无引号
  2. 添加一个新的密钥提供程序,其优先级高于现有提供程序,如kcadm.sh获取钥匙-r demorealm

    例如,在:

    • Linux:

      $ kcadm.sh创建组件-r demorealm -s name = rsa-generated -s providerId = rsa-generated -s providerType = org.keycloak.keys.KeyProvider -s parentId = 959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority =["101"]' -s 'config.enabled =["true"]'-s'config.active =["true"]'-s'config.keySize =["2048"]'
    • 窗口:

      c :\> kcadm创建组件-r demorealm -s name = rsa-generated -s providerId = rsa-generated -s providerType = org.keycloak.keys.KeyProvider -s parentId = 959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority =[\" 101 \ "]" -s "config.enabled = [" true "]" -s "配置.active = [" true "]" -s "config.keySize = [" 2048 "]"
  3. 设置父母属性为目标领域的ID的值。

    新添加的密钥现在应该成为活动密钥,由kcadm.sh获取钥匙-r demorealm

从Java密钥存储文件添加新的领域密钥

  1. 添加新的密钥提供程序以添加已经准备为服务器上的JKS文件的新密钥对。

    例如,在:

    • Linux:

      $ kcadm.sh创建组件-r demorealm -s name = java-keystore -s providerId = java-keystore -s providerType = org.keycloak.keys.KeyProvider -s parentId = 959844c1-d149-41d7-8359-6aa527fca0b0 -s 'config.priority =["101"]' -s 'config.enabled =["true"]'-s'config.active =["true"]'-s'config.keystore =["/opt/keycloak/keystore.jks"]'-s'config.keystorePassword =["secret"]'-s'config.keyPassword =["secret"]' -s 'config.keyAlias =["localhost"]'
    • 窗口:

      c :\> kcadm创建组件-r demorealm -s name = java-keystore -s providerId = java-keystore -s providerType = org.keycloak.keys.KeyProvider -s parentId = 959844c1-d149-41d7-8359-6aa527fca0b0 -s "config.priority =[\" 101 \ "]" -s "config.enabled =[\" true \ "]" -s "配置。活动 =[\" true \ "]" -s "配置。密钥库 =[\"/opt/密钥衣/密钥库.jks \ "]" -s "配置。密钥库密码 =[\" 秘密 \ "]" -s "config.keyPassword = [" 秘密 "]" -s "config.keyAlias = [" 本地主机 "]"
  2. 确保更改的属性值密钥库,keystorePassword,键盘密码,以及别名以匹配您的特定密钥库。

  3. 设置父母属性为目标领域的ID的值。

使钥匙被动或禁用钥匙

  1. 确定你想让被动的关键

    $ kcadm.sh获取钥匙-r demorealm
  2. 使用钥匙的供应商属性来构造端点URI,例如组件/供应商 _ 标识

  3. 执行更新

    例如,在:

    • Linux:

      $ kcadm.sh更新组件/供应商 _ id-r demorealm -s 'config.active =["false"]'
    • 窗口:

      c :\> kcadm更新组件/供应商 _ id-r demorealm -s “配置。活动 =[\“ false ”]”

      您可以更新其他关键属性。

  4. 设置一个新的已启用值来禁用键,例如,config.enabled =["false"]

  5. 设置一个新的优先级值以更改键的优先级,例如,config.priority =["110"]

删除旧密钥

  1. 确保您要删除的密钥已被被动禁用,以防止应用程序和用户持有的任何现有令牌突然无法正常工作。

  2. 确定你想要被动的钥匙。

    $ kcadm.sh获取钥匙-r demorealm
  3. 使用供应商执行删除的键。

    $ kcadm.sh删除组件/供应商 _ id-r demorealm

为领域配置事件日志

使用更新命令事件/配置端点。

事件侦听器属性包含指定接收事件的所有事件侦听器的EventListenerProviderFactory id列表。 另外,还有一些控制内置事件存储的属性,该属性允许通过Admin REST API查询过去的事件。 对服务调用的日志记录有单独的控制 (事件提交) 和在管理控制台或管理REST API期间触发的审计事件 (已提交管理事件)。 您可能想要设置旧事件的过期,以便您的数据库不会填满;事件到期设置为以秒表示的生存时间。

下面是一个设置内置事件侦听器的示例,该侦听器接收所有事件并通过jboss-logging记录它们。 (使用名为组织。Keycloak。事件,错误事件记录为警告,其他记录为调试。)

例如,在:

  • Linux:

$ kcadm.sh更新事件/配置-r demorealm -s 'eventsListeners =["jboss-日志记录"]'
  • 窗口:

c :\> kcadm更新事件/配置-r demorealm -s "eventsListeners =[\" jboss日志记录 "]"

这是一个打开存储所有可用的错误事件 (不包括审核事件) 的示例,为期2天,以便可以通过Admin REST检索它们。

例如,在:

  • Linux:

$ kcadm.sh更新事件/config -r demorealm -s eventsEnabled = true-s'enabledeventtypes = [“登录 _ 错误” 、 “注册 _ 错误” 、 “注销 _ 错误” 、 “代码 _ 到 _ 令牌 _ 错误” 、 “客户端 _ 登录 _ 错误” 、 “联邦身份 _ 链接 _ 错误” 、 “删除 _ 联邦身份 _ 错误” 、 “更新 _ 电子邮件 _ 错误” 、 “更新 _ 文件 _ 错误” “更新 _ 密码 _ 错误” 、 “验证 _ 电子邮件 _ 错误” 、 “删除 _ 密码 _ 错误” 、 “发送 _ 验证 _ 电子邮件 _ 错误” 、 “发送 _ 重新设置 _ 密码 _ 错误” 、 “发送 _ 标识符 _ 提供者 _ 链接 _ 错误” 、 “重新设置 _ 密码 _ 错误” 、 “执行 _ 操作 _ 错误” 、 “client_register_clierror” 、 “更新 _ 错误” "客户端删除错误"]'-事件过期 = 172800
  • 窗口:

c :\> kcadm更新事件/配置-r demorealm -s eventsEnabled = true -s "enabledEventTypes = [" 登录 _ 错误 "、" 注册 _ 错误 "、" 注销 _ 错误 "、" 代码 _ 到 _ 令牌 _ 错误 "、" 客户端 _ 登录 _ 错误 "、" 联邦身份 _ 链接 _ 错误 ",“ 删除 _ 联邦 _ 身份 _ 错误 ”、“ 更新 _ 电子邮件 _ 错误 ”、“ 更新 _ 配置文件 _ 错误 ”、“ 更新 _ 密码 _ 错误 ”、“ 验证 _ 电子邮件 _ 错误 ”、“ 发送 _ 验证 _ 密码 _ 错误 ”、“ 发送 _ 标识符 _ 提供 _ 链接 _ 错误 ”、“ 发送 _ 验证 _ 电子邮件 _ 错误 ”“ 重置 _ 密码 _ 错误 ”、“ 身份 _ 提供商 _ 第一 _ 登录 _ 错误 ”、“ 身份 _ 提供商 _ 后 _ 登录 _ 错误 ”、“ 自定义 _ 所需 _ 操作 _ 错误 ”、“ 执行 _ 操作 _ 错误 ”、“ 客户端 _ 注册 _ 错误 ”、“ 客户端 _ 更新 _ 错误 ”、“ 客户端 _ 删除 _ 错误 ”]-事件到期 = 172800

以下是如何将存储的事件类型重置为所有可用的事件类型; 设置为空列表与枚举所有相同。

$ kcadm.sh更新事件/配置-r demorealm -s enabledEventTypes =[]

下面是如何启用审计事件存储的示例。

$ kcadm.sh更新事件/配置-r demorealm -s adminEventsEnabled = true -s adminEventsDetailsEnabled = true

这是如何获取最后100事件的示例; 它们是从最新到最旧的顺序。

$ kcadm.sh获取事件-偏移0-限制100

下面是如何删除所有保存的事件的示例。

$ kcadm删除事件

刷新缓存

  1. 使用创建命令和以下端点之一:清除领域缓存,清除用户缓存,或者清除密钥缓存

  2. 设置境界到与目标领域相同的值。

    例如:

    $ kcadm.sh创建清晰领域缓存-r demorealm -s领域 = demorealm
    $ kcadm.sh创建清除用户缓存-r demorealm -s领域 = demorealm
    $ kcadm.sh创建清除键缓存-r demorealm -s领域 = demorealm

从导出导入一个领域。json文件

  1. 使用创建命令部分导入端点。

  2. 设置如果资源存在给其中一个失败,跳过,覆盖

  3. 使用-f提交导出的领域。json文件

    例如:

    $ kcadm.sh创建部分导入-r demorealm2 -s ifResourceExists = 失败-o -f demorealm.json

    如果领域尚不存在,则首先必须创建它。

    例如:

    $ kcadm.sh创建领域-s领域 = demorealm2 -s enabled = true

角色操作

创建领域角色

使用角色创建领域角色的端点。

$ kcadm.sh创建角色-r demorealm -s name = user -s '描述 = 具有有限权限集的普通用户'

创建客户端角色

  1. 首先识别客户端,然后使用获取创建客户端角色时列出可用客户端的命令。

    $ kcadm.sh获取客户端-r demorealm-字段id,clientId
  2. 通过使用clientId属性来构造端点URI,例如客户/身份/角色

    例如:

    $ kcadm.sh创建客户端/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/角色-r demorealm -s name = editor -s 'description = Editor可以编辑和发布任何文章'

列出领域角色

使用获取命令角色端点列出现有领域角色。

$ kcadm.sh获得角色-r demorealm

您也可以使用获取角色指挥。

$ kcadm.sh获取角色-r demorealm

列出客户端角色

有一个专用的获取角色命令来简化列出领域和客户端角色。 它是获取命令和行为与列出角色的其他语义相同。

使用获取角色命令,将其传递给clientId属性 (通过-- cclientid选项) 或id(通过-- cid选项),以标识要列出客户端角色的客户端。

例如:

$ kcadm.sh获取角色-r demorealm-cclientid领域-管理

获得特定的领域角色

使用获取命令和角色名称要为特定领域角色构建端点URI:角色/角色名称,其中用户是现有角色的名称。

例如:

$ kcadm.sh获取角色/用户-r demorealm

你也可以使用特殊的获取角色命令,传递给它一个角色名称 (通过-rolename选项) 或ID (通过-roleid选项)。

例如:

$ kcadm.sh获取角色-r demorealm-rolename用户

获得特定的客户角色

使用专用的获取角色命令,将其传递给clientId属性 (通过-- cclientid选项) 或ID (通过-- cid选项) 以标识客户端,并将其传递给角色名称 (通过-rolename选项) 或ID (通过-roleid),以确定特定的客户角色。

例如:

$ kcadm.sh获取角色-r demorealm-cclientid领域-管理-rolename管理-客户端

更新领域角色

使用更新具有与您用来获取特定领域角色相同的端点URI的命令。

例如:

$ kcadm.sh更新角色/用户-r demorealm -s '描述 = 代表常规用户的角色'

更新客户端角色

使用更新具有与您用来获取特定客户端角色相同的端点URI的命令。

例如:

$ kcadm.sh更新客户端/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/角色/编辑器-r demorealm -s '描述 = 可以编辑和发布文章的用户'

删除领域角色

使用删除具有与您用来获取特定领域角色相同的端点URI的命令。

例如:

$ kcadm.sh删除角色/用户-r demorealm

删除客户端角色

使用删除具有与您用来获取特定客户端角色相同的端点URI的命令。

例如:

$ kcadm.sh删除客户端/a95b6af3-0bdc-4878-ae2e-6d61a4eca9a0/角色/编辑器-r demorealm

列出复合角色的分配、可用和有效领域角色

使用专用的获取角色命令列出复合角色的已分配、可用和有效领域角色。

  1. 要列出已分配领域角色对于复合角色,您可以通过任一名称 (通过-- rname选项) 或ID (通过-rid选项)。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole-有效
  3. 使用-可用列出仍可添加到复合角色的领域角色的选项。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole-可用

列出复合角色的已分配、可用和有效的客户角色

使用专用的获取角色命令列出复合角色的已分配、可用和有效的客户端角色。

  1. 要列出已分配客户角色对于复合角色,您可以通过任一名称指定目标复合角色 (通过-- rname选项) 或ID (通过-rid选项) 和客户端通过clientId属性 (通过-- cclientid选项) 或ID (通过-- cid选项)。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole-cclientid领域-管理
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole-cclientid领域-管理-有效
  3. 使用-可用列出仍可添加到目标复合角色的领域角色的选项。

    例如:

    $ kcadm.sh get-roles -r demorealm-rname testrole-cclientid领域-管理-可用

将领域角色添加到复合角色

有一个专用的添加-角色可用于添加领域角色和客户端角色的命令。

下面的示例添加了用户角色到复合角色测试角色

$ kcadm.sh添加-角色-rname测试角色-rolename用户-r demorealm

从复合角色中删除领域角色

有一个专用的移除-角色可用于删除领域角色和客户端角色的命令。

下面的示例删除了用户来自目标复合角色的角色测试角色

$ kcadm.sh删除角色-rname测试角色-rolename用户-r demorealm

向领域角色添加客户端角色

使用专用的添加-角色可用于添加领域角色和客户端角色的命令。

下面的示例添加客户端上定义的角色领域管理-创建-客户端角色和视图-用户测试角色复合角色。

$ kcadm.sh添加-角色-r demorealm-rname测试角色-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

将客户端角色添加到客户端角色

  1. 通过使用获取角色指挥。

    例如:

    $ kcadm.sh get-roles -r demorealm-cclientid测试-客户端-rolename操作
  2. 假设有一个客户端的clientId属性为测试-客户端,一个名为支持,另一个客户端角色称为操作,它成为一个复合角色,其ID为 “fc400897-ef6a-4e8c-872b-1581b7fa8a71”。

  3. 使用以下示例向复合角色添加另一个角色。

    $ kcadm.sh添加-角色-r demorealm-cclientid测试-客户端-rid fc400897-ef6a-4e8c-872b-1581b7fa8a71-rolename支持
  4. 通过使用获取角色-全部指挥。

    例如:

    $ kcadm.sh获取角色-摆脱fc400897-ef6a-4e8c-872b-1581b7fa8a71-全部

从复合角色中删除客户端角色

使用专用的移除-角色命令从复合角色中删除客户端角色。

使用以下示例删除客户端上定义的两个角色领域管理-创建-客户端角色和视图-用户角色来自测试角色复合角色。

$ kcadm.sh删除-角色-r demorealm-rname测试角色-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

向组添加客户端角色

使用专用的添加-角色可用于添加领域角色和客户端角色的命令。

下面的示例添加客户端上定义的角色领域管理-创建-客户端角色和视图-用户组 (通过-- gname选项)。 可以通过ID (通过-- gid选项)。

集团运营对于可以对组执行的更多操作。

$ kcadm.sh添加-角色-r demorealm-gname组-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

从组中删除客户端角色

使用专用的移除-角色命令从组中删除客户端角色。

使用以下示例删除客户端上定义的两个角色领域管理-创建-客户端角色和视图-用户角色来自组。

集团运营对于可以对组执行的更多操作。

$ kcadm.sh删除-角色-r demorealm-gname组-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

客户端操作

创建客户端

  1. 运行创建命令上的客户创建新客户端的端点。

    例如:

    $ kcadm.sh创建客户端-r demorealm -s clientId = myapp -s enabled = true
  2. 如果要为要进行身份验证的适配器设置秘密,请指定秘密。

    例如:

    $ kcadm.sh创建客户端-r demorealm -s clientId = myapp -s enabled = true -s clientauthentatortype = 客户端-secret -s secret = d0b8122f-8dfb-46b7-b68a-f5cc4e25d000

列出客户

使用获取命令客户endpoint来列出客户端。

例如:

$ kcadm.sh获取客户端-r demorealm-字段id,clientId

此示例过滤输出以仅列出idclientId属性。

获得特定客户

使用客户端的ID构造针对特定客户端的端点URI,例如客户/身份证

例如:

$ kcadm.sh获取客户/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

获取特定客户的当前秘密

使用客户端的ID构造端点URI,例如客户端/ID/客户端-秘密

例如:

$ kcadm.sh获取客户端/$ CID/客户端-秘密

为特定客户端生成新秘密

使用客户端的ID构造端点URI,例如客户端/ID/客户端-秘密

例如:

$ kcadm.sh创建客户端/$ CID/客户端-秘密

更新特定客户端的当前秘密

使用客户端的ID构造端点URI,例如客户/身份证

例如:

$ kcadm.sh更新客户端/$ CID -s "secret = newSecret"

获取特定客户端的适配器配置文件 (keycloak.json)

使用客户端的ID构造针对特定客户端的端点URI,例如客户端/标识/安装/提供商/密钥衣-oidc-密钥衣-json

例如:

$ kcadm.sh获取客户端/c7b8547f-e748-4333-95d0-410b76b3f4a3/安装/提供商/密钥斗篷-oidc-密钥斗篷-json -r demorealm

获取特定客户端的WildFly子系统适配器配置

使用客户端的ID构造针对特定客户端的端点URI,例如客户端/标识/安装/提供商/密钥斗篷-oidc-jboss-子系统

例如:

$ kcadm.sh获取客户端/c7b8547f-e748-4333-95d0-410b76b3f4a3/安装/提供商/密钥斗篷-oidc-jboss-子系统-r demorealm

获取特定客户端的Docker-v2示例配置

使用客户端的ID构造针对特定客户端的端点URI,例如客户端/ID/安装/提供商/docker-v2-compose-yaml

请注意,响应将在。拉链格式。

例如:

$ kcadm.sh获取http:// localhost:8080/auth/admin/realms/demorealm/clients/8f271c35-44e3-446f-8953-b0893810ebe7/installation/providers/docker-v2-compose-yaml -r demorealm > keycloak-docker-compose-yaml.zip

更新客户端

使用更新具有与您用来获取特定客户端的端点URI相同的命令。

例如,在:

  • Linux:

$ kcadm.sh更新客户端/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled = false -s publicClient = true-s'redirecturis =["http:// 本地主机: 8080/我的app/*"]' -s baseUrl = http:// 本地主机: 8080/我的app -s adminUrl = http:// 本地主机: 8080/myapp
  • 窗口:

c :\> kcadm更新客户端/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm -s enabled = false -s publicClient = true -s "redirecturi = [" http:// 本地主机: 8080/我的app/* \ "]-本地主机 = http:// 本地主机: 8080/我的app -s adminUrl = http:// 本地主机: 8080/myapp

删除客户端

使用删除具有与您用来获取特定客户端的端点URI相同的命令。

例如:

$ kcadm.sh删除客户端/c7b8547f-e748-4333-95d0-410b76b3f4a3 -r demorealm

为客户的服务帐户添加或删除角色

客户端的服务帐户只是一种具有用户名的特殊用户帐户service-account-CLIENT_ID。 您可以像普通用户一样对该帐户执行用户操作。

用户操作

创建用户

运行创建命令用户创建新用户的端点。

例如:

$ kcadm.sh创建用户-r demorealm -s用户名 = testuser -s enabled = true

列出用户

使用用户endpoint以列出用户。 目标用户下次登录时必须更改密码。

例如:

$ kcadm.sh获取用户-r demorealm-偏移0-限制1000

您可以通过以下方式过滤用户用户名,名字,姓氏,或者电子邮件

例如:

$ kcadm.sh获取用户-r demorealm -q email = google.com
$ kcadm.sh获取用户-r demorealm -q用户名 = testuser

过滤不使用精确匹配。 例如,上面的示例将匹配用户名针对* 测试用户 *模式。

您还可以通过指定多个属性来过滤多个属性-问选项,这些选项仅返回与所有属性的条件匹配的用户。

获取特定用户

使用用户的ID组成端点URI,例如用户/用户标识

例如:

$ kcadm.sh获取用户/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

更新用户

使用更新具有与您用来获取特定用户相同的端点URI的命令。

例如,在:

  • Linux:

$ kcadm.sh更新用户/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s 'required actions =["VERIFY_EMAIL","UPDATE_PROFILE","CONFIGURE_TOTP","UPDATE_PASSWORD"]'
  • 窗口:

c :\> kcadm更新用户/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm -s "required actions = [" 验证 _ 电子邮件 "," 更新 _ 配置文件 "," 配置 _ totp "," 更新 _ 密码 "]"

删除用户

使用删除具有与您用来获取特定用户相同的端点URI的命令。

例如:

$ kcadm.sh删除用户/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2 -r demorealm

重置用户密码

使用专用的设置-密码重置用户密码的命令。

例如:

$ kcadm.sh set-密码-r demorealm-用户名测试用户-新密码-临时

该命令为用户设置临时密码。 目标用户下次登录时必须更改密码。

您可以使用-- 用户标识如果您想通过使用id属性。

您可以使用更新从用于获取特定用户的端点构造的端点上的命令,例如用户/用户标识/重置密码

例如:

$ kcadm.sh更新用户/0ba7a3fd-6fd8-48cd-a60b-2e8fd82d56e2/reset-password -r demorealm -s类型 = password -s值 = NEWPASSWORD -s临时 = true -n

最后一个参数 (-n) 确保只有命令在没有事先通知的情况下执行获取指挥。 在这种情况下是必要的,因为重置-密码端点不支持获取

列出为用户分配的、可用的和有效的领域角色

您可以使用专用的获取角色命令列出用户分配的、可用的和有效的领域角色。

  1. 通过要列出的用户名或ID指定目标用户已分配用户的领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-uusername testuser
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-uusername testuser-有效
  3. 使用-可用选项,列出仍然可以添加到用户的领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-uusername testuser-可用

列出为用户分配的、可用的和有效的客户端角色

使用专用的获取角色命令列出为用户分配的、可用的和有效的客户端角色。

  1. 通过用户名指定目标用户 (通过-- uusername选项) 或ID (通过-- uid选项) 和客户端通过clientId属性 (通过-- cclientid选项) 或ID (通过-- cid选项) 以列出已分配用户的客户端角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-uusername testuser-cclientid领域-管理
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-uusername testuser-cclientid领域-管理-有效
  3. 使用-可用选项,列出仍然可以添加到用户的领域角色。

    例如:

    $ kcadm.sh获取-角色-r demorealm-uusername testuser-cclientid领域-管理-可用

向用户添加领域角色

使用专用的添加-角色向用户添加领域角色的命令。

使用以下示例添加用户用户角色测试用户

$ kcadm.sh添加-角色-uusername测试用户-rolename用户-r demorealm

从用户中删除领域角色

使用专用的移除-角色命令从用户中删除领域角色。

使用以下示例删除用户来自用户的角色测试用户

$ kcadm.sh删除-角色-uusername测试用户-rolename用户-r demorealm

向用户添加客户端角色

使用专用的添加-角色向用户添加客户端角色的命令。

使用以下示例添加客户端上定义的两个角色领域管理-创建-客户端角色和视图-用户对用户的角色测试用户

$ kcadm.sh添加-角色-r demorealm-uusername测试用户-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

从用户中删除客户端角色

使用专用的移除-角色命令从用户中删除客户端角色。

使用以下示例删除在realm management客户端上定义的两个角色。

$ kcadm.sh删除-角色-r demorealm-uusername testuser-cclientid领域-管理-rolename创建-客户端-rolename视图-用户

列出用户的会话

  1. 标识用户的ID,然后使用它来组成端点URI,例如用户/身份/会话

  2. 使用获取命令来检索用户会话列表。

    例如:

    $ kcadm获取用户/6da5ab89-3397-4205-afaa-e201ff638f9e/会话

从特定会话注销用户

  1. 如上所述确定会话的ID。

  2. 使用会话的ID组成端点URI,例如会话/ID

  3. 使用删除命令使会话无效。

    例如:

    $ kcadm.sh删除会话/d0eaa7cc-8c5d-489d-811a-69d3c4ec84d1

从所有会话中注销用户

您需要用户的ID来构建端点URI,例如用户/标识/注销

使用创建要执行的命令邮政在该端点URI上。

例如:

$ kcadm.sh create users/6da5ab89-3397-4205-afaa-e201ff638f9e/logoout-r demorealm -s realm = demorealm -s user = 6da5ab89-3397-4205-afaa-e201ff638f9e

集团运营

创建组

使用创建命令创建新组的端点。

例如:

$ kcadm.sh创建组-r demorealm -s名称 = 组

上市组

使用获取命令列表组的端点。

例如:

$ kcadm.sh获取组-r demorealm

获取特定组

使用组的ID构造端点URI,例如组/组 _ 标识

例如:

$ kcadm.sh获取组/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

更新组

使用更新具有与您用来获取特定组的端点URI相同的命令。

例如:

$ kcadm.sh更新组/51204821-0580-46db-8f2d-27106c6b5ded -s '属性.email =["group@example.com"]' -r demorealm

删除组

使用删除具有与您用来获取特定组的端点URI相同的命令。

例如:

$ kcadm.sh删除组/51204821-0580-46db-8f2d-27106c6b5ded -r demorealm

创建子组

通过列出组查找父组的ID,然后使用该ID构造端点URI,例如组/组 _ id/子组

例如:

$ kcadm.sh创建组/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s name = 子组

将一个组移到另一个组下

  1. 查找现有父组和现有子组的ID。

  2. 使用父组的ID构造端点URI,例如组/父组 _ id/子组

  3. 运行创建命令在这个端点上,并将子组的ID作为JSON主体传递。

例如:

$ kcadm.sh create groups/51204821-0580-46db-8f2d-27106c6b5ded/children -r demorealm -s id = 08d410c6-d585-4059-bb07-54dcb92c5094

获取特定用户的组

使用用户id确定用户在组中的成员身份以组成端点URI,例如用户/用户标识/组

例如:

$ kcadm.sh获取用户/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/组-r demorealm

将用户添加到组

使用更新具有由用户ID和组ID组成的端点URI的命令,例如用户/用户标识/组标识,将用户添加到组中。

例如:

$ kcadm.sh更新用户/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/组/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm -s领域 = demorealm -s用户id = b544f379-5fc4-49e5-8a8d-5cfb71f46f53 -s groupId = ce01117a-7426-4670-a29a-5c118056fe20 -n

从组中删除用户

使用删除在用于将用户添加到组的同一端点URI上的命令,例如用户/用户标识/组标识,以从组中删除用户。

例如:

$ kcadm.sh删除用户/b544f379-5fc4-49e5-8a8d-5cfb71f46f53/组/ce01117a-7426-4670-a29a-5c118056fe20 -r demorealm

列出组的已分配、可用和有效领域角色

使用专用的获取角色命令列出组的已分配、可用和有效领域角色。

  1. 按名称指定目标组 (通过-- gname选项) 、路径 (通过 [命令]-- gpath选项) 或ID (通过-- gid选项) 以列出已分配小组的领域角色。

    例如:

    $ kcadm.sh获取角色-r demorealm-gname组
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh获取-角色-r demorealm-gname组-有效
  3. 使用-可用列出仍可添加到组中的领域角色的选项。

    例如:

    $ kcadm.sh获取-角色-r demorealm-gname组-可用

列出组的已分配、可用和有效的客户端角色

使用专用的获取角色命令列出组的已分配、可用和有效的客户端角色。

  1. 通过任一名称指定目标组 (通过-- gname选项) 或ID (通过-- gid选项),并通过clientId属性 (通过 [命令]-- cclientid选项) 或ID (通过-- id选项) 以列出已分配用户的客户端角色。

    例如:

    $ kcadm.sh get-roles -r demorealm-gname Group-cclientid领域-管理
  2. 使用额外的-- 有效列出选项有效领域角色。

    例如:

    $ kcadm.sh获取-角色-r demorealm-gname组-cclientid领域-管理-有效
  3. 使用-可用列出仍可添加到组中的领域角色的选项。

    例如:

    $ kcadm.sh获取-角色-r demorealm-gname组-cclientid领域-管理-可用

身份提供者操作

列出可用的身份提供者

使用服务器信息端点列出可用的身份提供者。

例如:

$ kcadm.sh获取服务器信息-r demorealm-字段 “身份提供者 (*)”

服务器信息端点的处理方式类似于领域端点,因为它存在于任何特定领域之外,因此无法相对于目标领域进行解析。

列出配置的身份提供程序

使用身份提供者/实例端点。

例如:

$ kcadm.sh获取身份-提供者/实例-r demorealm-字段别名,提供者id,已启用

获取特定配置的身份提供程序

使用别名用于构造端点URI的身份提供程序的属性,例如身份提供者/实例/别名,以获取特定的身份提供者。

例如:

$ kcadm.sh获取身份提供商/实例/脸书-r demorealm

删除特定配置的身份提供程序

使用删除具有与您用来获取特定配置的身份提供程序以删除特定配置的身份提供程序的相同端点URI的命令。

例如:

$ kcadm.sh删除身份提供商/实例/脸书-r demorealm

配置Keycloak OpenID Connect身份提供程序

  1. 使用Keycloak-oidc作为供应商创建新的身份提供程序实例时。

  2. 提供配置属性:授权url,令牌url,clientId,以及客户秘密

    例如:

    $ kcadm.sh创建身份-提供者/实例-r demorealm -s别名 = keycloak-oidc -s providerId = keycloak-oidc -s enabled = true-s'config.useJwksUrl = "true" ' -s config.authorizationUrl = http:// localhost:8180/auth/realms/demorealm/protocol/openid-connect/auth -s config.tokenUrl = http:// localhost:8180/auth/realms/demorealm/protocol/openid-connect/token -s config.clientId = demo-oidc-provider -s config.clientSecret = secret

配置OpenID Connect身份提供程序

配置通用OpenID Connect提供程序的方式与配置Keycloak OpenID Connect提供程序的方式相同,只是您设置了供应商属性值为oidc

配置SAML 2身份提供程序

  1. 使用saml作为供应商

  2. 提供配置属性:单人签名服务,名称idpolicyformat,以及签名算法

例如:

$ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = saml -s providerId = saml -s enabled = true-s'config.useJwksUrl = "true" ' -s config.singleSignOnServiceUrl = http:// localhost:8180/auth/realms/saml-broker-realm/protocol/saml -s config.nameIDPolicyFormat = urn:oasis: 名称: tc:SAML:2.0:nameid-format:persistent -s config.signatureAlgorithm = RSA_SHA256

配置Facebook身份提供商

  1. 使用脸书作为供应商

  2. 提供配置属性:clientId客户秘密。 您可以在您的应用程序的Facebook开发者应用程序配置页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = facebook -s providerId = facebook -s enabled = true -s config.useJwksUrl = “true”-s config.clientId = FACEBOOK_CLIENT_ID -s config.clientSecret = FACEBOOK_CLIENT_SECRET

配置谷歌身份提供商

  1. 使用谷歌作为供应商

  2. 提供配置属性:clientId客户秘密。 您可以在Google Developers应用程序配置页面中为您的应用程序找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = google -s providerId = google -s enabled = true -s config.useJwksUrl = “true”-s config.clientId = GOOGLE_CLIENT_ID -s config.clientSecret = GOOGLE_CLIENT_SECRET

配置Twitter身份提供商

  1. 使用推特作为供应商

  2. 提供配置属性clientId客户秘密。 您可以在应用程序的Twitter应用程序管理应用程序配置页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = google -s providerId = google -s enabled = true -s config.useJwksUrl = “true”-s config.clientId = TWITTER_API_KEY -s config.clientSecret = TWITTER_API_SECRET

配置GitHub身份提供程序

  1. 使用github作为供应商

  2. 提供配置属性clientId客户秘密。 您可以在应用程序的GitHub Developer应用程序设置页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = github -s providerId = github -s enabled = true -s config.useJwksUrl = “true” ' -s config.clientId = GITHUB_CLIENT_ID -s config.clientSecret = GITHUB_CLIENT_SECRET

配置LinkedIn身份提供商

  1. 使用领英作为供应商

  2. 提供配置属性clientId客户秘密。 您可以在应用程序的LinkedIn开发控制台应用程序页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = linkedin -s providerId = linkedin -s enabled = true -s config.useJwksUrl = “true”-s config.clientId = linkedin _ client_secret

配置Microsoft实时身份提供程序

  1. 使用微软作为供应商

  2. 提供配置属性clientId客户秘密。 您可以在应用程序的 “Microsoft应用程序注册门户” 页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份提供者/实例-r demorealm -s别名 = microsoft -s providerId = microsoft -s enabled = true -s config.useJwksUrl = “true”-s config.clientId = MICROSOFT_APP_ID -s config.clientSecret = MICROSOFT_PASSWORD

配置堆栈溢出标识提供程序

  1. 使用stackoverflow命令为供应商

  2. 提供配置属性clientId,客户秘密,以及钥匙。 您可以在应用程序的堆栈应用程序OAuth页面中找到这些属性。

    例如:

    $ kcadm.sh创建身份-提供者/实例-r demorealm -s别名 = stackoverflow -s providerId = stackoverflow -s enabled = true -s config.useJwksUrl = “true” ' -s config.clientId = STACKAPPS_CLIENT_SECRET -s config.key = STACKAPPS_KEY

存储提供程序操作

配置Kerberos存储提供程序

  1. 使用创建命令反对组件端点。

  2. 将领域id指定为父母属性。

  3. 指定kerberos作为供应商属性,以及组织。密钥斗篷。存储。用户存储提供程序作为提供类型属性。

  4. 例如:

    $ kcadm.sh创建组件-r demorealm -s parentId = demorealmId -s id = demokerberos -s name = demokerberos -s providerId = kerberos -s provider type = org.keycloak.storage.UserStorageProvider -s 'config.priority =["0"]' -s 'config.debug =["false"]' -s config.allowPasswordAuthentication =["true"]' -s config.editMode =["未同步"]' -s config.updateProfileFirstLogin =["true"]' -s config.kerberosRealm =["KEYCLOAK.ORG"]' -s 'config.keyTab =["http.keytab"]' -s 'config.serverPrincipal =["HTTP/localhost@KEYCLOAK.ORG"]' -s 'config.cachePolicy =["DEFAULT"]'

配置LDAP用户存储提供程序

  1. 使用创建命令反对组件端点。

  2. 指定ldap作为供应商属性,以及组织。密钥斗篷。存储。用户存储提供程序作为提供类型属性。

  3. 提供领域ID作为父母属性。

  4. 使用以下示例创建集成Kerberos的LDAP提供程序。

    $ kcadm.sh创建组件-r demorealm -s name = kerberos-ldap-provider -s providerId = ldap -s providerType = org.keycloak.storage.UserStorageProvider -s parentId = 3d9c572b-8f33-483f-98a6-8bb421667867 -s 'config.priority =["1"]' -s 'config.Fullsyncperium =["-1“]' -s配置。更改同步周期 = [”-1“] ' -s配置。缓存策略 = [“默认”]' -s配置。evictionDay =[] -s配置。evictionHour =[] -s配置。evictionMinute =[] -s配置。maxlifety =[] -s '配置.batchSizeForSync =["1000"]' -s '配置.editMode =["可写"]' -s '配置.syncRegistrations =["false"]' -s '配置.供应商 =["其他"]' -s '配置.usernameLDAPAttribute =["uid"]'-'config.rdnLDAPAttribute =["uid"]'-'config.uuidLDAPAttribute =["entryUUID"]'-'config.userObjectClasses =["inetOrgPerson,organizationalPerson"]' -s' config.connectionUrl =["ldap:// 本地主机: 10389"]' -s' config.usersDn =["ou = 人员,dc = keycloak,dc = org"]'-'config.authType =["simple"]'-'config.bindDn =["uid = admin,ou = 系统"]'-s'config.bindCredential =["secret"]'-s'config.searchScope =["1"]'-s'config.useTruststoreSpi =["ldapsalonly"]'-s'config.connectionPooling =["true"]'-s'config.pagination =["true"]' -s配置.allowKerberosAuthentication =["true"]' -s配置.服务器主体 =["HTTP/localhost@KEYCLOAK.ORG"]' -s配置.keyTab =["http.keytab"]' -s配置.kerberosRealm =["KEYCLOAK.ORG"]' -s 'config.debug =["true"]' -s 'config.Usekerosforpasswordauthentication =["true"]'

删除用户存储提供程序实例

  1. 使用存储提供程序实例的id用于组成端点URI的属性,例如组件/标识

  2. 运行删除针对此端点的命令。

    例如:

    $ kcadm.sh删除组件/3d9c572b-8f33-483f-98a6-8bb421667867 -r demorealm

触发特定用户存储提供商的所有用户同步

  1. 使用存储提供程序的id用于组成端点URI的属性,例如用户存储/用户存储实例/同步

  2. 添加动作 = 触发同步查询参数并运行创建指挥。

    例如:

    $ kcadm.sh创建用户存储/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/同步?动作 = 触发同步

触发特定用户存储提供商的更改用户的同步

  1. 使用存储提供程序的id用于组成端点URI的属性,例如用户存储/用户存储实例/同步

  2. 添加动作 = 触发更改用户同步查询参数并运行创建指挥。

    例如:

    $ kcadm.sh创建用户存储/b7c63d02-b62a-4fc1-977c-947d6a09e1ea/同步?动作 = 触发更改用户同步

测试LDAP用户存储连接

  1. 运行获取命令testLDAPConnection端点。

  2. 提供查询参数绑定凭证,bindDn,连接url,以及使用信任商店,然后设置行动查询参数到测试连接

    例如:

    $ kcadm.sh创建testLDAPConnection -s动作 = testConnection -s bindCredential = secret -s bindDn = uid = admin,ou = 系统-s connectionUrl = ldap:// 本地主机: 10389 -s useTruststoreSpi = ldaponly

测试LDAP用户存储身份验证

  1. 运行获取命令testLDAPConnection端点。

  2. 提供查询参数绑定凭证,bindDn,连接url,以及使用信任商店,然后设置行动查询参数到测试身份验证

    例如:

    $ kcadm.sh创建testLDAPConnection -s操作 = testAuthentication -s bindCredential = secret -s bindDn = uid = admin,ou = 系统连接url = ldap:// 本地主机: 10389 -s useTruststoreSpi = ldaponly

添加映射器

添加硬编码角色LDAP映射器

  1. 运行创建命令组件端点。

  2. 设置提供类型属性为组织。Keycloak。存储。ldap。映射器。LDAPStorageMapper

  3. 设置父母属性为LDAP提供程序实例的ID。

  4. 设置供应商属性为硬编码-ldap-角色-映射器。 确保提供的值为角色配置参数。

    例如:

    $ kcadm.sh创建组件-r demorealm -s name = 硬编码-ldap-角色-映射器 = org.keycloak.storage.ldap.映射器.LDAPStorageMapp