C# 在Azure函数中使用Azure Fluent SDK时,如何使用托管服务标识创建Azure对象?

C# 在Azure函数中使用Azure Fluent SDK时,如何使用托管服务标识创建Azure对象?,c#,azure,azure-functions,C#,Azure,Azure Functions,我正在编写一个Azure函数,它将更新Azure DNS区域。该函数附加了托管服务标识(MSI) 我能够使用非fluent SDK读取DNS区域中的当前记录。但是,当我尝试使用fluent库执行相同的操作时,会出现以下错误: [07/11/2018 14:36:37]执行“功能1”(失败,Id=8d34472e-956a-4ff3-a1b1-16ea6186934a) [07/11/2018 14:36:37]System.Private.CoreLib:执行函数时发生异常:Function1.

我正在编写一个Azure函数,它将更新Azure DNS区域。该函数附加了托管服务标识(MSI)

我能够使用非fluent SDK读取DNS区域中的当前记录。但是,当我尝试使用fluent库执行相同的操作时,会出现以下错误:

[07/11/2018 14:36:37]执行“功能1”(失败,Id=8d34472e-956a-4ff3-a1b1-16ea6186934a)

[07/11/2018 14:36:37]System.Private.CoreLib:执行函数时发生异常:Function1.Microsoft.Azure.Management.ResourceManager.Fluent:值不能为null

[07/11/2018 14:36:37]参数名称:MSI_端点

为了便于测试这两个库之间的差异,我编写了一个测试函数

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Rest;
using Microsoft.Azure.Management.Dns;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;

namespace UpdateDNS
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "{subscription}/{rg_name}/{zone_name}/{lib}")] HttpRequest req,
            string subscription,
            string rg_name,
            string zone_name,
            string lib,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            int count = 0;
            dynamic records;

            // determine the lib to use to get the dns data
            switch (lib)
            {
                case "fluent":

                    AzureCredentialsFactory factory = new AzureCredentialsFactory();
                    MSILoginInformation msi = new MSILoginInformation(MSIResourceType.AppService);
                    AzureCredentials msiCred = factory.FromMSI(msi, AzureEnvironment.AzureGlobalCloud);
                    var azureAuth = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.BodyAndHeaders).Authenticate(msiCred);

                    // set the subscription to work with
                    var azure = azureAuth.WithSubscription(subscription);

                    var dnszone = azure.DnsZones.GetByResourceGroup(rg_name, zone_name);

                    records = dnszone.ListRecordSets();

                    break;

                default:

                    // get the token from the managed service identity
                    AzureServiceTokenProvider token_provider = new AzureServiceTokenProvider();
                    string token = await token_provider.GetAccessTokenAsync("https://management.azure.com");

                    TokenCredentials token_creds = new TokenCredentials(token);

                    // create the dns client
                    DnsManagementClient client = new DnsManagementClient(token_creds);
                    client.SubscriptionId = subscription;

                    records = client.RecordSets.ListAllByDnsZone(rg_name, zone_name);

                    break;
            }

            foreach (var record in records)
            {
                Console.WriteLine(record.Name);
                count++;
            }

            return new OkObjectResult($"Records: {count}");

        }
    }
}
但是,如果我尝试运行相同的查询,但使用fluent libs,则会出现如上所示的错误:

我是否缺少需要传入的参数?我不确定“MSI_端点”将设置在何处以及应设置为什么。我的感觉是这应该为我做

正在使用的库的版本有:

Microsoft.Azure.Management.DNS 3.0.1

Microsoft.Azure.Management.Fluent 1.17.0

Microsoft.Azure.Services.AppAuthentication 1.0.3

我正在Visual Studio中本地运行此程序,该程序已登录到具有Azure相应访问权限的帐户

我正在Visual Studio中本地运行此程序,该程序已登录到具有Azure相应访问权限的帐户

您的本地计算机上没有管理服务标识,因此无法很好地使用本地计算机中的第一个方法。 正如junnas所说,您可以使用
Azure服务认证扩展
AzureServiceTokenProvider
来检索您的帐户以访问Azure

有关更多详细信息,请参阅此

因此,首先,您需要做的是转到您的appname.scm.azurewebsites.net并选择
Environment
,检查其中是否有
MSI_ENDPOINT
变量。这意味着您已成功设置MSI


其次,将函数发布到Azure,它将正常工作。

MSI_ENDPOINT是由Azure中的托管标识设置的环境变量。我想它是在期待这种情况的存在。您可以使用AzureServiceTokenProvider来获取访问令牌,例如,它将退回到使用Visual Studio的Azure服务身份验证。@juunas MSI已连接到网站。我刚刚发现它是一个环境变量,但我只能在使用Kudu控制台时才能看到它。您检查过Kudu吗?您可以转到appname.scm.azurewebsites.net,在那里查看所有可用的环境变量。如果它不在那里,但您已打开托管服务标识,则说明有问题。很抱歉,您答复时正在更新我的评论。是的,我可以在Kudu中看到它。为了让MSI在本地运行,您必须使用VS准备一些东西。检查此处的说明:在我的Visual Studio中,我确实安装了
Azure服务验证扩展插件
,并将其设置为正确的标识。我现在正在尝试部署到Azure,看看这是否会产生影响。很抱歉延迟。我现在已经开始工作了,虽然不是我想要的方式。我曾试图使用CSX来实现这一点,但它不起作用,不过,我将它作为VS代码中的C#项目来实现,然后发布到Azure上,一切都可以。谢谢你的指点。很高兴能帮助你。文章链接被阻止
Records: 3