【问题标题】:Accessing AzureKeyVaults using ManagedIdentity throws sporadic exception使用 ManagedIdentity 访问 AzureKeyVaults 会引发零星异常
【发布时间】:2020-08-05 10:14:26
【问题描述】:

我正在尝试从部署在 AppService 上的 .NET Framework 应用程序访问 AzureKeyVaults。它通常可以工作,但是当我转储 AppService 日志时,每隔几个小时就会发生一次以下异常:

<Data>TargetInvocationException</Data><Data>Exception has been thrown by the target of an invocation.
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Owin.Loader.DefaultLoader.&lt;&gt;c__DisplayClass19_1.&lt;MakeDelegate&gt;b__0(IAppBuilder builder)
   at Owin.Loader.DefaultLoader.&lt;&gt;c__DisplayClass9_0.&lt;LoadImplementation&gt;b__0(IAppBuilder builder)
   at Microsoft.Owin.Host.SystemWeb.OwinAppContext.Initialize(Action`1 startup)
   at Microsoft.Owin.Host.SystemWeb.OwinBuilder.Build(Action`1 startup)
   at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint()
   at System.Threading.LazyInitializer.EnsureInitializedCore[T](T&amp; target, Boolean&amp; initialized, Object&amp; syncLock, Func`1 valueFactory)
   at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication context)
   at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
   at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
   at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
   at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)

Parameters: Connection String: RunAs=App;, Resource: https://vault.azure.net, Authority: https://login.windows.net/###obfuscated_guid###. Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. An error occurred while sending the request.

这是我的代码导致的:

 var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App;");
 var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

 keyVaults.ForEach(keyVault => configurationBuilder.AddAzureKeyVault(
     $"https://{keyVault}.vault.azure.net/",
     keyVaultClient,
     new DefaultKeyVaultSecretManager()));

我正在尝试以这种方式加载两个密钥库。两者都配置了允许我的 AppService 调用它们的访问策略(获取和列出 Secret 的权限)。我还为我的 AppService 启用了“系统分配的身份”。

您对如何解决此问题有任何建议吗?提前致谢!

【问题讨论】:

  • 可能是因为请求MSI的访问令牌过于频繁造成的。您能否尝试在For each 代码的每个循环中添加一行代码以等待 1 秒。
  • 我们只对 Microsoft.Azure.KeyVault 进行关键修复。您是否能够切换到 Azure.Secrets.KeyVault.Secrets(或 .Keys 或 .Certificates)?还有一些新的配置管理器可用,例如 Azure.Extensions.AspNetCore.Configuration.Secrets。
  • 补充一下我已经问过的问题,堆栈跟踪不会有太大帮助,特别是因为它是一个 TargetInvocationException。存在服务器错误,因此需要从日志中获取更多信息。 4.x (Azure.SEcrets.KeyVault.*) 中的日志记录/跟踪更容易启用,但您可以使用旧代码来实现。有关示例,请参阅 github.com/heaths/KeyVaultClientLogging

标签: c# .net azure azure-keyvault azure-managed-identity


【解决方案1】:

感谢大家的cmets,

答案比我预期的要简单得多。我在 AppService 中添加了 preprod 插槽,并假设配置与托管标识配置一起被自动复制。可惜不是。

将托管标识添加到 preprod 插槽并将 preprod 插槽添加到 KeyVault 中的策略解决了该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2017-01-17
    • 2014-06-13
    • 2012-03-21
    相关资源
    最近更新 更多