【问题标题】:Azure error: DefaultAzureCredential authentication failedAzure 错误:DefaultAzureCredential 身份验证失败
【发布时间】:2020-07-07 22:28:46
【问题描述】:

我正在开发官方 Azure 示例:Getting started - Managing Compute Resources using Azure .NET SDK。并在应用程序尝试创建Resource Group 的以下代码的resourceGroup = await resourceGroups.CreateOrUpdateAsync(resourceGroupName, resourceGroup); 行上出现以下错误。我已按照注册应用程序的说明以及示例提供的link 进行操作。并且,assigned a role to app 如下:

错误

Azure.Identity.AuthenticationFailedException H结果=0x80131500 Message=DefaultAzureCredential 身份验证失败。 来源=Azure.Identity

内部异常 2: MsalServiceException:AADSTS70002:客户端不存在或未为消费者启用。如果您是应用程序开发人员,请通过 Azure 门户中的应用注册配置新应用程序

static async Task Main(string[] args)
{
    var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
    var resourceClient = new ResourcesManagementClient(subscriptionId, new DefaultAzureCredential());

    // Create Resource Group
    Console.WriteLine("--------Start create group--------");
    var resourceGroups = resourceClient.ResourceGroups;
    var location = "westus2";
    var resourceGroupName = "QuickStartRG";
    var resourceGroup = new ResourceGroup(location);
    resourceGroup = await resourceGroups.CreateOrUpdateAsync(resourceGroupName, resourceGroup);
    Console.WriteLine("--------Finish create group--------");

    // Create a Virtual Machine
    await Program.CreateVmAsync(subscriptionId, "QuickStartRG", location, "quickstartvm");

    // Delete resource group if necessary
    //Console.WriteLine("--------Start delete group--------");
    //await (await resourceGroups.StartDeleteAsync(resourceGroupName)).WaitForCompletionAsync();
    //Console.WriteLine("--------Finish delete group--------");
    //Console.ReadKey();
}

更新

按照示例中的说明,以下是我如何Used the portal to create an Azure AD application and service principal that can access resources。我可能没有在这里做任何事情。请让我知道我在这里没有做什么:

已注册应用在访问控制 (IAM) 中的角色分配

身份验证和直接 URI

已注册应用的 API 权限

UPDATE-2

@JoyWan 合作,我能够解决问题(谢谢乔伊)。下面是成功创建所有必需的compute resources 的屏幕截图,包括VM注意:点击图片可以更好地查看屏幕截图。

【问题讨论】:

  • 你在哪里运行代码?
  • @JoyWang 我在最新版本的VS2019 在家中本地运行代码。我订阅了 Azure,并按照示例的说明在那里注册了一个应用程序。

标签: c# azure azure-sdk-.net azure-sdk


【解决方案1】:

我测试了代码,它在我这边运行良好。你提到的步骤也是正确的。

在此示例中,DefaultAzureCredential() 实际上在本地使用 EnvironmentCredential(),因此如果您在本地运行代码,请确保您有 Set Environment Variables 和 AD App Client ID, Client Secret, Tenant ID

更新:

从@nam 的评论来看,问题是环境变量昨天没有刷新,因为他昨天关闭了机器,今天又重新启动了,环境变量同步了,因此应用程序开始工作了。

【讨论】:

  • 我认为这个问题可能与我没有正确地为我在 Azure 中注册的应用程序分配权限有关。我在帖子中添加了 UPDATE 部分,因此您可以告诉我我是否正确used the portal to create an Azure AD application and service principal that can access resources
  • @nam 我认为是正确的,您是否将角色添加到subscription scope 的服务主体?
  • 注册的应用具有所有者角色(显示在 UPDATE 部分的第一个屏幕截图中)。这就是你要问的吗?这就是我的做法:单击我的订阅--> 访问控制 (IAM)--> 单击添加角色分配上的添加按钮--> 角色:所有者。将访问权分配给:Azure AD 用户、组或服务主体。选择:我的注册应用程序。该屏幕类似于我在更新部分之前的上述帖子的第一个屏幕截图中显示的内容。我错过了什么还是我需要做的其他事情?
  • @nam 我认为所有这些事情都应该是正确的,这很奇怪,你能确保Client ID, Client Secret, Tenant ID, Subscription ID 在你的环境变量中都是正确的吗?或者您可以创建一个新的广告应用程序来尝试一下吗?无需更改任何内容,只需为其创建一个秘密并将应用程序添加为订阅中的角色。
  • 参见 UPDATE-2。当我今天阅读您的 cmets 后再次运行该应用程序时,它开始工作。所以,问题是 environment var 昨天没有刷新 - 当我创建项目时 - 因为机器可能需要重新启动 environment var 才能开始工作(同步)。但由于我昨天关闭了机器,今天又重新启动了它,environment var 同步,因此应用程序开始工作。感谢您完成整个过程。您可能希望将其设为Response,我会将其标记为Answer,以便其他人也能从中受益。
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多