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')