NSX Advanced Load Balancer 可以充当 OAuth/OIDC 用例的客户端和资源服务器。

作为客户端和资源服务器,NSX Advanced Load Balancer 从最终用户获取授权代码,与 access_token 交换授权代码,验证 access_token,并允许客户端根据基于声明的令牌验证和授权策略访问资源。

同一个虚拟服务将充当客户端和资源服务器。

请求流程

请求流程解释如下:



  1. 资源所有者尝试访问应用程序。

  2. 客户端 (NSX Advanced Load Balancer) 将资源所有者的用户代理定向到授权端点以启动流程。作为客户端,NSX Advanced Load Balancer 存储会话信息,包括其客户端标识符以及在授予(或拒绝)访问权限后授权服务器将用户代理发回到的重定向 URI/回调 URI。

  3. 资源所有者将请求发送到授权端点中的授权服务器。

  4. 授权服务器对资源所有者进行身份验证(使用用户代理),并确定资源所有者是授予还是拒绝客户端的访问请求权限。假设资源所有者授予访问权限,授权服务器将使用以前提供的重定向 URI/回调 URI(在请求中或客户端注册期间)将用户代理重定向回客户端。重定向 URI 包括授权代码。

  5. 资源所有者发送包含客户端重定向 URL 和授权代码的请求。

  6. 客户端加入上一步中收到的授权代码,以从授权服务器的令牌端点中请求 access_token。在发出请求时,客户端使用 client_idclient_secret 在授权服务器中进行身份验证。

  7. 授权服务器对客户端进行身份验证并验证授权代码。如果有效,则授权服务器使用 access_token 进行响应,并且可以选择提供刷新令牌。如果启用了 OIDC,授权服务器还会颁发 id_token

  8. 作为客户端,NSX Advanced Load Balancer 设置会话 Cookie,并向资源所有者发送包含资源 URL 的请求。

  9. 资源所有者发送包含会话 Cookie 的请求。在收到请求时,NSX Advanced Load Balancer 使用会话 Cookie 检索 access_token

  10. 作为资源服务器,NSX Advanced Load Balancer 验证 access_token。如果访问令牌类型为 JWT,则 NSX Advanced Load Balancer 自行验证 access_token。如果访问令牌类型为“含糊”,则 NSX Advanced Load Balancer 将请求发送到授权服务器的侦测端点以验证含糊令牌。从 NSX Advanced Load Balancer 22.1.3 开始,支持缓存侦测数据,以避免 NSX Advanced Load Balancer(资源服务器)和授权服务器之间针对每个请求进行通信。

  11. 根据验证结果,NSX Advanced Load Balancer 将提供或拒绝访问权限。

  12. 如果验证了 access_token,则会将请求发送到后端服务器。

  13. 服务器进行响应。

  14. NSX Advanced Load Balancer 将响应发送到资源所有者。进一步的请求必须包含会话 ID,并且必须执行步骤 10-14。

NSX Advanced Load Balancer 虚拟服务作为客户端和资源服务器的职责

OAuth 客户端的职责是:

  1. 将未经身份验证的客户端重定向到提供程序的授权端点 - 为其生成状态和随机数参数。目前,不会生成随机数,因为它对于授权代码流程不是必需的。

  2. 与令牌交换代码以检索访问令牌和 ID 令牌(对于 OIDC)。

  3. ID 令牌验证 (JWT) - OIDC 要求必须验证访问令牌哈希值。

  4. 存储会话信息,例如访问令牌、刷新令牌以及 ID 令牌中的相关详细信息。

  5. 创建会话 Cookie 并设置客户端响应。

  6. 在最终用户提供正确的会话 Cookie 时,将请求委派给资源服务器。

  7. 在过期后,刷新 access_tokens

OAuth 资源服务器的职责是:

  • 使用以下内容验证 access_token

    • 使用从 jwks_uri 下载的 JWKS URI 进行 JWT 验证。

    • 对于含糊令牌,进行基于侦测的验证。

使用刷新令牌获取新的访问令牌(使用 NSX Advanced Load Balancer



在请求到达 NSX Advanced Load Balancer 虚拟服务时,将使用会话 Cookie 检索访问令牌。如果访问令牌已过期,则 NSX Advanced Load Balancer 将刷新令牌发送到授权服务器的令牌端点以获取新的 access_token。授权服务器使用 access_tokenid_token 进行响应。NSX Advanced Load Balancer(客户端)验证 id_token,存储 id_tokenaccess_token,并更新会话 Cookie。然后,将验证 access_token。如果验证成功,则授予资源的访问权限。

使用用户信息端点



注:

在将 Cookie 颁发给客户端后,请求流程的其余部分与上面的请求流程图所述的过程相同。

用户信息端点可用于检索有关用户的身份信息。如果在 OIDC 参数中配置了 UserInfo 标记,则从用户信息端点中提取用户信息。如果未在 OIDC 参数中配置 UserInfo 标记,则从 id_token 中的某个声明提取用户信息。

使用 UI 进行配置

以下是与授权配置文件中使用的各种端点关联的唯一主机。例如,本配置指南将 OKTA 作为授权服务器。

此处,

  1. unique_fqdn = dev-477407.oktapreview.com

  2. 创建一个池,服务器 = 唯一主机/FQDN 或 IP 地址 + 端口,如步骤 2 中所示。

注:
  • 建议将 OAuth 与 HTTPS 结合使用。因此,池必须在端口 443 上启用了 SSL。

  • 某些授权服务器可能将不同的 FQDN/主机用于不同的端点。在这种情况下,必须在池配置中将所有主机添加为服务器。

配置池

以下是配置池的步骤:

  • 导航到应用程序 >

  • 单击创建池或编辑现有的池。

  • 在字段中指定详细信息。有关完整的配置步骤,请参见创建池

  • 选择 OAuth 以作为类型

  • 服务器选项卡下面,在选择服务器依据字段中输入详细信息,然后单击添加



  • 单击保存

配置身份验证配置文件

以下是配置身份验证配置文件的步骤:

  • 导航到应用程序 > 虚拟服务

  • 单击创建或编辑现有的虚拟服务。

  • 导航到策略 > 访问

  • 访问策略下面,选择 OAuth

  • 身份验证配置文件下拉菜单中选择创建配置文件



  • 创建身份验证配置文件屏幕中,输入所需的名称并将 OAuth/OIDC 作为类型

  • 执行以下步骤之一以配置端点:

    • 要自动配置和检索端点,请执行以下操作:

      • 导入端点中输入 URL。



      • 单击导入

    • 要手动配置端点,请输入所需的详细信息。

  • 中选择池。

  • 单击Save

配置 SSO 策略

以下是配置 SSO 策略的步骤:

  • 导航到应用程序 > 虚拟服务

  • 单击创建或编辑现有的虚拟服务。

  • 导航到策略 > 访问

  • 访问策略下面,选择 OAuth

  • SSO 策略下拉菜单中选择创建 SSO 策略或编辑现有的 SSO 策略。



  • 编辑 SSO 策略屏幕中,输入所需的详细信息。



  • 单击保存

在虚拟服务上配置 OAuth 设置

注:

假设已配置虚拟服务。在虚拟服务中启用 OAuth/OIDC 特定的配置。

  • 导航到应用程序 > 虚拟服务

  • 单击创建或编辑现有的虚拟服务。

  • 导航到策略 > 访问

  • 访问策略下面,选择 OAuth

  • SSO 策略下拉菜单中选择创建 SSO 策略或编辑现有的 SSO 策略。

  • 输入所需的详细信息。



    注:

    在使用 UI 配置 OAuth 虚拟服务时,至少需要配置一个范围。如果部署不需要使用范围,则在 UI 中配置占位符范围,并稍后使用 CLI 移除该范围。

  • 单击保存

使用 CLI 配置池

使用 CLI 配置池,如下所示:

[admin: ctrl]: > configure pool okta-pool
[admin: ctrl]: pool> default_server_port 443
[admin: ctrl]: pool> ssl_profile_ref System-Standard
[admin: ctrl]: pool> servers
[admin: ctrl]: pool:servers> hostname dev-477407.oktapreview.com
[admin:ctrl]: pool:servers> resolve_server_by_dns
[admin:ctrl]: pool:servers> resolve_server_by_dns 
[admin:ctrl]: pool:servers> save
[admin:ctrl]: pool> save
+-------------------------------------------+------------------------------------------------+
| Field                                     | Value                                          |
+-------------------------------------------+------------------------------------------------+
| uuid                                      | pool-ae3e31cb-eaf9-4014-b3f0-2a7391b9f767      |
| name                                      | okta-pool                                      |
| default_server_port                       | 443                                            |
| graceful_disable_timeout                  | 1 min                                          |
| connection_ramp_duration                  | 10 min                                         |
| max_concurrent_connections_per_server     | 0                                              |
| servers[1]                                |                                                |
|   ip                                      | 34.236.241.37                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| servers[2]                                |                                                |
|   ip                                      | 34.236.241.36                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| servers[3]                                |                                                |
|   ip                                      | 34.236.241.38                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| lb_algorithm                              | LB_ALGORITHM_LEAST_CONNECTIONS                 |
| lb_algorithm_hash                         | LB_ALGORITHM_CONSISTENT_HASH_SOURCE_IP_ADDRESS |
| ssl_profile_ref                           | System-Standard                                |
| inline_health_monitor                     | True                                           |
| use_service_port                          | False                                          |
| capacity_estimation                       | False                                          |
| capacity_estimation_ttfb_thresh           | 0 milliseconds                                 |
| vrf_ref                                   | global                                         |
| fewest_tasks_feedback_delay               | 10 sec                                         |
| enabled                                   | True                                           |
| request_queue_enabled                     | False                                          |
| request_queue_depth                       | 128                                            |
| host_check_enabled                        | False                                          |
| sni_enabled                               | True                                           |
| rewrite_host_header_to_sni                | False                                          |
| rewrite_host_header_to_server_name        | False                                          |
| lb_algorithm_core_nonaffinity             | 2                                              |
| lookup_server_by_name                     | False                                          |
| analytics_profile_ref                     | System-Analytics-Profile                       |
| tenant_ref                                | admin                                          |
| cloud_ref                                 | Default-Cloud                                  |
| server_timeout                            | 0 milliseconds                                 |
| delete_server_on_dns_refresh              | True                                           |
| enable_http2                              | False                                          |
| ignore_server_port                        | False                                          |
| routing_pool                              | False                                          |
| append_port                               | NON_DEFAULT_80_443                             |
| http2_properties                          |                                                |
|   max_http2_control_frames_per_connection | 0                                              |
|   max_http2_header_field_size             | 4096 bytes                                     |
| server_disable_type                       | DISALLOW_NEW_CONNECTION                        |
| use_service_ssl_mode                      | False                                          |
+-------------------------------------------+------------------------------------------------+

使用 CLI 配置身份验证配置文件

使用 CLI 配置身份验证配置文件,如下所示:

[admin:ctrl]: > configure authprofile Okta-OAuth
[admin:ctrl]: authprofile> type auth_profile_oauth
[admin:ctrl]: authprofile> oauth_profile
[admin:ctrl]: authprofile:oauth_profile>
authorization_endpoint   URL of authorization server.
cancel                   Exit the current submode without saving
do                       Execute a show command
introspection_endpoint   URL of token introspection server.
issuer                   Uniquely identifiable name of the Token Issuer.
jwks_timeout             Lifetime of the cached JWKS keys.
jwks_uri                 JWKS URL of the endpoint that hosts the public keys that can be used to verify any JWT issued by...
no                       Remove field
oauth_resp_buffer_sz     Buffering size for the responses from the OAUTH enpoints.
pool_ref                 Pool object to interface with Authorization Server endpoints.
save                     Save and exit the current submode
show_schema              show object schema
token_endpoint           URL of token exchange server.
userinfo_endpoint        URL of the Userinfo Endpoint.
watch                    Watch a given show command
where                    Display the in-progress object
[admin:ctrl]: authprofile:oauth_profile> authorization_endpoint https://dev-477407.oktapreview.com/oauth2/v1/authorize
[admin:ctrl]: authprofile:oauth_profile> token_endpoint https://dev-477407.oktapreview.com/oauth2/v1/token
[admin:ctrl]: authprofile:oauth_profile> introspection_endpoint https://dev-477407.oktapreview.com/oauth2/v1/introspect
[admin:ctrl]: authprofile:oauth_profile> jwks_uri https://dev-477407.oktapreview.com/oauth2/v1/keys
[admin:ctrl]: authprofile:oauth_profile> issuer https://dev-477407.oktapreview.com    
[admin:ctrl]: authprofile:oauth_profile> userinfo_endpoint https://dev-477407.oktapreview.com/oauth2/v1/userinfo
[admin:ctrl]: authprofile:oauth_profile> pool_ref okta-pool
[admin:ctrl]: authprofile:oauth_profile> save
[admin:ctrl]: authprofile> save

+--------------------------+---------------------------------------------------------+
| Field                    | Value                                                   |
+--------------------------+---------------------------------------------------------+
| uuid                     | authprofile-4b335ccf-8385-48bd-a438-51e72726cc14        |
| name                     | okta                                                    |
| type                     | AUTH_PROFILE_OAUTH                                      |
| oauth_profile            |                                                         |
|   authorization_endpoint | https://dev-477407.oktapreview.com/oauth2/v1/authorize  |
|   token_endpoint         | https://dev-477407.oktapreview.com/oauth2/v1/token      |
|   introspection_endpoint | https://dev-477407.oktapreview.com/oauth2/v1/introspect |
|   jwks_uri               | https://dev-477407.oktapreview.com/oauth2/v1/keys       |
|   issuer                 | https://dev-477407.oktapreview.com                      |
|   pool_ref               | OKTA                                                    |
|   oauth_resp_buffer_sz   | 102400                                                  |
|   userinfo_endpoint      | https://dev-477407.oktapreview.com/oauth2/v1/userinfo   |
| tenant_ref               | admin                                                   |
+--------------------------+---------------------------------------------------------+

使用 CLI 配置 SSO 策略

使用 CLI 配置 SSO 策略,如下所示:

[admin:ctrl]: > configure ssopolicy oauth
[admin:ctrl]: ssopolicy> type sso_type_oauth
[admin:ctrl]: ssopolicy> save
+------------+------------------------------------------------+
| Field      | Value                                          |
+------------+------------------------------------------------+
| uuid       | ssopolicy-8a4cb441-c819-4153-a247-d78f3a2585b3 |
| name       | oauth                                          |
| type       | SSO_TYPE_OAUTH                                 |
| tenant_ref | admin                                          |
+------------+------------------------------------------------+

在虚拟服务上配置 OAuth 设置

  • 配置 sso_policy_ref,如下所示:

    [admin:ctrl]: > configure virtualservice OAuth-VS
    [admin:ctrl]: > virtualservice> sso_policy_ref oauth
  • 配置 oauth_vs_config,如下所示:

    [admin:ctrl]: virtualservice> oauth_vs_config
     [admin:ctrl]: virtualservice:oauth_vs_config> redirect_uri   https://100.64.94.61/oauth/callback
     [admin:ctrl]: virtualservice:oauth_vs_config> oauth_settings
     New object being created
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> auth_profile_ref okta
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> app_settings
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> oidc_config
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings:oidc_config> oidc_enable
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings:oidc_config> save
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> client_id xxxxxxxxxxxxxxx
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> client_secret xxxxxxxxxxxxxxx
注:

添加授权服务器提供的实际 client_idclient_secret

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server>
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> access_type access_token_type_opaque
注:

对于该示例,将一个含糊令牌用于 OKTA。如果需要,可以选择 JWT 令牌而不是含糊令牌。

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> opaque_token_params
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params>
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> server_id xxxxxxxxxxxxxxx
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> server_secret xxxxxxxxxxxxxxx
注:

在大多数情况下,server_idserver_secret 分别与 client_idclient_secret 相同。

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> save
 [admin:ctrl]: virtualservice:oauth_vs_config> save
 [admin:ctrl]: virtualservice> save

OAuth 配置如下所示:

| sso_policy_ref                     | oauth                                               |
 | oauth_vs_config                    |                                                     |
 |   redirect_uri                     | https://okta-test.auth.com/oauth/callback           |
 |   cookie_name                      | OAUTH_IUPKWGLH                                      |
 |   cookie_timeout                   | 1 min                                               |
 |   oauth_settings[1]                |                                                     |
 |     auth_profile_ref               | okta-oauth                                          |
 |     app_settings                   |                                                     |
 |       oidc_config                  |                                                     |
 |         oidc_enable                | True                                                |
 |         profile                    | True                                                |
 |         userinfo                   | True                                                |
 |       client_id                    | xxxxxxxxxxxxxxx                                     |
 |       client_secret                | <sensitive>                                   |
 |     resource_server                |                                                     |
 |       access_type                  | ACCESS_TOKEN_TYPE_OPAQUE                            |
 |       opaque_token_params          |                                                     |
 |         server_id                  | xxxxxxxxxxxxxxx                                     |
 |         server_secret              | <sensitive>                                   |
 |   key[1]                           |                                                     |
 |     name                           | dc7dde0a-8a64-45b4-8ded-f65adb03c2a4                |
 |     aes_key                        | b'sdZFYlVECVu9aW7XK4IhVaC8TfakvNSvp6m861tyVNc='     |
 +------------------------------------+-----------------------------------------------------+