在本地开发期间,应用程序需要进行身份验证,以便访问各种 Azure 服务。 可以使用以下方法之一在本地进行身份验证:
- 将开发人员帐户与Azure标识库支持的开发人员工具之一配合使用。 有关详细信息,请参阅 在本地开发期间使用开发人员帐户对 Java 应用进行身份验证到 Azure 服务。
- 使用服务主体。
本文介绍如何使用应用程序服务主体。 有关服务主体的详细信息,请参阅 Microsoft Entra ID 中的应用程序和服务主体对象。 本文内容:
- 如何使用 Microsoft Entra注册应用程序以创建服务主体。
- 如何使用Microsoft Entra组高效管理权限。
- 如何为角色分配范围权限。
- 如何通过应用代码使用服务主体进行身份验证。
使用专用应用程序服务主体,可以在访问Azure资源时遵循最低特权原则。 可以在开发期间限制对应用的特定要求的权限,以防止意外访问适用于其他应用或服务的Azure资源。 此方法还有助于避免将应用移动到生产环境时出现的问题,方法是确保应用在开发环境中没有超特权。
在 Azure 中注册应用时,会创建应用程序服务主体。 对于本地开发,你应该:
- 为每个在应用上运行的开发人员创建单独的应用注册,以便每个开发人员都有自己的应用程序服务主体,无需共享凭据。
- 为每个应用创建单独的应用注册,以仅将应用的权限限制为必需内容。
在本地开发期间,使用应用程序服务主体的标识设置环境变量。 Azure标识库读取这些环境变量,以向所需的Azure资源对应用进行身份验证。
在 Azure 中注册应用
使用Azure门户或Azure CLI通过Azure中的应用注册创建应用程序服务主体对象。
在Azure门户中,使用搜索栏导航到 App registrations 页。
在 App registrations 页上,选择“+ 新建注册。
在“注册应用程序”页面上:
- 对于 名称 字段,请输入包含应用名称和目标环境的描述性值。
- 对于支持的帐户类型,请仅选择此组织目录中的帐户(仅限 Microsoft 客户引导 - 单租户),或选择最能满足你的要求的选项。
选择 注册 以注册应用并创建服务主体。
在应用的 应用注册 页上,复制 应用程序(客户端)ID 和 目录(租户)ID 并将其粘贴到临时位置,以便在应用代码配置中稍后使用。
选择“添加证书或机密”以设置应用的凭据。
在 证书 & 机密 页上,选择 + 新建客户端密码。
在打开的“添加客户端机密”打开的弹出面板中:
- 对于“说明”,请输入“当前”作为值。
- 对于“过期”值,请保留默认建议值 180 天。
- 选择“”,然后选择“”以添加密钥。
在 证书 & 密钥 页上,复制客户端密钥的 Value 属性,以便在将来的步骤中使用。
注释
创建应用注册后,客户端机密值仅显示一次。 无需使此客户端密码失效即可添加更多客户端机密,但无法再次显示此值。
创建用于本地开发的Microsoft Entra组
创建一个Microsoft Entra组来封装应用在本地开发中所需的角色(权限),而不是将角色分配给单个服务主体对象。 此方法具有以下优势:
- 每个开发人员在组级别都分配了相同的角色。
- 如果应用需要新角色,只需将角色添加到应用的组中。
- 如果新开发人员加入团队,则会为开发人员创建一个新的应用程序服务主体并将其添加到组中,确保开发人员有权处理应用。
将角色分配给组
接下来,确定您的应用在哪些资源上需要哪些角色及其对应的权限,并将这些角色分配给您创建的 Microsoft Entra 组。 可以在资源、资源组或订阅范围内为组分配角色。 此示例演示如何在资源组范围内分配角色,因为大多数应用将所有Azure资源分组到单个资源组中。
在 Azure 门户中,导航到包含应用的资源组的 Overview 页。
在左侧导航栏中,选择“访问控制(IAM)”。
在 “访问控制”(IAM) 页上,选择“ + 添加 ”,然后从下拉菜单中选择 “添加角色分配 ”。 “添加角色分配”页提供了多个选项卡来配置和分配角色。
在“ 角色 ”选项卡上,使用搜索框查找要分配的角色。 选择角色,然后选择“ 下一步”。
在“ 成员 ”选项卡上:
- 对于 “分配对值的访问权限 ”,请选择“ 用户”、“组”或服务主体 。
- 对于 “成员 ”值,选择 “+ 选择成员 ”以打开 “选择成员 ”浮出控件面板。
- 搜索之前创建的Microsoft Entra组,并从筛选的结果中选择它。 选择 “选择” 以选择组并关闭浮动面板。
- 选择“成员”选项卡底部的“审阅 + 分配”。
在“ 审阅 + 分配 ”选项卡上,选择页面底部的 “审阅 + 分配 ”。
设置应用环境变量
在运行时,来自 Azure 标识库的某些凭据(例如 DefaultAzureCredential、EnvironmentCredential 和 ClientSecretCredential)按环境变量中的约定搜索服务主体信息。 使用Java时,可以根据工具和环境以不同的方式配置环境变量。
无论选择哪种方法,都为服务主体配置以下环境变量:
-
AZURE_CLIENT_ID:用于标识Azure中注册的应用。 -
AZURE_TENANT_ID:Microsoft Entra 租户的 ID。 -
AZURE_CLIENT_SECRET:为应用生成的机密凭据。
请输入以下行至您的~/.bashrc或~/.zshrc文件。 将占位符值替换为应用注册中的实际值:
export AZURE_CLIENT_ID="<your-client-id>"
export AZURE_TENANT_ID="<your-tenant-id>"
export AZURE_CLIENT_SECRET="<your-client-secret>"
编辑文件后,运行 source ~/.bashrc 或 source ~/.zshrc 应用对当前会话所做的更改。
通过应用向Azure服务进行身份验证
Azure标识库提供了各种凭据—这是TokenCredential 的实现,支持不同的方案和Microsoft Entra身份验证流程。 以下步骤演示了在本地和生产环境中与服务主体一起使用ClientSecretCredential的方法。
实现代码
将 azure-identity 依赖项添加到 pom.xml 文件:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
可以使用来自各种Azure SDK客户端库的专用客户端类来访问Azure服务。 对于在应用中创建Azure SDK客户端对象的任何Java代码,请执行以下步骤:
- 从
com.azure.identity包导入ClientSecretCredentialBuilder类。 - 通过使用
ClientSecretCredentialBuilder、tenantId、clientId和clientSecret创建ClientSecretCredential对象。 - 将
ClientSecretCredential实例传递给Azure SDK客户端对象生成器的credential方法。
以下代码段显示了此方法的示例:
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
String tenantId = System.getenv("AZURE_TENANT_ID");
String clientId = System.getenv("AZURE_CLIENT_ID");
String clientSecret = System.getenv("AZURE_CLIENT_SECRET");
ClientSecretCredential credential = new ClientSecretCredentialBuilder()
.tenantId(tenantId)
.clientId(clientId)
.clientSecret(clientSecret)
.build();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<account-name>.blob.core.windows.net")
.credential(credential)
.buildClient();
后续步骤
本文介绍了通过服务主体进行身份验证。 这种身份验证形式是 Azure SDK for Java 中的多种身份验证方法之一。 以下文章介绍了其他身份验证方法:
- 使用开发人员帐户在本地开发期间认证Java应用程序以访问Azure服务
- 使用系统分配的托管标识对Azure托管的Java应用进行身份验证,以访问Azure资源
- 使用用户分配的托管身份验证Azure托管的Java应用程序以访问Azure资源
如果遇到与服务主体身份验证相关的问题,请参阅 服务主体身份验证疑难解答。
在掌握身份验证后,请参阅 在 Azure SDK for Java 中配置日志记录 以获取有关 SDK 提供的日志功能的信息。