关于 azure-identity-dotnet
azure-identity-dotnet 是面向 .NET 开发者的 Azure 身份验证库指南,介绍如何为 Azure SDK 客户端配置 Microsoft Entra ID 凭据。内容涵盖凭据链、托管身份与开发环境凭据。
主要功能
- 01配置 DefaultAzureCredential 凭据链
- 02使用托管身份和工作负载身份
- 03配置客户端密钥、证书及用户凭据
- 04将凭据集成到 Azure SDK 客户端
- 05处理认证异常并启用诊断日志
适用场景
- 01在开发与生产环境中为 Azure SDK 客户端配置身份验证
- 02使用服务主体或托管身份访问 Azure 资源
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-identity-dotnet安装后在 Claude Code 中输入/azure-identity-dotnet确认已加载。
详细介绍
Azure.Identity (.NET)
用于通过 Microsoft Entra ID(前身为 Azure AD)对 Azure SDK 客户端进行身份验证的库。
安装
dotnet add package Azure.Identity
# For ASP.NET Core
dotnet add package Microsoft.Extensions.Azure
# For brokered authentication (Windows)
dotnet add package Azure.Identity.Broker
版本说明:示例参考 1.17/1.18 系列;请核实已安装的包和目标框架,不要将这些版本视为当前版本。
环境变量
使用密钥的服务主体
AZURE_CLIENT_ID=<application-client-id>
AZURE_TENANT_ID=<directory-tenant-id>
AZURE_CLIENT_SECRET=<client-secret-value>
使用证书的服务主体
AZURE_CLIENT_ID=<application-client-id>
AZURE_TENANT_ID=<directory-tenant-id>
AZURE_CLIENT_CERTIFICATE_PATH=<path-to-pfx-or-pem>
AZURE_CLIENT_CERTIFICATE_PASSWORD=<certificate-password> # Optional
托管标识
AZURE_CLIENT_ID=<user-assigned-managed-identity-client-id> # Only for user-assigned
凭据链及是否包含代理会因 SDK 版本和可选包而异。请检查实际使用的标识和租户,并明确限定生产凭据;仅进行身份验证并不会授予资源操作权限。请妥善保管令牌、证书密码和诊断输出。证书加载示例需要支持 X509CertificateLoader 的运行时,以及包含私钥的 PKCS#12 文件。请参阅凭据链和 PKCS#12 加载。
DefaultAzureCredential
大多数场景推荐使用的凭据。它会按顺序尝试多种身份验证方法:
| 顺序 | 凭据 | 默认启用 |
|---|---|---|
| 1 | EnvironmentCredential | 是 |
| 2 | WorkloadIdentityCredential | 是 |
| 3 | ManagedIdentityCredential | 是 |
| 4 | VisualStudioCredential | 是 |
| 5 | VisualStudioCodeCredential | 是 |
| 6 | AzureCliCredential | 是 |
| 7 | AzurePowerShellCredential | 是 |
| 8 | AzureDeveloperCliCredential | 是 |
| 9 | InteractiveBrowserCredential | 否 |
基本用法
using Azure.Identity;
using Azure.Storage.Blobs;
var credential = new DefaultAzureCredential();
var blobClient = new BlobServiceClient(
new Uri("https://myaccount.blob.core.windows.net"),
credential);
使用依赖注入的 ASP.NET Core
using Azure.Identity;
using Microsoft.Extensions.Azure;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://myaccount.blob.core.windows.net"));
clientBuilder.AddSecretClient(
new Uri("https://myvault.vault.azure.net"));
// Uses DefaultAzureCredential by default
clientBuilder.UseCredential(new DefaultAzureCredential());
});
自定义 DefaultAzureCredential
var credential = new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
ExcludeEnvironmentCredential = true,
ExcludeManagedIdentityCredential = false,
ExcludeVisualStudioCredential = false,
ExcludeAzureCliCredential = false,
ExcludeInteractiveBrowserCredential = false, // Enable interactive
TenantId = "<tenant-id>",
ManagedIdentityClientId = "<user-assigned-mi-client-id>"
});
凭据类型
ManagedIdentityCredential(生产环境)
// System-assigned managed identity
var credential = new ManagedIdentityCredential(ManagedIdentityId.SystemAssigned);
// User-assigned by client ID
var credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedClientId("<client-id>"));
// User-assigned by resource ID
var credential = new ManagedIdentityCredential(
ManagedIdentityId.FromUserAssignedResourceId("<resource-id>"));
ClientSecretCredential
var credential = new ClientSecretCredential(
tenantId: "<tenant-id>",
clientId: "<client-id>",
clientSecret: "<client-secret>");
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
credential);
ClientCertificateCredential
var certificate = X509CertificateLoader.LoadPkcs12FromFile(
"MyCertificate.pfx", Environment.GetEnvironmentVariable("CERTIFICATE_PASSWORD"));
var credential = new ClientCertificateCredential(
tenantId: "<tenant-id>",
clientId: "<client-id>",
certificate);
ChainedTokenCredential(自定义链)
var credential = new ChainedTokenCredential(
new ManagedIdentityCredential(),
new AzureCliCredential());
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
credential);
开发者凭据
// Azure CLI
var credential = new AzureCliCredential();
// Azure PowerShell
var credential = new AzurePowerShellCredential();
// Azure Developer CLI (azd)
var credential = new AzureDeveloperCliCredential();
// Visual Studio
var credential = new VisualStudioCredential();
// Interactive Browser
var credential = new InteractiveBrowserCredential();
基于环境的配置
// Production vs Development
TokenCredential credential = builder.Environment.IsProduction()
? new ManagedIdentityCredential("<client-id>")
: new DefaultAzureCredential();
主权云
var credential = new DefaultAzureCredential(
new DefaultAzureCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzureGovernment
});
// Available authority hosts:
// AzureAuthorityHosts.AzurePublicCloud (default)
// AzureAuthorityHosts.AzureGovernment
// AzureAuthorityHosts.AzureChina
// AzureAuthorityHosts.AzureGermany
凭据类型参考
| 类别 | 凭据 | 用途 |
|---|---|---|
| 链 | DefaultAzureCredential | 适用于从开发到生产的预配置链 |
ChainedTokenCredential | 自定义凭据链 | |
| Azure 托管 | ManagedIdentityCredential | Azure 托管标识 |
WorkloadIdentityCredential | Kubernetes 工作负载标识 | |
EnvironmentCredential | 环境变量 | |
| 服务主体 | ClientSecretCredential | 客户端 ID + 密钥 |
ClientCertificateCredential | 客户端 ID + 证书 | |
ClientAssertionCredential | 已签名的客户端断言 | |
| 用户 | InteractiveBrowserCredential | 基于浏览器的身份验证 |
DeviceCodeCredential | 设备代码流 | |
OnBehalfOfCredential | 委托标识 | |
| 开发者 | AzureCliCredential | Azure CLI |
AzurePowerShellCredential | Azure PowerShell | |
AzureDeveloperCliCredential | Azure Developer CLI | |
VisualStudioCredential | Visual Studio |
最佳实践
1. 在生产环境中使用确定性凭据
// Development
var devCredential = new DefaultAzureCredential();
// Production - use specific credential
var prodCredential = new ManagedIdentityCredential("<client-id>");
2. 重用凭据实例
// Good: Single credential instance shared across clients
var credential = new DefaultAzureCredential();
var blobClient = new BlobServiceClient(blobUri, credential);
var secretClient = new SecretClient(vaultUri, credential);
3. 配置重试策略
var options = new ManagedIdentityCredentialOptions(
ManagedIdentityId.FromUserAssignedClientId(clientId))
{
Retry =
{
MaxRetries = 3,
Delay = TimeSpan.FromSeconds(0.5),
}
};
var credential = new ManagedIdentityCredential(options);
4. 启用日志记录以便调试
using Azure.Core.Diagnostics;
using AzureEventSourceListener listener = new((args, message) =>
{
if (args is { EventSource.Name: "Azure-Identity" })
{
Console.WriteLine(message);
}
}, EventLevel.LogAlways);
错误处理
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
var client = new SecretClient(
new Uri("https://myvault.vault.azure.net"),
new DefaultAzureCredential());
try
{
KeyVaultSecret secret = await client.GetSecretAsync("secret1");
}
catch (AuthenticationFailedException e)
{
Console.WriteLine($"Authentication Failed: {e.Message}");
}
catch (CredentialUnavailableException e)
{
Console.WriteLine($"Credential Unavailable: {e.Message}");
}
主要异常
| 异常 | 描述 |
|---|---|
AuthenticationFailedException | 身份验证错误的基类异常 |
CredentialUnavailableException | 凭据无法在当前环境中进行身份验证 |
AuthenticationRequiredException | 需要交互式身份验证 |
托管标识支持
支持的 Azure 服务:
- Azure App Service 和 Azure Functions
- Azure Arc
- Azure Cloud Shell
- Azure Kubernetes Service (AKS)
- Azure Service Fabric
- Azure Virtual Machines
- Azure Virtual Machine Scale Sets
线程安全
所有凭据实现均为线程安全。单个凭据实例可安全地由多个客户端和线程共享。
相关 SDK
| SDK | 用途 | 安装 |
|---|---|---|
Azure.Identity | 身份验证(此 SDK) | dotnet add package Azure.Identity |
Microsoft.Extensions.Azure | DI 集成 | dotnet add package Microsoft.Extensions.Azure |
Azure.Identity.Broker | 代理身份验证(Windows) | dotnet add package Azure.Identity.Broker |
参考链接
适用场景
当需要执行概览中描述的工作流或操作时,可使用此技能。
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 不要将输出视为环境特定验证、测试或专家审核的替代品。
- 如果缺少必需的输入、权限、安全边界或成功标准,请暂停并请求澄清。
评论
支持 Markdown