【问题标题】:Calling Azure function from VM using managed identity and REST API使用托管标识和 REST API 从 VM 调用 Azure 函数
【发布时间】:2020-10-27 13:51:17
【问题描述】:

我们能否从 Azure VM 对 azure 函数进行 REST API 调用?我们无法存储 API 的用户名和密码。我们可以使用任何其他身份验证来调用 azure 函数吗?例如:托管身份、证书?

【问题讨论】:

    标签: azure azure-functions azure-vm


    【解决方案1】:

    是的,您可以使用托管身份 (MSI) 获取令牌,然后使用该令牌对您的 Azure 函数进行 REST API 调用,请按照以下步骤操作。

    1.在门户中导航到 VM -> Identity -> 启用系统分配的标识。

    2.导航到门户中的函数应用 -> Authentication / Authorization -> 使用 Azure AD auth 配置你的函数应用,按照这个 doc,不要忘记设置 Log in with Azure Active Directory ,配置后,它为您的函数应用创建一个 AD 应用需要一段时间,它最终会如下所示。

    3.然后在函数应用中,创建一个HTTP触发器进行测试,注意:其Authorization level需要设置为Anonymous

    4.在我的示例中,我RDP进入VM,然后使用powershell获取令牌,然后使用令牌调用函数,根据您的情况,您也可以使用其他语言取决于您的要求。我的函数名称是joyfun111,在脚本中用你的替换它,它对我有用。

    $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://joyfun111.azurewebsites.net' -Method GET -Headers @{Metadata="true"} 
    $content = $response.Content | ConvertFrom-Json 
    $Token = $content.access_token 
    Invoke-RestMethod -Uri 'https://joyfun111.azurewebsites.net/api/HttpTrigger1?name=world' -Method POST -Headers @{Authorization="Bearer $Token"} 
    

    更新:

    如果是这样,您只需使用功能键和功能网址,将Authorization level更改为Function,禁用Authentication / Authorization中的Azure AD身份验证,然后使用如下命令。

    Invoke-RestMethod -Uri 'https://joyfun111.azurewebsites.net/api/HttpTrigger1?code=10X/IKJIeElrCRIxxxxH6A==&name=world' -Method POST -UseBasicParsing
    

    可以在功能页面中获取功能的url。

    【讨论】:

    • 问题是在虚拟机中我们有一个应用程序正在运行,它只能调用一个 API。无法从此应用程序中获取令牌的逻辑。这种情况有解决方案吗?
    • 是的,我们可以使用函数 url,但该密钥将在 VM 中公开可用,任何人都可以访问,对吗?有没有可能防止这种情况发生?
    • @BlueClouds 如果是这样,我认为不可能,反正你需要一些身份验证凭据,不可能一次完成。即使您使用功能键并且不想暴露它,您也需要再次调用才能获得它。
    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 2018-11-22
    • 2021-09-02
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多