NSX Advanced Load Balancer 可以充当 OAuth/OIDC 用例的客户端和资源服务器。
作为客户端和资源服务器,NSX Advanced Load Balancer 从最终用户获取授权代码,与 access_token
交换授权代码,验证 access_token
,并允许客户端根据基于声明的令牌验证和授权策略访问资源。
同一个虚拟服务将充当客户端和资源服务器。
请求流程
请求流程解释如下:
资源所有者尝试访问应用程序。
客户端 (NSX Advanced Load Balancer) 将资源所有者的用户代理定向到授权端点以启动流程。作为客户端,NSX Advanced Load Balancer 存储会话信息,包括其客户端标识符以及在授予(或拒绝)访问权限后授权服务器将用户代理发回到的重定向 URI/回调 URI。
资源所有者将请求发送到授权端点中的授权服务器。
授权服务器对资源所有者进行身份验证(使用用户代理),并确定资源所有者是授予还是拒绝客户端的访问请求权限。假设资源所有者授予访问权限,授权服务器将使用以前提供的重定向 URI/回调 URI(在请求中或客户端注册期间)将用户代理重定向回客户端。重定向 URI 包括授权代码。
资源所有者发送包含客户端重定向 URL 和授权代码的请求。
客户端加入上一步中收到的授权代码,以从授权服务器的令牌端点中请求
access_token
。在发出请求时,客户端使用client_id
和client_secret
在授权服务器中进行身份验证。授权服务器对客户端进行身份验证并验证授权代码。如果有效,则授权服务器使用
access_token
进行响应,并且可以选择提供刷新令牌。如果启用了 OIDC,授权服务器还会颁发id_token
。作为客户端,NSX Advanced Load Balancer 设置会话 Cookie,并向资源所有者发送包含资源 URL 的请求。
资源所有者发送包含会话 Cookie 的请求。在收到请求时,NSX Advanced Load Balancer 使用会话 Cookie 检索
access_token
。作为资源服务器,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(资源服务器)和授权服务器之间针对每个请求进行通信。根据验证结果,NSX Advanced Load Balancer 将提供或拒绝访问权限。
如果验证了
access_token
,则会将请求发送到后端服务器。服务器进行响应。
NSX Advanced Load Balancer 将响应发送到资源所有者。进一步的请求必须包含会话 ID,并且必须执行步骤 10-14。
NSX Advanced Load Balancer 虚拟服务作为客户端和资源服务器的职责
OAuth 客户端的职责是:
将未经身份验证的客户端重定向到提供程序的授权端点 - 为其生成状态和随机数参数。目前,不会生成随机数,因为它对于授权代码流程不是必需的。
与令牌交换代码以检索访问令牌和 ID 令牌(对于 OIDC)。
ID 令牌验证 (JWT) - OIDC 要求必须验证访问令牌哈希值。
存储会话信息,例如访问令牌、刷新令牌以及 ID 令牌中的相关详细信息。
创建会话 Cookie 并设置客户端响应。
在最终用户提供正确的会话 Cookie 时,将请求委派给资源服务器。
在过期后,刷新
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_token
和 id_token
进行响应。NSX Advanced Load Balancer(客户端)验证 id_token
,存储 id_token
和 access_token
,并更新会话 Cookie。然后,将验证 access_token
。如果验证成功,则授予资源的访问权限。
使用用户信息端点
在将 Cookie 颁发给客户端后,请求流程的其余部分与上面的请求流程图所述的过程相同。
用户信息端点可用于检索有关用户的身份信息。如果在 OIDC 参数中配置了 UserInfo 标记,则从用户信息端点中提取用户信息。如果未在 OIDC 参数中配置 UserInfo 标记,则从 id_token
中的某个声明提取用户信息。
使用 UI 进行配置
以下是与授权配置文件中使用的各种端点关联的唯一主机。例如,本配置指南将 OKTA 作为授权服务器。
端点类型 |
端点 |
---|---|
授权端点 |
|
令牌端点 |
|
侦测端点 |
|
jwks_uri |
|
颁发者 |
|
用户信息端点 |
此处,
unique_fqdn = dev-477407.oktapreview.com
创建一个池,服务器 = 唯一主机/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_id
和 client_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_id
和 server_secret
分别与 client_id
和 client_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=' | +------------------------------------+-----------------------------------------------------+