mcpField
A
azure-identity-dotnet

azure-identity-dotnet

github.com/sickn33安全48.7k55 次安装今天更新
代码仓库

关于 azure-identity-dotnet

azure-identity-dotnet 是面向 .NET 开发者的 Azure 身份验证库指南,介绍如何为 Azure SDK 客户端配置 Microsoft Entra ID 凭据。内容涵盖凭据链、托管身份与开发环境凭据。

主要功能

  1. 01配置 DefaultAzureCredential 凭据链
  2. 02使用托管身份和工作负载身份
  3. 03配置客户端密钥、证书及用户凭据
  4. 04将凭据集成到 Azure SDK 客户端
  5. 05处理认证异常并启用诊断日志

适用场景

  1. 01在开发与生产环境中为 Azure SDK 客户端配置身份验证
  2. 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

大多数场景推荐使用的凭据。它会按顺序尝试多种身份验证方法:

顺序凭据默认启用
1EnvironmentCredential是
2WorkloadIdentityCredential是
3ManagedIdentityCredential是
4VisualStudioCredential是
5VisualStudioCodeCredential是
6AzureCliCredential是
7AzurePowerShellCredential是
8AzureDeveloperCliCredential是
9InteractiveBrowserCredential否
基本用法
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 托管ManagedIdentityCredentialAzure 托管标识
WorkloadIdentityCredentialKubernetes 工作负载标识
EnvironmentCredential环境变量
服务主体ClientSecretCredential客户端 ID + 密钥
ClientCertificateCredential客户端 ID + 证书
ClientAssertionCredential已签名的客户端断言
用户InteractiveBrowserCredential基于浏览器的身份验证
DeviceCodeCredential设备代码流
OnBehalfOfCredential委托标识
开发者AzureCliCredentialAzure CLI
AzurePowerShellCredentialAzure PowerShell
AzureDeveloperCliCredentialAzure Developer CLI
VisualStudioCredentialVisual 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.AzureDI 集成dotnet add package Microsoft.Extensions.Azure
Azure.Identity.Broker代理身份验证(Windows)dotnet add package Azure.Identity.Broker

参考链接

资源URL
NuGet 包https://www.nuget.org/packages/Azure.Identity
API 参考https://learn.microsoft.com/dotnet/api/azure.identity
凭据链https://learn.microsoft.com/dotnet/azure/sdk/authentication/credential-chains
最佳实践https://learn.microsoft.com/dotnet/azure/sdk/authentication/best-practices
GitHub 源码https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/identity/Azure.Identity

适用场景

当需要执行概览中描述的工作流或操作时,可使用此技能。

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 不要将输出视为环境特定验证、测试或专家审核的替代品。
  • 如果缺少必需的输入、权限、安全边界或成功标准,请暂停并请求澄清。

评论

支持 Markdown