具有用户分配的托管身份的Azure应用服务会使应用程序崩溃

问题描述

我同时拥有一个VMSS和多个AppService,我想使用相同的用户分配的托管服务标识。对于VMSS,我可以分配身份,并使用它通过以下代码从Azure密钥保险库中检索秘密:

var client = new SecretClient(new Uri(KeyVault),new DefaultAzureCredential());
var secret = client.GetSecret("secret-name");

AppServices使用ASP.NET Core 3.1,因此the recommended way访问Key Vault的机密是:

var azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=App;AppId={client id for the user-assigned managed identity elided}");
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault("https://{my vault name}.vault.azure.net/",keyVaultClient,new DefaultKeyVaultSecretManager());

请注意,连接字符串是从this documentation中的“ Azure资源的用户分配的身份”方案得出的。

上面的代码段引发以下异常:

2020-08-27T02:06:18.409648197Z未处理的异常。 System.ArgumentException:连接字符串RunAs = App; AppId = {省略的客户端ID}无效。必须包含'TenantId'属性,并且不能为空。 2020-08-27T02:06:18.409681697Z在Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderFactory.ValidateAttribute(字典'2 connectionSettings,字符串属性,字符串connectionString) 2020-08-27T02:06:18.409688597Z在Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderFactory.Create(字符串connectionString,字符串azureAdInstance) 2020-08-27T02:06:18.409693297Z(位于Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider..ctor(字符串connectionString,字符串azureAdInstance) 2020-08-27T02:06:18.409697797Z在API.Program。 c.b__1_0(HostBuilderContext上下文,IConfigurationBuilder配置)在/tmp/8d84a2d16145d21/API/Program.cs:第25行 2020-08-27T02:06:18.409703497Z at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration() 2020-08-27T02:06:18.409707797Z在Microsoft.Extensions.Hosting.HostBuilder.Build()

当我按要求添加“ TenantId”时,消息更改为:

未处理的异常。 System.ArgumentException:连接字符串RunAs = App; AppId = {已删除客户端ID}; TenantId = {已删除客户端ID}无效。必须至少包含CertificateStoreLocation或AppKey属性之一。

受管身份没有证书,我正在尝试使用MSI以避免在代码或应用程序设置中添加机密。

我已尝试根据“ Azure资源的托管身份”方案删除连接字符串的“ AppId”和“ TenantId”部分,这导致以下异常:

未处理的异常。 Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:参数:连接字符串:RunAs = App,资源:https://vault.azure.net,权限:https://login.windows.net/b905ac32-5779-4bab-ac34-a8445e89f9e4。异常消息:尝试使用托管服务标识获取令牌。无法获取访问令牌。 MSI ResponseCode:BadRequest,响应:{“ statusCode”:400,“ message”:“无法加载请求的管理身份。”,“ correlationId”:“ c8409322-357a-49d0-9686-453fb37cc4b4”}

我认为它正在尝试加载不存在的系统分配的标识。我已经确认通过Kudu控制台为(Linux)WebApp实例配置了托管身份:

  Kudu Remote Execution Console Type 'exit' to reset this console.
  /home>env
  MSI_ENDPOINT=[Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]
  IDENTITY_ENDPOINT=[Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]
  IDENTITY_HEADER=[Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]
  MSI_SECRET=[Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]

MSI + AppService + Linux,文档或两者,代码示例,配置或我的代码是否存在问题?

解决方法

注意:不建议再将Microsoft.Azure.Services.AppAuthentication与新的Key Vault SDK结合使用。它已替换为适用于.NET,Java,TypeScript和Python的新Azure身份库DefaultAzureCredentials,应将其用于所有新开发。可以在以下位置找到更多信息:enter image description here

您发布的VMSS代码使用的是新的KeyVault SDK,很好。

但是对于App Service,由于您仍在使用旧版SDK(假设您查看代码),请检查您是否已将Authentication and the Azure SDK的最新稳定版本明确添加到项目中(假设继续进行操作)现在是旧版SDK)。

此外,我希望您已经在App服务刀片中添加了“用户分配的身份”。

Microsoft.Azure.Services.AppAuthentication

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...