搜索

2.3. 使用 OIDC 保护应用程序

download PDF

使用 JBoss EAP 原生 OpenID Connect (OIDC)客户端来利用外部 OpenID 供应商保护应用程序。OIDC 是一个身份层,它允许客户端(如 JBoss EAP)根据 OpenID 供应商执行的身份验证来验证用户的身份。例如,您可以使用红帽构建的 Keycloak 作为 OpenID 供应商来保护 JBoss EAP 应用程序。

要使用 OIDC 保护应用程序,请按照以下步骤执行:

2.3.1. 在 JBoss EAP 中使用 OpenID Connect 的应用安全性

当您使用 OpenID 供应商保护应用程序时,您不需要在本地配置任何安全域资源。elytron-oidc-client 子系统在 JBoss EAP 中提供原生 OpenID Connect (OIDC)客户端,以与 OpenID 提供程序(OP)连接。JBoss EAP 根据您的 OpenID 提供程序配置自动为您的应用程序创建虚拟安全域。elytron-oidc-client 子系统充当 Relying party (RP)。

注意

JBoss EAP 原生 OIDC 客户端不支持 RP-Initiated logout。

重要

建议您在 Red Hat build of Keycloak 中使用 OIDC 客户端。如果可将其他 OpenID 供应商配置为使用 JSON Web 令牌(JWT)的访问令牌,并可配置为使用 RS256、RS384、RS512、ES256、ES384 或 ES512 签名算法。

要启用 OIDC 的使用,您可以配置 elytron-oidc-client 子系统或应用程序本身。JBoss EAP 激活 OIDC 身份验证,如下所示:

  • 当您将应用程序部署到 JBoss EAP 时,elytron-oidc-client 子系统会扫描部署,以检测是否需要 OIDC 身份验证机制。
  • 如果子系统在 elytron-oidc-client 子系统或应用程序部署描述符中检测到部署的 OIDC 配置,JBoss EAP 为应用启用 OIDC 身份验证机制。
  • 如果子系统在两个位置检测到 OIDC 配置,则 elytron-oidc-client 子系统 secure-deployment 属性中的配置优先于应用程序部署描述符中的配置。
部署配置

要使用部署描述符使用 OIDC 保护应用程序,请更新应用程序的部署配置,如下所示:

  • 在应用程序部署描述符 web.xml 文件中将 auth-method 属性设置为 OIDC

部署描述符更新示例

<login-config>
    <auth-method>OIDC</auth-method>
</login-config>

  • WEB-INF 目录中创建一个名为 oidc.json 的文件,其中包含 OIDC 配置信息。

    oidc.json 内容示例

    {
      "client-id" : "customer-portal", 1
      "provider-url" : "http://localhost:8180/realms/demo", 2
      "ssl-required" : "external", 3
       "credentials" : {
          "secret" : "234234-234234-234234" 4
       }
    }

    1
    使用 OpenID 供应商标识 OIDC 客户端的名称。
    2
    OpenID 提供程序 URL。
    3
    对外部请求需要 HTTPS。
    4
    与 OpenID 供应商注册的客户端 secret。
子系统配置

您可以通过使用以下方法配置 elytron-oidc-client 子系统来保护使用 OIDC 的应用程序:

  • 如果您为每个应用程序使用相同的 OpenID 供应商,请为多个部署创建一个单一配置。
  • 如果您将不同的 OpenID 供应商用于不同的应用程序,请为每个部署创建不同的配置。

单个部署的 XML 配置示例:

<subsystem xmlns="urn:wildfly:elytron-oidc-client:1.0">
    <secure-deployment name="DEPLOYMENT_RUNTIME_NAME.war"> 1
        <client-id>customer-portal</client-id> 2
        <provider-url>http://localhost:8180/realms/demo</provider-url> 3
        <ssl-required>external</ssl-required> 4
        <credential name="secret" secret="0aa31d98-e0aa-404c-b6e0-e771dba1e798" /> 5
    </secure-deployment
</subsystem>
1
部署运行时名称。
2
使用 OpenID 供应商标识 OIDC 客户端的名称。
3
OpenID 提供程序 URL。
4
对外部请求需要 HTTPS。
5
与 OpenID 供应商注册的客户端 secret。

要使用同一 OpenID 供应商保护多个应用程序,请单独配置 提供程序,如下例所示:

<subsystem xmlns="urn:wildfly:elytron-oidc-client:1.0">
    <provider name="${OpenID_provider_name}">
        <provider-url>http://localhost:8080/realms/demo</provider-url>
        <ssl-required>external</ssl-required>
    </provider>
    <secure-deployment name="customer-portal.war"> 1
        <provider>${OpenID_provider_name}</provider>
        <client-id>customer-portal</client-id>
        <credential name="secret" secret="0aa31d98-e0aa-404c-b6e0-e771dba1e798" />
    </secure-deployment>
    <secure-deployment name="product-portal.war"> 2
        <provider>${OpenID_provider_name}</provider>
        <client-id>product-portal</client-id>
        <credential name="secret" secret="0aa31d98-e0aa-404c-b6e0-e771dba1e798" />
    </secure-deployment>
</subsystem>
1
一个部署: customer-portal.war
2
另一个部署: product-portal.war

2.3.2. 在红帽构建的 Keycloak 中创建 OIDC 客户端

在红帽构建的 Keycloak 中创建 OpenID Connect (OIDC)客户端,以用于 JBoss EAP 来保护应用程序。

以下流程概述了使用红帽构建的 Keycloak 部署至 JBoss EAP 的应用程序以进行测试所需的最小步骤。有关详细配置,请参阅红帽构建的 Keycloak 服务器 管理指南中的管理 OpenID Connect 客户端

先决条件

流程

  1. 导航到红帽构建的 Keycloak Admin 控制台。
  2. 创建客户端。

    1. 单击 Clients,然后单击 Create client
    2. 确保将 Client type 设置为 OpenID Connect
    3. 输入客户端 ID。例如,jbeap-oidc
    4. 点击 Next
    5. Capability Config 选项卡中,确保将 Authentication Flow 设置为 Standard 流,并且 Direct access 授予
    6. 点击 Next
    7. Login settings 选项卡中,输入 Valid redirect URIs 的值。输入页面在成功身份验证后应重定向的 URL,例如 http://localhost:8080/simple-webapp-example/secured/*
    8. 点击 Save
  3. 查看适配器配置。

    1. Action,然后点 Download adapter config
    2. 选择 Keycloak OIDC JSON 作为 Format Option 来查看连接参数。

      {
        "realm": "example_realm",
        "auth-server-url": "http://localhost:8180/",
        "ssl-required": "external",
        "resource": "jbeap-oidc",
        "public-client": true,
        "confidential-port": 0
      }

      在将 JBoss EAP 应用程序配置为使用红帽构建的 Keycloak 作为身份提供程序时,您可以使用参数,如下所示:

      "provider-url" : "http://localhost:8180/realms/example_realm",
      "ssl-required": "external",
      "client-id": "jbeap-oidc",
      "public-client": true,
      "confidential-port": 0

2.3.3. 使用 OpenID Connect 保护 Web 应用程序

您可以通过更新其部署配置或配置 elytron-oidc-client 子系统来保护应用

如果您使用流程中创建的应用程序,创建 Web 应用程序,Principal 的值来自 OpenID 供应商中的 ID 令牌。默认情况下,Principal 是令牌中的 "sub" 声明的值。您还可以使用 "email", "preferred_username", "name", "given_name", "family_name", 或 "nickname" 声明作为主体。指定在以下位置之一将 ID 令牌中的声明值用作主体:

  • elytron-oidc-client 子系统属性 principal-attribute
  • oidc.json 文件

您可以将应用程序配置为使用 OIDC 的方法有两种:

  • 通过配置 elytron-oidc-client 子系统。

    如果您不想在应用程序部署中添加配置,请使用此方法。

  • 通过更新部署配置

    如果您不想向服务器添加配置,并更喜欢在应用程序部署中保留配置,则使用此方法。

先决条件

  • 您已在 JBoss EAP 上部署了应用程序。

流程

  1. 配置应用程序的 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 的值。
  2. 要使用 OpenID Connect 保护应用,可以更新部署配置或配置 elytron-oidc-client 子系统。

    注意

    如果您在部署配置和 elytron-oidc-client 子系统中配置 OpenID Connect,则 elytron-oidc-client 子系统 secure-deployment 属性中的配置优先于应用部署描述符中的配置。

    • 更新部署配置。

      1. 在应用程序的 web.xml 中添加登录配置,并将验证方法指定为 OIDC。

        <web-app>
        ...
            <login-config>
                <auth-method>OIDC</auth-method>     1
            </login-config>
        ...
        </web-app>
        1
        使用 OIDC 保护应用程序的安全。
      2. WEB-INF 目录中创建 oidc.json 文件,如下所示:

        {
          "provider-url" : "http://localhost:8180/realms/example_realm",
          "ssl-required": "external",
          "client-id": "jbeap-oidc",
          "public-client": true,
          "confidential-port": 0
        }
    • 配置 elytron-oidc-client 子系统:

      • 要保护应用程序,请使用以下管理 CLI 命令:

        /subsystem=elytron-oidc-client/secure-deployment=simple-oidc-example.war/:add(client-id=jbeap-oidc,provider-url=http://localhost:8180/realms/example_realm,public-client=true,ssl-required=external)
  3. 在应用程序根目录中,使用以下命令编译应用程序:

    $ mvn package
  4. 部署应用。

    $ mvn wildfly:deploy

验证

  1. 在浏览器中,导航到 http://localhost:8080/simple-webapp-example/secured

    您将被重定向到红帽构建的 Keycloak 登录页面。

  2. 您可以使用您在红帽构建的 Keycloak 中定义的用户凭证登录。

您的应用程序现在使用 OIDC 进行保护。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.