检测到Microsoft.IdentityModel.Clients.ActiveDirectory的版本冲突

时间:2017-11-09 02:27:08

标签: c# .net azure hdinsight azure-data-lake

创建一个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进行非交互式身份验证的另一种方式。

2 个答案:

答案 0 :(得分:1)

根据我的理解,您可以直接使用包Microsoft.IdentityModel.Clients.ActiveDirectory来检索访问令牌,而不是使用Microsoft.Azure.Common.Authentication包。

根据您的描述,我创建了我的azure函数项目来测试此问题。我按如下方式安装了软件包:

enter image description here

检索令牌的方法:

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来获取令牌。