2.4. 使用 SAML 保护应用程序
您可以使用 Keycloak SAML 适配器功能 pack 提供的 Galleon 层使用安全断言标记语言(SAML)来保护 Web 应用程序。
有关 Keycloak SAML 适配器功能 pack 的详情,请参考 Keycloak SAML 适配器功能 pack 来使用 SAML 保护应用程序。
要使用 SAML 保护应用程序,请按照以下步骤执行:
2.4.1. 在 JBoss EAP 中使用 SAML 的应用程序安全性
Keycloak SAML 适配器 Galleon pack 是一个 Galleon 功能 pack,包含三个层: keycloak-saml
、keycloak-client-saml
、keycloak-client-saml-ejb
。使用功能软件包中的层在 JBoss EAP 中安装必要的模块和配置,以使用红帽构建的 Keycloak 作为使用安全断言标记语言(SAML)的单点登录。
下表描述了每个层的用例。
layer | 适用于 | 描述 |
---|---|---|
| OpenShift |
将此层用于 Source 到镜像(s2i),并自动注册 SAML 客户端。您必须将这个层与 |
| 裸机、OpenShift |
将此层用于裸机上的 Web 应用程序,以及 CLI 脚本或部署配置中提供的 |
| 裸机 | 将这个层用于您要传播身份到 Jakarta Enterprise Beans 的应用。 |
要启用 SAML 的使用,您可以配置 keycloak-saml
子系统或应用程序本身。
部署配置
要使用部署描述符使用 SAML 保护应用程序,请更新应用程序的部署配置,如下所示:
在应用部署描述符
web.xml
文件中,将auth-method
属性设置为SAML
。部署描述符更新示例
<login-config> <auth-method>SAML</auth-method> </login-config>
使用 SAML 配置信息,在
WEB-INF
目录中创建一个名为keycloak-saml.xml
的文件。您可以从 SAML 供应商获取此文件。keycloak-saml.xml
示例<keycloak-saml-adapter> <SP entityID="" sslPolicy="EXTERNAL" logoutPage="SPECIFY YOUR LOGOUT PAGE!"> <Keys> <Key signing="true"> <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem> <CertificatePem>...</CertificatePem> </Key> </Keys> <IDP entityID="idp" signatureAlgorithm="RSA_SHA256" signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#"> <SingleSignOnService signRequest="true" validateResponseSignature="true" validateAssertionSignature="false" requestBinding="POST" bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> <SingleLogoutService signRequest="true" signResponse="true" validateRequestSignature="true" validateResponseSignature="true" requestBinding="POST" responseBinding="POST" postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml" redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> </IDP> </SP> </keycloak-saml-adapter>
PrivateKeyPem
的值和CertificatePem
对每个客户端都是唯一的。
子系统配置
您可以通过配置 keycloak-saml
子系统来保护使用 SAML 的应用程序。您可以从红帽构建的 Keycloak 获取包含子系统配置命令的客户端配置文件。如需更多信息,请参阅生成客户端适配器配置。
2.4.2. 在红帽构建的 Keycloak 中创建 SAML 客户端
在红帽构建的 Keycloak 中创建一个安全断言标记语言(SAML)客户端,以用于 JBoss EAP 来保护应用程序。
以下流程概述了使用红帽构建的 Keycloak 部署至 JBoss EAP 的应用程序以进行测试所需的最小步骤。有关详细配置,请参阅红帽构建的 Keycloak 服务器管理指南中的创建 SAML 客户端。
先决条件
您已在红帽构建的 Keycloak 中创建域并定义了用户。
如需更多信息,请参阅在 JBoss EAP 中创建域和用户
流程
- 导航到红帽构建的 Keycloak Admin 控制台。
创建客户端。
- 单击 Clients,然后单击 Create client。
- 选择 SAML 作为客户端 类型。
输入您要保护为客户端 ID 的应用程序的 URL。例如:
http://localhost:8080/simple-webapp-example/secured/
。重要客户端 ID 必须与应用程序的 URL 完全匹配。如果客户端 ID 不匹配,您会收到类似如下的错误:
2023-05-17 19:54:31,586 WARN [org.keycloak.events] (executor-thread-0) type=LOGIN_ERROR, realmId=eba0f106-389f-4216-a676-05fcd0c0c72e, clientId=null, userId=null, ipAddress=127.0.0.1, error=client_not_found, reason=Cannot_match_source_hash
-
输入客户端名称。例如,
jbeap-saml
。 - 点击 Next。
输入以下信息:
-
根 URL :应用程序的 URL,例如
http://localhost:8080/simple-webapp-example/
。 主页 URL :应用程序的 URL,例如
http://localhost:8080/simple-webapp-example/
。重要如果您没有设置 Home URL,客户端配置中的
SP entityID
会保持空白,并导致错误。如果使用管理 CLI 命令,您会收到以下错误:
Can't reset to root in the middle of the path @72
您可以通过在对应的配置文件中定义
SP entityID
的值来解决错误。-
有效的 Redirect URI:用户登录后允许的 URI,例如
http://localhost:8080/simple-webapp-example/secured/*
。 Master SAML 处理 URL :应用程序的 URL 后跟
saml
。例如:http://localhost:8080/simple-webapp-example/saml
。重要如果您没有将
saml
附加到 URL,您会收到重定向错误。如需更多信息,请参阅创建 SAML 客户端。
-
根 URL :应用程序的 URL,例如
现在,您可以使用配置的客户端来保护 JBoss EAP 上部署的 Web 应用。如需更多信息,请参阅使用 SAML 保护 Web 应用程序。
后续步骤
2.4.3. 使用 SAML 保护 Web 应用程序
Keycloak SAML 适配器功能 pack 为非 OpenShift 部署提供两个层: keycloak-client-saml
和 keycloak-client-saml-ejb
。使用 keycloak-client-saml
层来保护 servlet based-web 应用,以及 keycloak-client-saml-ejb
来保护 Jakarta Enterprise Beans 应用。
您可以将应用程序配置为使用 SAML 的方法有两种:
通过配置
keycloak-saml
子系统。如果您不想在应用程序部署中添加配置,请使用此方法。
通过更新部署配置
如果您不想向服务器添加配置,并更喜欢在应用程序部署中保留配置,则使用此方法。
先决条件
红帽构建的 Keycloak 中已创建了 SAML 客户端。
如需更多信息,请参阅在 红帽构建的 Keycloak 中创建 SAML 客户端。
使用
jboss-eap-installation-manager
已安装了 JBoss EAP。如需更多信息,请参阅 Red Hat JBoss Enterprise Application Platform 安装方法指南中的使用
jboss-eap-installation-manager
安装 JBoss EAP 8.0。
流程
使用
jboss-eap-installation-manager
将所需的 Keycloak SAML 适配器层添加到服务器。以下是可用层的详情:-
feature pack:
org.keycloak:keycloak-saml-adapter-galleon-pack
. 层 :
-
keycloak-client-saml
:使用此层来保护 servlet。 keycloak-client-saml-ejb
:使用此层将身份从 servlet 传播到 Jakarta Enterprise Beans。有关在 JBoss EAP 中添加功能包和层的信息,请参阅 Red Hat JBoss Enterprise Application Platform 安装方法指南中的使用 jboss-eap-installation-manager 向现有 JBoss EAP 服务器 添加功能包和层。
-
-
feature pack:
配置应用程序的
web.xml
以保护应用程序资源。<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="false"> <security-constraint> <web-resource-collection> <web-resource-name>secured</web-resource-name> <url-pattern>/secured</url-pattern> </web-resource-collection> <auth-constraint> <role-name>Admin</role-name> 1 </auth-constraint> </security-constraint> <security-role> <role-name>*</role-name> </security-role> </web-app>
- 1
- 仅允许具有
Admin
角色的用户访问应用。要允许具有任何角色的用户访问应用程序,请使用通配符**
作为role-name
的值。
使用管理 CLI 或更新应用部署,使用 SAML 保护应用程序。
通过更新应用部署。
在应用程序的
web.xml
中添加登录配置,并将身份验证方法指定为 SAML。<web-app> ... <login-config> <auth-method>SAML</auth-method> 1 </login-config> ... </web-app>
- 1
- 使用 SAML 保护应用程序。
从红帽构建的 Keycloak 下载配置
keycloak-saml.xml
文件,并将它保存到应用程序的WEB-INF/
目录中。如需更多信息,请参阅生成客户端适配器配置。
keycloak-saml.xml
示例<keycloak-saml-adapter> <SP entityID="" sslPolicy="EXTERNAL" logoutPage="SPECIFY YOUR LOGOUT PAGE!"> <Keys> <Key signing="true"> <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem> <CertificatePem>...</CertificatePem> </Key> </Keys> <IDP entityID="idp" signatureAlgorithm="RSA_SHA256" signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#"> <SingleSignOnService signRequest="true" validateResponseSignature="true" validateAssertionSignature="false" requestBinding="POST" bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> <SingleLogoutService signRequest="true" signResponse="true" validateRequestSignature="true" validateResponseSignature="true" requestBinding="POST" responseBinding="POST" postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml" redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> </IDP> </SP> </keycloak-saml-adapter>
PrivateKeyPem
的值和CertificatePem
对每个客户端都是唯一的。
通过使用管理 CLI。
从红帽构建的 Keycloak 下载客户端配置文件
keycloak-saml-subsystem.cli
。如需更多信息,请参阅生成客户端适配器配置。
keycloak-saml-subsystem.cli
示例/subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/:add /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!" /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/Key=KEY1:add(signing=true, \ PrivateKeyPem="...", CertificatePem="...") /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:add( \ SingleSignOnService={ \ signRequest=true, \ validateResponseSignature=true, \ validateAssertionSignature=false, \ requestBinding=POST, \ bindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml}, \ SingleLogoutService={ \ signRequest=true, \ signResponse=true, \ validateRequestSignature=true, \ validateResponseSignature=true, \ requestBinding=POST, \ responseBinding=POST, \ postBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml, \ redirectBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml} \ ) /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureAlgorithm,value=RSA_SHA256) /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureCanonicalizationMethod,value=http://www.w3.org/2001/10/xml-exc-c14n#)
PrivateKeyPem
的值和CertificatePem
对每个客户端都是唯一的。使用应用程序
WAR 的名称(如
)更新客户端配置文件中出现的每个 WAR.war。simple-webapp-example.war
注意生成的 CLI 脚本在第二个语句的末尾缺少
)
:/subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP=""/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!"
您必须添加缺少的
)
使用管理 CLI 运行
keycloak-saml-subsystem.cli
脚本来配置 JBoss EAP。$ <EAP_HOME>/bin/jboss-cli.sh -c --file=<path_to_the_file>/keycloak-saml-subsystem.cli
部署应用。
$ mvn wildfly:deploy
验证
在浏览器中,导航到应用 URL。例如:
http://localhost:8080/simple-webapp-example/secured
。您将被重定向到红帽构建的 Keycloak 登录页面。
- 您可以使用您在红帽构建的 Keycloak 中定义的用户凭证登录。
您的应用程序现在使用 SAML 进行保护。