如何通过Python SDK为Azure容器应用设置身份验证选项?

wrrgggsh  于 2023-10-22  发布在  Python
关注(0)|答案(1)|浏览(123)

我们正在使用Python ContainerAppsAPIClient库将容器应用部署到我们的Azure Estate,它工作得很好,但是我找不到任何关于如何在容器应用创建期间或之后设置身份验证的文档。在门户中,这非常容易做到,我发现有一些模型似乎支持它,但我不确定我需要将它们注入到其他什么模型中(如果有的话?).
我们以这种方式创建ContainerApp:

container_app = ContainerApp(
    location=container_location,
    tags=tags,
    environment_id=f"/subscriptions/{subscription_id}/resourceGroups/{shared_infra_resource_group_name}/providers/Microsoft.App/managedEnvironments/{container_app_environment}",
    configuration=Configuration(
        active_revisions_mode="Single",
        secrets=secrets_config,
        registries=[registry_credentials],
        ingress=ingress,
    ),
    template=template,
    identity=identity,
)

我发现可以使用的可能模型是:AzureActiveDirectoryLoginAuthConfig等但不知道该把它们放在哪里。相关的文档几乎不存在。
更具体地说,我们希望使用SDK将容器应用程序作为Azure Active Directory登录(在同一订阅上)。下面显示了我在门户中手动执行的操作,我想使用SDK重新创建门户:

我试过下面的代码:

client.container_apps_auth_configs.create_or_update(
        resource_group_name=resource_group_name,
        container_app_name=container_app_name,
        auth_config_name="current", # Code: AuthConfigInvalidName. Message: The name 'label-studio' is disallowed for authconfigs, please use the name 'current'.
        auth_config_envelope=AuthConfig(
            platform=AuthPlatform(
                enabled=True
            ),
            global_validation=GlobalValidation(
                unauthenticated_client_action="Return401"
            ), # Some more settings for Auth if you want 'em
            identity_providers=IdentityProviders(
                azure_active_directory=AzureActiveDirectory(
                    enabled=True,
                    registration=AzureActiveDirectoryRegistration(
                        open_id_issuer="https://sts.windows.net/REDACTED-UUID/v2.0" # The azure AD app registration uri
                    ),
                    login=AzureActiveDirectoryLogin(),

                )
            ),
            login=Login(),
            http_settings=HttpSettings()
        )
    )

除了这会导致门户网站在授权页面上显示以下内容:

All traffic is blocked, and requests will receive an HTTP 401 Unauthorized. This is because there is an authentication requirement, but no identity provider is configured. Click 'Remove authentication' to disable this feature and remove the access restriction. Or click 'Add identity provider' to configure a way for clients to authenticate themselves.

不知道为什么,因为看起来我确实提供了一个身份提供者

cnjp1d6j

cnjp1d6j1#

当我在我的环境中运行你的代码时,我在Portal中也得到了相同的错误,如下所示:

在我的例子中,当我在Python代码中包含现有应用程序clientIdsecret时,将Microsoft添加为身份提供程序是有效的。
为此,您可以像这样使用Redirect URI将一个Azure AD应用程序注册为<container-app-url>/.auth/login/aad/callback

现在,在上面的应用程序中创建一个客户端密码,并在容器应用程序Secret选项卡中添加该密码

当我运行下面修改后的代码,包括现有应用程序的client IDsecret时,我得到了如下的响应

from azure.identity import DefaultAzureCredential
from azure.mgmt.appcontainers import ContainerAppsAPIClient

def main():
    client = ContainerAppsAPIClient(
        credential=DefaultAzureCredential(),
        subscription_id="sub_id",
    )

    response = client.container_apps_auth_configs.create_or_update(
        resource_group_name="Sri",
        container_app_name="containerapp04",
        auth_config_name="current",
        auth_config_envelope={
            "properties": {
                "globalValidation": {"unauthenticatedClientAction": "Return401"},
                "identityProviders": {
                    "azureActiveDirectory": {"enabled": True, "isAutoProvisioned": True,"login": {},"registration": {"clientId": "appId","clientSecretSettingName": "secret","openIdIssuer": "https://sts.windows.net/tenantId/v2.0"}, "validation":{"allowedAudiences":["appId"]}}
                },
                "platform": {"enabled": True},
            }
        },
    )
    print(response)

if __name__ == "__main__":
    main()

回复:

为了确认这一点,我在Portal中进行了同样的检查,其中Microsoft在容器应用程序中成功配置为身份提供程序:

当我点击**Edit**选项时,我得到了下面的屏幕,其中包含身份提供程序属性:

参考:Create or Update Auth Config in Azure Container App using Python SDK · GitHub

相关问题