【问题标题】:Missing Assembly Reference Using Microsoft.IdentityModel.Clients.ActiveDirectory 3.13.9 with Azure KeyVault C# SDK缺少将 Microsoft.IdentityModel.Clients.ActiveDirectory 3.13.9 与 Azure KeyVault C# SDK 结合使用的程序集参考
【发布时间】:2017-05-19 17:12:38
【问题描述】:

出于某种原因,我必须更新 Microsoft.IdentityModel.Clients.ActiveDirectory v3.13.9Microsoft.Azure.KeyVault v2.0.6。它总是会因缺少程序集引用而引发异常,但将我不允许使用的 Microsoft.IdentityModel.Clients.ActiveDirectory 降级到 v2.28.4 可以解决此问题 known issue

这是一个例外:

  InnerException:
   HResult=-2146233036
   Message=The type initializer for 'Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin' threw an exception.
   Source=Microsoft.IdentityModel.Clients.ActiveDirectory
   TypeName=Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin
   StackTrace:
        at Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin.get_Logger()
        at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext..cctor()
   InnerException:
        ErrorCode=assembly_not_found
        HResult=-2146233088
        Message=Assembly required for the platform not found. Make sure assembly 'Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.12.0.827, Culture=neutral, PublicKeyToken=31bf3856ad364e35' exists
        Source=Microsoft.IdentityModel.Clients.ActiveDirectory
        StackTrace:
             at Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin.LoadPlatformSpecificAssembly()
             at Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin.InitializeByAssemblyDynamicLinking()
             at Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformPlugin..cctor()
        InnerException:
             FileName=Microsoft.IdentityModel.Clients.ActiveDirectory.Platform, Version=3.12.0.827, Culture=neutral, PublicKeyToken=31bf3856ad364e35
             FusionLog==== Pre-bind state information ===

代码sn-ps:

    protected KeyVaultBase(string clientId, string clientSecret)
    {
        if (string.IsNullOrWhiteSpace(clientId))
        {
            throw new ArgumentNullException(nameof(clientId));
        }

        if (string.IsNullOrWhiteSpace(clientSecret))
        {
            throw new ArgumentNullException(nameof(clientSecret));
        }

        this.KeyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(
                (authority, resource, scope) => GetAccessToken(authority, resource, scope, clientId, clientSecret)
            )
        );
    }

    private static async Task<string> GetAccessToken(string authority, string resource, string scope, string clientId, string clientSecret)
    {
        var authnContext = new AuthenticationContext(authority);
        var clientCredential = new ClientCredential(clientId, clientSecret);
        var result = await authnContext.AcquireTokenAsync(resource, clientCredential);

        if (result == null)
        {
            throw new InvalidOperationException("Failed to obtain the JWT token");
        }

        return result.AccessToken;
    }

执行var authnContext = new AuthenticationContext(authority); 时抛出异常。

有没有人知道任何解决方案/解决方法可以在不降级的情况下解决此问题?

【问题讨论】:

  • 当您右键单击项目并选择属性时,您当前的项目是在哪个版本的 .net 框架下构建的..?
  • .NET Framework 4.5.2
  • 您是否允许将项目更改为使用不同版本的 .net 框架,例如降至 4.0 您还可以做的是将引用节点中的 dll 更改为 CopytoLocal= 值从 false为真
  • 没有。我的团队主要使用 .NET 4.5 和 4.5.2。
  • 那么这可以是 GAC 的吗?这几乎听起来像是一个 GAC 问题..

标签: c# .net azure nuget azure-keyvault


【解决方案1】:

在我的情况下,references 仅安装到 class library project,而不是正在执行的 assembly,因此它抛出了这个异常。

Microsoft.IdentityModel.Clients.ActiveDirectory nuget 包添加到执行程序集对我有用。

希望对你有帮助

【讨论】:

  • 是的!这个答案对我有用并节省了我的时间。我在一个类库项目中使用了Microsoft.IdentityModel.Clients.ActiveDirectory 3.19 版,但在实际的 ASP.NET Web 应用程序项目中只安装了 2.22 版。在网络应用项目中升级到 3.19 让我克服了这个错误。
【解决方案2】:

请尝试卸载 Microsoft.IdentityModel.Clients.ActiveDirectory v3.13.9 和Microsoft.Azure.KeyVault v2.0.6,然后再次重新安装。如果解决方案中有多个项目引用它们,请确保它们都是相同的版本。

我创建了一个控制台或 Asp.net MVC 项目,使用 Microsoft.IdentityModel.Clients.ActiveDirectory v3.13.9 和 Microsoft.Azure.KeyVault v2.0.6 在我这边都可以正常工作。

以下是我的详细步骤:

1.创建一个C#控制台项目。

2.使用 nuget 添加 Microsoft.IdentityModel.Clients.ActiveDirectory v3.13.9。

3.使用命令从包管理器控制台添加 Microsoft.Azure.KeyVault v2.0.6

Install-Package Microsoft.Azure.KeyVault -Version 2.0.6

Packages.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.KeyVault" version="2.0.6" targetFramework="net452" />
  <package id="Microsoft.Azure.KeyVault.WebKey" version="2.0.4" targetFramework="net452" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.13.9" targetFramework="net452" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net452" />
  <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.1" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
</packages>

在项目中添加一个类:

 class KeyVaultBase
    {

        static string _clientId= "xxxxxxxxxxxxx";
        static string _clientSecret = "xxxxxxxxxxxxxxxx";
        static string _tenantId = "xxxxxxxxxxxxxxxx";
        public static async Task<string> GetAccessToken(string azureTenantId, string azureAppId, string azureSecretKey)
        {

            var context = new AuthenticationContext("https://login.windows.net/" + _tenantId);
            ClientCredential clientCredential = new ClientCredential(_clientId, _clientSecret);
            var tokenResponse = await context.AcquireTokenAsync("https://vault.azure.net", clientCredential);
            var accessToken = tokenResponse.AccessToken;
            return accessToken;
        }

    }

4.测试从 KeyVault 中获取秘密

static void Main(string[] args)
        {
            var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(KeyVaultBase.GetAccessToken));
            string secretUri = "https://KeyVaultNameSpace.vault.azure.net/secrets/secretsname/6341322679db4f3491814ff6178dee45";
            var sec = kv.GetSecretAsync(secretUri).Result;
        }

【讨论】:

  • 谢谢!还是不行。明天我会在 Skype 上联系你,并与你分享我的测试项目。
  • 你有没有尝试创建一个新项目?
  • 实际上有两个测试项目——一个作为库,另一个是控制台应用程序。顺便说一句,我用的是 Azure Mooncake。
  • 对不起,我放弃了这个方法。今天晚些时候我会离线联系你。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2014-10-05
  • 2019-01-23
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多