创建一个Azure函数,该函数使用nuget包Microsoft.Rest.ClientRuntime.Azure.Authentication验证DataLake以及Microsoft.IdentityModel.Clients.ActiveDirectory验证HDInsight。当我尝试在功能项目中同时安装时出现以下错误:
uninstall-package:检测到Microsoft.IdentityModel.Clients.ActiveDirectory的版本冲突。直接从项目引用包来解决此问题 问题。 MyProject.Functions(> = 1.0.0) - > Microsoft.Rest.ClientRuntime.Azure.Authentication(> = 2.3.1) - > Microsoft.IdentityModel.Clients.ActiveDirectory(> = 2.28.3) MyProject.Functions(> = 1.0.0) - > Microsoft.Azure.Common.Authentication(> = 1.7.0-preview) - > Microsoft.IdentityModel.Clients.ActiveDirectory(> = 2.18.206251556)。
看起来像Microsoft.Azure.Common.Authentication 1.7.0-preview只有引用Microsoft.IdentityModel.Clients.ActiveDirectory 2.18.206251556的约束。不幸的是,这个图书馆自2016年2月以来一直没有更新,除了https://docs.microsoft.com/en-us/azure/hdinsight/hdinsight-create-non-interactive-authentication-dotnet-applications
中列出的步骤之外,我还不确定使用HDInsight进行非交互式身份验证的另一种方式。答案 0 :(得分:1)
根据我的理解,您可以直接使用包Microsoft.IdentityModel.Clients.ActiveDirectory来检索访问令牌,而不是使用Microsoft.Azure.Common.Authentication
包。
根据您的描述,我创建了我的azure函数项目来测试此问题。我按如下方式安装了软件包:
检索令牌的方法:
private static string GetAuthorizationToken()
{
string tenantId = "xxx";
string clientId = "xxx";
string clientSecrets = "xxx";
var context = new AuthenticationContext(String.Format("https://login.windows.net/{0}", tenantId));
AuthenticationResult result = context.AcquireTokenAsync(
"https://management.azure.com/"
, new ClientCredential(clientId, clientSecrets)
).Result;
return result.AccessToken;
}
我的功能:
[FunctionName("Function1")]
public static void Run([TimerTrigger("*/10 * * * * *")]TimerInfo myTimer,TraceWriter log)
{
TokenCloudCredentials tokenCredential = new TokenCloudCredentials("{subscriptionId}", GetAuthorizationToken());
HDInsightManagementClient _hdiManagementClient = new HDInsightManagementClient(tokenCredential);
var results = _hdiManagementClient.Clusters.List();
foreach (var name in results.Clusters)
{
Console.WriteLine("Cluster Name: " + name.Name);
Console.WriteLine("\t Cluster type: " + name.Properties.ClusterDefinition.ClusterType);
Console.WriteLine("\t Cluster location: " + name.Location);
Console.WriteLine("\t Cluster version: " + name.Properties.ClusterVersion);
}
}
答案 1 :(得分:0)
尝试通过几种不同的方式解决依赖关系后,我采用了Bruce的建议,删除了对Microsoft.Azure.Common.Authentication的所有引用,并使用Microsoft.IdentityModel.Clients.ActiveDirectory来获取令牌。