C# 在Azure函数中使用Azure Fluent SDK时,如何使用托管服务标识创建Azure对象?
我正在编写一个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_端点 为了便于测试这两个库之间的差异,我编写了一个测试函数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.
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