NSX Advanced Load Balancer 支持 SDK,以对其使用 IdP 凭据和 REST API 登录。在 NSX Advanced Load Balancer 控制器 上设置 SAML 身份验证配置文件,以由 Python SDK 使用以建立连接和访问资源。

注:
  • 尚不支持使用 IdP 凭据登录到 NSX Advanced Load Balancer CLI。

  • Okta 和 OneLogin 支持使用 Python SDK 进行基于 SAML 的身份验证。

  • 服务提供程序 (Service Provider, SP) 从不直接与身份提供程序进行交互。浏览器或 Python SDK 充当执行所有重定向的代理。

  • 服务提供程序需要知道要重定向到哪个身份提供程序,然后才能知道用户是谁。

  • 从身份提供程序返回 SAML 断言之前,服务提供程序不知道用户是谁。

  • SAML 身份验证流程是异步执行的。SP 不知道 IdP 是否会完成整个流程。因此,SP 不会保留生成的任何身份验证请求的任何状态。当 SP 从 IdP 收到响应时,该响应必须包含所有必需的信息。

有关更多信息,请参阅VMware NSX Advanced Load Balancer 配置指南》中的“单点登录的 SAML 身份验证”主题。

SAML Python SDK

在 SDK 中具有一个名为 saml_avi_api.py 的文件,它包含每个支持的 IdP 的 IdP 类定义。IdP 特定的类是从 ApiSession 基类继承的。IdP 特定的类定义调用自己的身份验证方法,以对给定用户进行身份验证。URL 重定向和 SAML 断言是在该类中处理的。在从给定 IdP 中成功进行身份验证后,该类返回控制器会话。

Okta 的示例:

在该代码片段集合中,OktaSAMLApiSession 类用于为 Okta IdP 验证用户身份,获取控制器会话以及创建 VS。通过 avi.sdk.saml_avi_api import OktaSAMLApiSession

创建 NSX Advanced Load Balancer API 会话

api = OktaSAMLApiSession("10.10.10.42", "okta_username", "okta_password")

api = ApiSession.get_session("controller_ip", username="foo", password="foo", idp=OktaSAMLApiSession)

使用 sample_pool 池创建 VS

pool_obj = api.get_object_by_name('pool', 'sample_pool')
pool_ref = api.get_obj_ref(pool_obj)
services_obj = [{'port': 80, 'enable_ssl': False}]
vs_obj = {'name': 'sample_vs', 'ip_address': {'addr': '11.11.11.42', 'type': 'V4'},
         'services': services_obj, 'pool_ref': pool_ref}
resp = api.post('virtualservice', data=vs_obj)

输出所有虚拟服务的列表

resp = api.get('virtualservice')
for vs in resp.json()['results']:
    print vs['name']

删除虚拟服务

resp = api.delete_by_name('virtualservice', 'sample_vs')

OneLogin 示例

在该代码片段集合中,OneloginSAMLApiSession 类用于为 OneLogin IdP 验证用户身份,获取控制器会话以及创建虚拟服务。

avi.sdk.saml_avi_api import OneloginSAMLApiSession

创建 NSX Advanced Load Balancer API 会话

api = OneloginSAMLApiSession("10.10.10.42", "onelogin_username", "onelogin_password")

api = ApiSession.get_session("controller_ip", username="foo", password="foo", idp=OneloginSAMLApiSession)

使用 sample_pool 池创建 VS

pool_obj = api.get_object_by_name('pool', 'sample_pool')
pool_ref = api.get_obj_ref(pool_obj)
services_obj = [{'port': 80, 'enable_ssl': False}]
vs_obj = {'name': 'sample_vs', 'ip_address': {'addr': '11.11.11.42', 'type': 'V4'},
         'services': services_obj, 'pool_ref': pool_ref}
resp = api.post('virtualservice', data=vs_obj)

输出所有虚拟服务的列表

resp = api.get('virtualservice')
for vs in resp.json()['results']:
    print vs['name']

删除虚拟服务

resp = api.delete_by_name('virtualservice', 'sample_vs')