在本地开发期间使用开发人员帐户对访问 Azure 服务的 .NET 应用进行身份验证
开发人员需要在其本地工作站上调试和测试云应用。 在本地开发期间,当应用在开发人员的工作站上运行时,它仍然必须向应用使用的任何 Azure 服务进行身份验证。 本文介绍如何在本地开发期间使用开发人员的 Azure 凭据对访问 Azure 的应用进行身份验证。
要使应用能够在本地开发期间使用开发人员的 Azure 凭据向 Azure 进行身份验证,必须通过下述开发人员工具之一将开发人员登录到 Azure:
- Visual Studio
- Azure CLI
- Azure 开发人员 CLI
- Azure PowerShell
Azure 标识库可以检测到开发人员已从其中一个工具登录。 然后,该库可通过工具获取 Microsoft Entra 访问令牌,以将应用作为登录用户向 Azure 进行身份验证。
这种方法对于开发团队而言最容易设置,因为它利用开发人员的现有 Azure 帐户。 但是,开发人员帐户拥有的权限可能比应用需要的权限更多,因此超出了应用在生产环境中运行时使用的权限。 作为替代方法,可以创建在本地开发期间使用的应用程序服务主体,其权限范围仅限应用所需的访问权限。
1 - 为本地开发创建 Microsoft Entra 组
由于基本上始终有多个开发人员在开发一个应用,因此推荐一个 Microsoft Entra 组来封装应用在本地开发中所需的角色(权限)。 此方法提供以下优势:
- 由于角色是在组级别分配的,因此可以确保为每个开发人员分配相同的角色。
- 如果应用需要新角色,只需将此角色添加到应用的组即可。
- 如果有新的开发人员加入团队,他们将获得在添加到组后处理应用所需的权限。
如果开发团队已有一个 Microsoft Entra 组,则你可以使用该组。 否则,请完成以下步骤来创建 Microsoft Entra 组。
注意
默认情况下,只有目录中的某些特权角色能够创建 Microsoft Entra 组。 如果无法创建组,请联系目录的管理员。 如果无法将成员添加到现有组,请联系组所有者或目录管理员。 若要了解详细信息,请参阅管理 Microsoft Entra 组和组成员身份。
2 - 将角色分配给 Microsoft Entra 组
接下来,请确定应用在哪些资源上需要哪些角色(权限),并将这些角色分配到应用。 在此示例中,角色将分配给在步骤 1 中创建的 Microsoft Entra 组。 可以在资源、资源组或订阅范围分配组。 此示例演示如何在资源组范围分配角色,因为大多数应用将其所有 Azure 资源分组到单个资源组中。
3 - 使用开发人员工具登录到 Azure
接下来,使用多个开发人员工具之一登录到 Azure。 进行身份验证的帐户也应该存在于前面创建并配置的 Microsoft Entra 组中。
导航到“工具”>“选项”,打开“选项”对话框。
在顶部的“搜索选项”框中,键入“Azure”来筛选可用选项。
在“Azure 服务身份验证”下,选择“帐户选择”。
选择“选择帐户”下的下拉菜单,然后选择添加 Microsoft 帐户。 此时会打开一个窗口,提示你选取一个帐户。 输入所需 Azure 帐户的凭据,然后选择“确认”。
选择“确定”来关闭“选项”对话框。
4 - 在应用程序中实现 DefaultAzureCredential
DefaultAzureCredential 是一个带个人观点的有序机制序列,用于向 Microsoft Entra 进行身份验证。 每个身份验证机制都是一个派生自 TokenCredential 类的类,称为“凭据”。 在运行时,DefaultAzureCredential
尝试使用第一个凭据进行身份验证。 如果该凭据无法获取访问令牌,则会尝试序列中的下一个凭据,以此类推,直到成功获取访问令牌。 这样,应用就可在不同的环境中使用不同的凭据,而无需编写特定于环境的代码。
DefaultAzureCredential
按哪种顺序和在哪个位置查找凭据见于 DefaultAzureCredential。
若要使用 DefaultAzureCredential
,请将 Azure.Identity 和 Microsoft.Extensions.Azure 包添加到应用程序:
在所选终端中,导航到应用程序项目目录并运行以下命令:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
使用各种 Azure SDK 客户端库中的专用客户端类访问 Azure 服务。 应注册这些类和你自己的自定义服务,以便可以在整个应用中通过依赖项注入来访问它们。 在 Program.cs
中,完成以下步骤以注册客户端类和 DefaultAzureCredential
:
- 通过
using
指令包含Azure.Identity
和Microsoft.Extensions.Azure
命名空间。 - 使用相应的
Add
前缀扩展方法注册 Azure 服务客户端。 - 将
DefaultAzureCredential
的实例传递给UseCredential
方法。
例如:
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
UseCredential
的替代方法是直接实例化 DefaultAzureCredential
:
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
上述代码在本地开发工作站上运行时,它会在应用程序服务主体的环境变量或本地安装的开发人员工具(如 Visual Studio)中查找一组开发人员凭据。 在本地开发期间,两种方法都可用于对访问 Azure 资源的应用进行身份验证。
部署到 Azure 时,此代码也可以对访问 Azure 资源的应用进行身份验证。 DefaultAzureCredential
可以检索环境设置和托管标识配置,以自动向其他服务进行身份验证。