Uso del SDK de Azure para .NET en aplicaciones de ASP.NET Core
El SDK de Azure para .NET permite que las aplicaciones de ASP.NET Core se integren con muchos servicios de Azure diferentes. En este artículo, aprenderá los procedimientos recomendados y los pasos para adoptar el SDK de Azure para .NET en las aplicaciones de ASP.NET Core. Aprenderá a:
- Registrar servicios para la inserción de dependencias.
- Autentíquese en Azure sin usar contraseñas ni secretos.
- Implemente una configuración centralizada y estandarizada.
- Configure problemas comunes de la aplicación web, como el registro y los reintentos.
Exploración de bibliotecas cliente comunes del SDK de Azure
ASP.NET aplicaciones principales que se conectan a los servicios de Azure suelen depender de las siguientes bibliotecas cliente del SDK de Azure:
- Microsoft.Extensions.Azure proporciona métodos auxiliares para registrar clientes con la recopilación del servicio de inserción de dependencias y controla diversos problemas para usted, como la configuración del registro, el control de la duración del servicio de inserción de dependencias y la administración de credenciales de autenticación.
- Azure.Identity habilita la compatibilidad con la autenticación del identificador de Entra de Microsoft en el SDK de Azure. Proporciona un conjunto de implementaciones de TokenCredential para construir clientes del SDK de Azure que admiten la autenticación de Microsoft Entra.
Azure.<service-namespace>
las bibliotecas, como Azure.Storage.Blobs y Azure.Messaging.ServiceBus, proporcionan clientes de servicio y otros tipos para ayudarle a conectarse y consumir servicios específicos de Azure. Para obtener un inventario completo de estas bibliotecas, consulte Bibliotecas con Azure.Core.
En las secciones siguientes, explorará cómo implementar una aplicación ASP.NET Core que use estas bibliotecas.
Registro de clientes del SDK de Azure con la colección de servicios de inserción de dependencias
Las bibliotecas cliente de Azure SDK para .NET proporcionan clientes de servicio para conectar la aplicación a servicios de Azure, como Azure Blob Storage y Azure Key Vault. Registre estos servicios con el contenedor de dependencias en el archivo de la Program.cs
aplicación para que estén disponibles a través de la inserción de dependencias.
Complete los pasos siguientes para registrar los servicios que necesita:
Agregue el paquete Microsoft.Extensions.Azure :
dotnet add package Microsoft.Extensions.Azure
Agregue los paquetes de cliente de servicio pertinentes
Azure.*
:dotnet add package Azure.Security.KeyVault.Secrets dotnet add package Azure.Storage.Blobs dotnet add package Azure.Messaging.ServiceBus
En el
Program.cs
archivo de la aplicación, invoque el AddAzureClients método de extensión desde laMicrosoft.Extensions.Azure
biblioteca para registrar un cliente para comunicarse con cada servicio de Azure. Algunas bibliotecas cliente proporcionan subclientes adicionales para subgrupos específicos de la funcionalidad del servicio de Azure. Puede registrar estos subclientes para la inserción de dependencias mediante el método de AddClient extensión.builder.Services.AddAzureClients(clientBuilder => { // Register a client for each Azure service using inline configuration clientBuilder.AddSecretClient(new Uri("<key_vault_url>")); clientBuilder.AddBlobServiceClient(new Uri("<storage_url>")); clientBuilder.AddServiceBusClientWithNamespace( "<your_namespace>.servicebus.windows.net"); // Register a subclient for each Azure Service Bus Queue var queueNames = new string[] { "queue1", "queue2" }; foreach (string queue in queueNames) { clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>( (_, _, provider) => provider.GetService<ServiceBusClient>() .CreateSender(queue)).WithName(queue); } // Register a shared credential for Microsoft Entra ID authentication clientBuilder.UseCredential(new DefaultAzureCredential()); });
Inserte los clientes registrados en los componentes de la aplicación, los servicios o el punto de conexión de API de ASP.NET Core:
app.MapGet("/reports", async ( BlobServiceClient blobServiceClient, IAzureClientFactory<ServiceBusSender> senderFactory) => { // Create the named client ServiceBusSender serviceBusSender = senderFactory.CreateClient("queue1"); await serviceBusSender.SendMessageAsync(new ServiceBusMessage("Hello world")); // Use the blob client BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("reports"); List<BlobItem> reports = new(); await foreach (BlobItem blobItem in containerClient.GetBlobsAsync()) { reports.Add(blobItem); } return reports; }) .WithName("GetReports");
Para más información, consulte Inserción de dependencias con el SDK de Azure para .NET.
Autenticación mediante Microsoft Entra ID
La autenticación basada en tokens con el identificador de Entra de Microsoft es el enfoque recomendado para autenticar solicitudes en los servicios de Azure. Para autorizar esas solicitudes, el control de acceso basado en rol (RBAC) de Azure administra el acceso a los recursos de Azure en función de la identidad de Microsoft Entra de un usuario y los roles asignados.
Use la biblioteca de identidades de Azure para la compatibilidad con la autenticación basada en tokens mencionada anteriormente. La biblioteca proporciona clases como DefaultAzureCredential
para simplificar la configuración de conexiones seguras. DefaultAzureCredential
admite varios métodos de autenticación y determina el que se debe usar en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos (local frente a producción) sin implementar código específico del entorno. Visite la sección Autenticación de la documentación de Azure SDK para .NET para más información sobre estos temas.
Nota:
Muchos servicios de Azure también permiten autorizar solicitudes mediante claves. Sin embargo, este enfoque debe usarse con precaución. Los desarrolladores deben ser diligentes para no exponer nunca las claves de acceso en una ubicación que no sea segura. Cualquier persona que tenga la clave de acceso puede autorizar solicitudes en el recurso de Azure asociado.
Agregue el paquete Azure.Identity :
dotnet add package Azure.Identity
En el
Program.cs
archivo de la aplicación, invoque el UseCredential método de extensión de laMicrosoft.Extensions.Azure
biblioteca para establecer una instancia compartidaDefaultAzureCredential
para todos los clientes de servicio de Azure registrados:builder.Services.AddAzureClients(clientBuilder => { // Register a client for each Azure service using inline configuration clientBuilder.AddSecretClient(new Uri("<key_vault_url>")); clientBuilder.AddBlobServiceClient(new Uri("<storage_url>")); clientBuilder.AddServiceBusClientWithNamespace( "<your_namespace>.servicebus.windows.net"); // Register a subclient for each Azure Service Bus Queue var queueNames = new string[] { "queue1", "queue2" }; foreach (string queue in queueNames) { clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>( (_, _, provider) => provider.GetService<ServiceBusClient>() .CreateSender(queue)).WithName(queue); } // Register a shared credential for Microsoft Entra ID authentication clientBuilder.UseCredential(new DefaultAzureCredential()); });
DefaultAzureCredential
detecta las credenciales disponibles en el entorno actual y las usa para autenticarse en los servicios de Azure. Para conocer el orden y las ubicaciones en las queDefaultAzureCredential
examina las credenciales, consulte Información general sobre DefaultAzureCredential. El uso de una instancia compartidaDefaultAzureCredential
garantiza que se use la caché de tokens subyacente, lo que mejora la resistencia y el rendimiento de la aplicación debido a menos solicitudes de un nuevo token.
Aplicación de configuraciones
Los clientes del servicio Azure SDK admiten configuraciones para cambiar sus comportamientos predeterminados. Hay dos maneras de configurar clientes de servicio:
- Los archivos de configuración JSON suelen ser el enfoque recomendado porque simplifican la administración de diferencias en las implementaciones de aplicaciones entre entornos.
- Las configuraciones de código insertadas se pueden aplicar al registrar el cliente de servicio. Por ejemplo, en la sección Registrar clientes y subclientes , ha pasado explícitamente las variables de URI a los constructores de cliente.
IConfiguration
Los métodos de extensión respetan las Microsoft.Extensions.Azure
reglas de precedencia, que se detallan en la documentación de proveedores de configuración.
Complete los pasos descritos en las secciones siguientes para actualizar la aplicación para usar la configuración de archivos JSON para los entornos adecuados. Use el appsettings.Development.json
archivo para la configuración de desarrollo y el appsettings.Production.json
archivo para la configuración del entorno de producción. Puede agregar opciones de configuración cuyos nombres son propiedades públicas en la ClientOptions clase al archivo JSON.
Configuración de servicios registrados
Actualice el
appsettings.<environment>.json
archivo de la aplicación con las configuraciones de servicio resaltadas:{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "Azure.Messaging.ServiceBus": "Debug" } }, "AzureDefaults": { "Diagnostics": { "IsTelemetryDisabled": false, "IsLoggingContentEnabled": true }, "Retry": { "MaxRetries": 3, "Mode": "Exponential" } }, "KeyVault": { "VaultUri": "https://<your-key-vault-name>.vault.azure.net" }, "ServiceBus": { "Namespace": "<your_service-bus_namespace>.servicebus.windows.net" }, "Storage": { "ServiceUri": "https://<your-storage-account-name>.storage.windows.net" } }
En la muesta del código JSON anterior:
- Los nombres de clave de nivel superior,
KeyVault
,ServiceBus
yStorage
, son nombres arbitrarios que se usan para hacer referencia a las secciones de configuración desde el código. Estos nombres se pasan aAddClient
los métodos de extensión para configurar un cliente determinado. Todos los demás nombres de clave se asignan a opciones de cliente específicas y la serialización JSON se realiza de manera que no distingue mayúsculas de minúsculas. - Los
KeyVault:VaultUri
valores de clave ,ServiceBus:Namespace
yStorage:ServiceUri
se asignan a los argumentos de las SecretClient(Uri, TokenCredential, SecretClientOptions)sobrecargas del constructor , ServiceBusClient(String)y BlobServiceClient(Uri, TokenCredential, BlobClientOptions) , respectivamente. Las variantes de los constructoresTokenCredential
se usan porque se establece un valor predeterminadoTokenCredential
a través de la llamada al método UseCredential(TokenCredential).
- Los nombres de clave de nivel superior,
Actualice el
Program.cs
archivo para recuperar las configuraciones del archivo JSON medianteIConfiguration
y páselas a los registros de servicio:builder.Services.AddAzureClients(clientBuilder => { // Register clients using a config file section clientBuilder.AddSecretClient( builder.Configuration.GetSection("KeyVault")); clientBuilder.AddBlobServiceClient( builder.Configuration.GetSection("Storage")); // Register clients using a specific config key-value pair clientBuilder.AddServiceBusClientWithNamespace( builder.Configuration["ServiceBus:Namespace"]);
Configuración de los valores predeterminados y reintentos de Azure
Es posible que quiera cambiar las configuraciones de cliente de Azure predeterminadas globalmente o para un cliente de servicio específico. Por ejemplo, puede que le interese una configuración de reintentos diferente o que prefiera usar una versión de API de servicio diferente. Puede establecer la configuración de reintentos globalmente o por servicio.
Actualice el archivo de configuración para establecer la configuración predeterminada de Azure, como una nueva directiva de reintento predeterminada que usarán todos los clientes registrados de Azure:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "Azure.Messaging.ServiceBus": "Debug" } }, "AzureDefaults": { "Diagnostics": { "IsTelemetryDisabled": false, "IsLoggingContentEnabled": true }, "Retry": { "MaxRetries": 3, "Mode": "Exponential" } }, "KeyVault": { "VaultUri": "https://<your-key-vault-name>.vault.azure.net" }, "ServiceBus": { "Namespace": "<your_service-bus_namespace>.servicebus.windows.net" }, "Storage": { "ServiceUri": "https://<your-storage-account-name>.storage.windows.net" } }
En el
Program.cs
archivo, llame al método deConfigureDefaults
extensión para recuperar la configuración predeterminada y aplicarla a los clientes de servicio:builder.Services.AddAzureClients(clientBuilder => { // Register clients using a config file section clientBuilder.AddSecretClient( builder.Configuration.GetSection("KeyVault")); clientBuilder.AddBlobServiceClient( builder.Configuration.GetSection("Storage")); // Register clients using a specific config key-value pair clientBuilder.AddServiceBusClientWithNamespace( builder.Configuration["ServiceBus:Namespace"]); // Register a subclient for each Azure Service Bus Queue string[] queueNames = [ "queue1", "queue2" ]; foreach (string queue in queueNames) { clientBuilder.AddClient<ServiceBusSender, ServiceBusClientOptions>( (_, _, provider) => provider.GetService<ServiceBusClient>() .CreateSender(queue)).WithName(queue); } clientBuilder.UseCredential(new DefaultAzureCredential()); // Set up any default settings clientBuilder.ConfigureDefaults( builder.Configuration.GetSection("AzureDefaults")); });
registro
Las bibliotecas cliente de Azure SDK para .NET pueden registrar operaciones de biblioteca cliente para supervisar las solicitudes y respuestas a los servicios de Azure. Las bibliotecas cliente también pueden registrar una variedad de otros eventos, incluidos reintentos, recuperación de tokens y eventos específicos del servicio de varios clientes. Al registrar un cliente de Azure SDK mediante el AddAzureClients método de extensión, AzureEventSourceLogForwarder se registra con el contenedor de inserción de dependencias. Reenvía AzureEventSourceLogForwarder
los mensajes de registro de los orígenes de eventos del SDK de Azure a ILoggerFactory para que pueda usar la configuración de registro estándar ASP.NET Core para el registro.
En la tabla siguiente se muestra cómo se asigna el elemento EventLevel
del SDK de Azure para .NET al elemento LogLevel
de ASP.NET Core. Para más información sobre estos temas y otros escenarios, consulte Registro con el SDK de Azure para .NET e inserción de dependencias con el SDK de Azure para .NET.
EventLevel de SDK de Azure |
LogLevel de ASP.NET Core |
---|---|
Critical |
Critical |
Error |
Error |
Informational |
Information |
Warning |
Warning |
Verbose |
Debug |
LogAlways |
Information |
Puede cambiar los niveles de registro predeterminados y otras opciones mediante las mismas configuraciones JSON que se describen en la sección Configuración de la autenticación . Por ejemplo, cambie el nivel de ServiceBusClient
registro a Debug
estableciendo la clave de la Logging:LogLevel:Azure.Messaging.ServiceBus
siguiente manera:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Azure.Messaging.ServiceBus": "Debug"
}
},
"AzureDefaults": {
"Diagnostics": {
"IsTelemetryDisabled": false,
"IsLoggingContentEnabled": true
},
"Retry": {
"MaxRetries": 3,
"Mode": "Exponential"
}
},
"KeyVault": {
"VaultUri": "https://<your-key-vault-name>.vault.azure.net"
},
"ServiceBus": {
"Namespace": "<your_service-bus_namespace>.servicebus.windows.net"
},
"Storage": {
"ServiceUri": "https://<your-storage-account-name>.storage.windows.net"
}
}