当前位置: 首页 > 知识库问答 >
问题:

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

云鸿祯
2023-03-14

我有一个VMS和多个AppServices,我想使用同一个用户分配的托管服务标识。对于虚拟机,我可以分配身份并使用它从Azure密钥库中检索机密,代码如下:

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

AppServices使用ASP. NET Core 3.1,因此访问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());

注意:连接字符串来自本文档中的“Azure资源的用户分配标识”场景。

上述代码段引发以下异常:

2020-08-27T02:06:18.409648197Z未处理的异常。系统ArgumentException:连接字符串RunAs=App;AppId={client id ellided}无效。必须包含“TenantId”属性,且不能为空。2020-08-27T02:06:18.409681697Z微软。蔚蓝色的服务。骇人听闻的认证。AzureServiceTokenProviderFactory。ValidateAttribute(字典'2 connectionSettings,String属性,String connectionString)2020-08-27T02:06:18.409688597Z在微软。蔚蓝色的服务。骇人听闻的认证。AzureServiceTokenProviderFactory。创建(字符串连接字符串,字符串azureAdInstance)2020-08-27T02:06:18.409693297Z在微软。蔚蓝色的服务。骇人听闻的认证。AzureServiceTokenProvider。。ctor(管柱连接管柱、管柱极限状态)2020-08-27T02:06:18.409697797Z在API处。程序

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

未处理的异常。系统。参数异常:连接字符串RunAs=应用;AppId={客户端id elided};TenantId={租户id elided}无效。必须至少包含一个证书存储位置或AppKey属性。

托管标识没有证书,我正在尝试使用MSI来避免向代码或应用设置中添加机密。

我已经尝试按照Azure资源的托管标识方案删除连接字符串的AppId和TenantId部分,这将导致以下异常:

未处理的异常。微软。Azure。服务。应用验证。AzureServiceTokenProvider异常:参数:连接字符串:RunAs=应用程序,资源:https://vault.azure.net,权限:https://login.windows.net/b905ac32-5779-4bab-ac34-a8445e89f9e4.异常消息:试图使用托管服务标识获取令牌。无法获取访问令牌。MSI响应代码:BadRequest,响应:{"statusCode":400,"消息":"无法加载请求的托管标识。","相关ID":"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 AppServiceLinux、留档或两者、代码示例、配置或我的代码是否存在问题?

共有1个答案

方兴旺
2023-03-14

注意:不再建议在新的Key VaultSDK中使用Microsoft. Azure. Services. AppAuthentiation。它将被可用于. NET、Java、TypeScript和Python的新的Azure标识库DefaultAzureCre拘留所取代,并应用于所有新开发。更多信息可在此处找到:身份验证和AzureSDK。

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

但对于应用服务,由于您仍然使用遗留SDK(通过查看代码进行假设),请检查您是否拥有最新的Microsoft稳定版本。蔚蓝色的服务。AppAuthentication已明确添加到您的项目中(假设您现在继续使用遗留SDK)。

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

 类似资料:
  • 我正在使用angular框架构建前端应用程序。有没有办法,我如何将应用程序部署到Azure Linux应用程序服务? 我已经用NodeJS堆栈创建了Web应用程序,并将其分配给Linux应用程序服务。我用命令构建了我的angular应用程序,并将其部署到这个web应用程序中。当我使用url:

  • 我的webapp是用。NET核心并部署在Azure中。我已启用Azure应用程序服务身份验证,并将其配置为使用Azure Active Directory。当我访问webapp时,我确实会被重定向到正确的登录页面。登录后,我可以浏览到endpoint。对我进行身份验证,并查看是否存在针对我的用户的声明。我还可以验证下面的请求标头是否存在值: X-MS-TOKEN-AAD-ID-TOKEN X-MS

  • 我有一个nodejs应用程序,它只不过是一个使用微软botbuilder框架构建的机器人。我创建了azure应用程序服务来托管此应用程序。我想找到一种方法,将所有应用程序日志和web服务器日志(如果可能的话)持久化到某个持久化存储中。就像本地web应用程序一样,我们可以在应用程序服务器上查找日志 在做了一些研究之后,我找到了微软关于这方面的官方文件,但看起来它有以下局限性。 我们不能使用应用程序服

  • 我正在尝试使用HTTP连接器查询Azure表,但未成功。 根据此文档,Azure表现在可以进行托管身份验证:https://docs.microsoft.com/en-us/azure/storage/tables/authorize-managed-identity 我已使用PowerShell作为文档建议,授权azure表中消费逻辑应用程序的托管标识。https://docs.microsof

  • 但是所有的答案和评论对链接帖子的回应也没有太大帮助

  • 我们需要从Azure应用程序服务和Azure功能运行访问Azure服务总线(ASB)的应用程序。我们需要使用用户指定的身份进行身份验证。我们编写以下代码,用于系统分配的标识,但不用于用户分配的标识: 引发此错误: 所以核心错误是找不到指定ClientId/ResourceId的MSI 。看起来我们需要指定客户端id。然后我们发现https://github.com/Azure/azure-sdk-