Azure Sdk For Net

La librería Azure Sdk For Net nos permite realizar operaciones en C# sobre Azure; idénticamente a las que haríamos en el Portal de Azure. Esta libreria es el código fuente de los paquetes de Nuget Microsoft.Azure.Management.*.

Autenticación en la librería

Hay dos opciones para autenticarse para gestionar los recursos de Azure:

  • Con certificados (ASM): Únicamente funciona para recursos del Portal de Azure clásico.
  • Mediante el Directorio Activo de Azure (ARM): Accediendo vía credencial de usuario o aplicación.

Utilizaremos la segunda opción por ser la mayor proyección y futuro 😉

  • 1.- En nuestra aplicación de directorio activo añadir los permisos necesarios para acceder Windows Azure Service Management API.
  • 2.- Dar derecho en la Subscripción para acceder medinante la aplicación, previo registro previo de la aplicación en el tenant.
  • 3.- Obtener el token de Acceso a la librería. Mediante una credencial de usuario:
                var user = "usuario@contoso.com";
                var password = "password" 
                var guidApplication = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"; //App Nativa
                UserCredential userCredentials = new UserCredential(user, password);
                var addAuthority = new UriBuilder("https://login.microsoftonline.com/")
                {
                    Path = "common"
                };
                AuthenticationContext authContext = new AuthenticationContext(addAuthority.Uri.AbsoluteUri);
    
                AuthenticationResult userAuthResult = authContext.AcquireToken(
                    "https://management.core.windows.net/",
                    guidApplication,
                    userCredentials);
                var token = userAuthResult.CreateAuthorizationHeader().Substring("Bearer ".Length);
                var credentials = new TokenCloudCredentials(subscriptionId, token);
    

    o mediante una credencial de aplicación:

                var applicationId= "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx";  //App Nativa o Web
                var clientSecret = "password" 
                var clientCredential = new ClientCredential(applicationId,clientSecret);
                var addAuthority = new UriBuilder("https://login.microsoftonline.com/")
                {
                    Path = domain
                };
                AuthenticationContext authContext = new AuthenticationContext(addAuthority.Uri.AbsoluteUri);
    
                AuthenticationResult userAuthResult = authContext.AcquireToken(
                    "https://management.core.windows.net/",
                    clientCredential);
                var token = userAuthResult.CreateAuthorizationHeader().Substring("Bearer ".Length);
                var credentials = new TokenCloudCredentials(subscriptionId, token);
    

Uso de la librería

Como ejemplo de gestión de un recurso de Azure; vamos a usar la parte la parte de la librería que gestiona el Azure Automation que describimos en una entrada anterior. Esta parte corresponde al paquete de Nuget Microsoft.Azure.Management.Automation.

//Obtenemos la lista de RunBooks
var client = new AutomationManagementClient(credentials);
var runbooksList = automationClient.Runbooks.List("ResourceName", "AutomationAccount");
Anuncios
Publicado en Azure, Desarrollo | Etiquetado , | Deja un comentario

Graph Api y Autenticación

Graph Api

La librería Azure Active Directory Graph API permite realizar operaciones sobre los objetos existentes en el directorio activo.

  • Operaciones sobre Usuarios y Contactos (Usuarios Externos): Leer información de perfil así como actualizarla, creación y eliminación.
  • Operaciones sobre Roles, Grupos o Aplicaciones: creación, modificación y eliminación.
  • Operaciones sobre Dominios y Políticas.

Autenticación en Graph Api

En la entrada anterior Glosario de Directorio Activo Azure se describió la configuración de aplicaciones en el directorio activo. En esta entrada se va describir
diferentes maneras de obtener los token de autenticación vía las aplicaciones para poder realizar llamadas a la Graph Api. Existen diversas posibilidades:

  • Aplicación Nativa con Credenciales de Usuario:
                var appId = [Id of Application Native];
                var user = [User Id of AD];
                var password= [User Password of AD];
                var tenantId = [Id of AD];
                UserCredential userCredentials = new UserCredential(user, password);
                var addAuthority = new Uri(new Uri("https://login.microsoftonline.com/"), tenantId);
                AuthenticationContext authContext = new AuthenticationContext(addAuthority.AbsoluteUri);ddAuthority.Uri.AbsoluteUri);
                AuthenticationResult userAuthResult = authContext.AcquireToken(
                    "https://graph.windows.net",
                    appId,
                    userCredentials);
                Uri serviceRoot = new Uri(new Uri("https://graph.windows.net"), userTenantId);
                ActiveDirectoryClient userAdClient = new ActiveDirectoryClient(serviceRoot, async () => await Task.FromResult(userAuthResult.AccessToken));
    
  • Aplicación Nativa solicitando usuario y contraseña en una ventana del Navegador.
                var appId = [Id of Application Native];
                var returnUrl = [returnUrl of Aplication Web Native]
                var tenantId = [Id of AD];
                var addAuthority = new Uri(new Uri("https://login.microsoftonline.com/"), tenantId);
                AuthenticationContext authContext = new AuthenticationContext(addAuthority.AbsoluteUri);
                AuthenticationResult userAuthResult = authContext.AcquireToken(
                    "https://graph.windows.net",
                    appId,
                    new Uri(returnUrl)
                 );
                Uri serviceRoot = new Uri(new Uri("https://graph.windows.net"), userTenantId);
                ActiveDirectoryClient userAdClient = new ActiveDirectoryClient(serviceRoot, async () => await Task.FromResult(userAuthResult.AccessToken));</li>
    
  • Aplicación Web App/Web Api con Credenciales de Aplicación
                var appId = [Id of Aplication Web App];
                var appSecret = [Secret of Application Web App];
                var tenantId = [Id of AD];
                var clientCredential = new ClientCredential(appId, appSecret);
                var addAuthority = new Uri(new Uri("https://login.microsoftonline.com/"), tenantId);
                AuthenticationContext authContext = new AuthenticationContext(addAuthority.AbsoluteUri);
                AuthenticationResult userAuthResult = authContext.AcquireToken(
                    "https://graph.windows.net",
                    clientCredential);
                Uri serviceRoot = new Uri(new Uri("https://graph.windows.net"), tenantId);
                ActiveDirectoryClient userAdClient = new ActiveDirectoryClient(serviceRoot, async () => await Task.FromResult(userAuthResult.AccessToken));
    

Uso Grap Api

La Graph es una Api Rest que podemos acceder mediante llamadas HTTP con la cookie de Authorization (Bearer Token). En nuestro caso usamos un .NET Client Library que encapsula estas llamadas.
Por ejemplo obtenemos los roles y grupos de un usuario.

var userMemberships = userAdClient.Users.GetByObjectId(UserObjectId).MemberOf.ExecuteAsync().Result;
Publicado en Azure, Seguridad | Deja un comentario

Que es un token web?

Que es un token Web?

Al autenticarnos en un proveedor de identidad, se genera un token. Este token es como una llave que nos permite acceder a servicios. El token Web esta ideado para acceder a servicios Web.

Estructura de un token Web

Este token esta compuesto de 3 cadenas en base64 separadas por puntos con el objetivo de ser compacto y compatible con el formato de Url. Estas 3 cadenas corresponden a 3 bloques:

  • Cabecera: Es un objecto Json que contiene la información del toquen.
    • alg: El algoritmo utilizado para encriptar/descencriptar la firma del token. El RS256 es el asimétrico y el HS256 es el simétrico.
    • typ: tipo del token, normalemente JWT.
  • Datos: Es un objecto Json que tiene la información que transmite el token. Esta parte se suele conocer como el conjunto de Claims. Hay unas claims reservadas que son estandards pero podemos añadir las nuestras.
    • iis/(Issuer): quien genera el token.
    • exp (Expiration): el tiempo que es valido el token.
    • sub (Subject): subconjunto con claims que identifican al usuario y su rol.
    • aud (Audience): indica la servicio web que quiere ser accedido.
  • Firma: Es un hash que nos permite validar el token y asegurar que la información contenida en el mismo no ha sido manipulada.

Para ampliar información, hay una especificación detallada.

Ejemplo de Creación de token en NET en el proveedor de Identidad

Utilizando el algoritmo de clave Simetrica.

public String GetToken()        {
var secretKey = "[Insertar el Password]"
var signingKey = new InMemorySymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
var signingCredentials = new SigningCredentials(signingKey,
SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest);
var claimsIdentity = new ClaimsIdentity(new List<Claim>()
{
	new Claim(ClaimTypes.NameIdentifier, "AutoritherUser"),
	new Claim(ClaimTypes.Role, "Author"),
}, "Custom");

var now = DateTime.UtcNow;
var securityTokenDescriptor = new SecurityTokenDescriptor()
{
	AppliesToAddress = "https://servicio.accedido.com",
	TokenIssuerName = "https://provedoor.token.com",
	Subject = claimsIdentity,
	SigningCredentials = signingCredentials,
};
var tokenHandler = new JwtSecurityTokenHandler();
var plainToken = tokenHandler.CreateToken(securityTokenDescriptor);
var signedAndEncodedToken = tokenHandler.WriteToken(plainToken);
return  signedAndEncodedToken;
}

Ejemplo de Validación del token en NET en el servicio web

public void SecurizeApi(String signedAndEncodedToken)      {
            // https://vosseburchttechblog.azurewebsites.net/index.php/2015/09/19/generating-and-consuming-json-web-tokens-with-net/
try
{

	var secretKey = "[Insertar el Password]"   //Debe se la misma que en el ejemplo anterior.
	var signingKey = new InMemorySymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
	var tokenValidationParameters = new TokenValidationParameters()
	{
		ValidAudiences = new string[]
		{
		 "https://servicio.accedido.com"
		},
		ValidIssuers = new string[]
		{
		"https://provedoor.token.com"
		},
		IssuerSigningKey = signingKey,
	};
	var tokenHandler = new JwtSecurityTokenHandler();
	SecurityToken validatedToken;
	tokenHandler.ValidateToken(signedAndEncodedToken,
		tokenValidationParameters, out validatedToken);
}
catch (Exception)
{
	throw new HttpException(403, "You don't have access to this resource.");
};
}

Servicios Utiles

Publicado en net, Seguridad | Etiquetado , | Deja un comentario

Librerías para Mostrar de Graficas para aplicaciones Web

Hay diferentes librerías que se basan dos tags de HTML:

  • Svg: se insertan tags de XML en el tag que generan el gráfico. Permite una mayor interacción y escala automáticamente.
  • Canvas: se ejecutan javascripts sobre el dom del tag para generar el gráfico. Ofrece mejor rendimiento en gráficos complejos.

chartjsChart.js

Esta librería Canvas de código abierto que su principal ventaja es su fácil uso. Es bastante reciente por lo que aun no incorpora muchos tipos de gráficos y las múltiples configuraciones que presentan otras librerías (múltiples ejes, visualización de información en el interior de los gráficos…).

Google Charts

Esta librería Svg es muy completa; incluye más de 25 tipos de gráficos con múltiples configuraciones. El principal problema es que la librería debe ser cargada desde los servidores de Google y además se envían datos a Google para la generación de los gráficos que pueden ser incluso accedidos por terceros. Aunque esta permitido usarla en entornos empresariales; puede ser que el nivel de confidencialidad y privacidad de los datos nos imposibilite su uso.

highchartsHighcharts

Esta librería Svg es la más completa entre las analizadas permitiendo incluso combinar diferentes tipos de gráficos en uno solo. Añade ademas una funcionalidad interesante que es la posibilidad de poder guardar el gráfico en formato PDF, JPG, PNG o SVG. Su uso sólo es gratuito para fines no comerciales.

d3D3.js

Esta librería Svg de código abierto que permite realizar múltiples gráficos. Esta librería es la que usa PowerBI. Es una librería esta más orientada a realizar gráficos más que a usar diferentes tipos de gráficos; por lo que permite realizar los tipos de gráficos más espectaculares. Pero su uso es muy complejo y requiere de una gran curva de aprendizaje. Hay múltiples plugins con tipos de gráficos que basan esta librería que permiten su uso de una manera más adecuada. Algunos ejemplos de plugins:

  • Tipo de gráfico de series temporales: Metricsgraphics.js.
  • Varios tipos de gráficos orientados a gráficas en tiempo real: Epoch.
  • Varios tipos de gráficos para usar directamente en Angular: Angular-nvD3
  • Tipo de gráfico de pie: d3pie. En la actualidad no esta claro su futuro; pero posee un asistente que nos genera automáticamente el código.

Además podemos crear plugins gráficos para usarlos en PowerBI basados en la librería.

Publicado en Desarrollo, javascript, web | Etiquetado | Deja un comentario

Ejecución de scripts de PowerShell en Azure Automation y Backup de SQL Azure

Que es Azure Automation?

azureautomationAzure Automation es un servicio que permite realizar procesos contra recursos de Azure. Esto nos permite automatizar tareas que realizamos con frecuencia. Las tareas que queremos automatizar en Azure Automation se llaman RunBooks. Las tareas se realizan mediante comandos de PowerShell.
El RunBook puede ser principalmente de dos tipos:

  • PowerShell: Directamente el script de PowerShell.
  • Graphical: Editor gráfico que permite ir construyendo el script PowerShell.

Pasos para crear nuestra tarea en Azure Automation

  • Crear Automation Account

    Crear Automation Account

    1.- Crear el Azure Automation.
  • 2.- Crear el RunBook.
  • 3.- Editar y añadir nuestro script de PowerShell. Podemos probarlo en el Test Pane
  • 4.- Publicar el RunBook.
  • 5.- Una vez publicado; podemos programarlo para ejecutarlo periódicamente Schedule o ejecutarlo a demanda mediante un Webhook. Un Webhook es una url a la cual realizamos un post y permite lanzar la ejecución del RunBook.
    Crear RunBook

    Crear RunBook

Ejecución de Scripts de PowerShell en entorno de Azure Automation

En el nuevo portal de Azure se utiliza un nuevo modelo de API AzureRM para trabajar con los recursos de Azure. Este API es bastante parecida al anterior aunque suelen cambiar los parámetros de las funciones. Para logarse y poder utilizar los comandos de PowerShell; a continuación se muestran los nuevos comandos que lo posibilitan.

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Select-AzureRmSubscription -SubscriptionId $SubscriptionId

Se actualizado el script que realiza un backup de SQL Azure, con la nueva API 🙂

$ResourceGroupName = "jobs"     #Nombre del Resource Group
$serverName = "sqlserver"  #Nombre del Servidor de Sql
$databaseOriginal = "db"   #Nombre de la base de datos a realizar el backup
$databaseCopy = "dbCopy" #Nombre de la base de datos temporal usada para realizar el backup
$storageUrl = "https://{storageaccountname}.blob.core.windows.net/{containername}/"   #Url del storage donde poner el backup
$storageKey = "sadfsdafsdaf"  #Secret Key del Storage
$SubscriptionId = "dadd4a7b-2345-31dd-ba34-abc1774513c3"   #Identificador de la subscripcion
$databaseLogin = "login"  #Login del usuario del SQL
$databasePassword="passowrd"  #Contraseña del usuario de SQL

Write-Output -inputobject "Backuping Database..."

Write-Output -inputobject "Authenticating..." 
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Select-AzureRmSubscription -SubscriptionId $SubscriptionId
Write-Output -inputobject "Authenticated"

Write-Output -inputobject "CopyDatabase..." 
New-AzureRmSqlDatabaseCopy -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseOriginal -CopyDatabaseName $databaseCopy
do
{
    sleep -Seconds 10
    $status = Get-AzureRmSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy
    $exist = $status.Status
}
while ($exist -ne 'Online')
Write-Output -inputobject "Copy Database Completed"

$now=Get-Date -format 'yyyyMMdd_HHmmss'
$storageBlobName = "BackupOf" + $databaseOriginal + $now + ".bacpac"
$storageUrl = $storageUrl + $storageBlobName
    
                   
$databaseSecurePassword =  ConvertTo-SecureString -String $databasePassword -asPlainText -Force                   
$exportRequest = New-AzureRmSqlDatabaseExport -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy -AdministratorLogin $databaseLogin -AdministratorLoginPassword $databaseSecurePassword -StorageKey $storageKey -StorageUri $storageUrl -StorageKeyType "StorageAccessKey"   
Write-Output -inputobject "Exporting to Bacpac..."
do
{
    sleep -Seconds 10
    $statusExport = Get-AzureRmSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
    $status = $statusExport.Status
}
while ($status -ne 'Succeeded')
Write-Output -inputobject "Export to Bacpac Completed" 
Write-Output -inputobject "Delete CopyDatabase..."
Remove-AzureRmSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy -Force
Write-Output -inputobject "Backup de Database Completed"
 
Write-Output "The backup is on this url:"
Write-Output "https://"$StorageAccountName".blob.core.windows.net/"$storageContainerName"/"$storageBlobName".bacpac"

Problema de Versión

Al ejecutar puede ser que os encontréis un error de comando no reconocido error. Este error es debido a que no tenemos disponible la ultima versión de AzureRM.

New-AzureRmSqlDatabaseExport : The term 'New-AzureRmSqlDatabaseExport' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the 
path is correct and try again.

Se describen los pasos para actualizar a la ultima versión de PowerShell:

  • 1.- Añadir el modulo ModulesInAutomationToLatestVersion que contiene el comando PowerShell que permite migrar a la ultima versión de la API AzureRM y importarlo en nuestro Azure Automation.
    Búsqueda del Modulo ModulesInAutomationToLatestVersion

    Búsqueda del Modulo ModulesInAutomationToLatestVersion


    Importar Modulo ModulesInAutomationToLatestVersion

    Importar Modulo ModulesInAutomationToLatestVersion

  • 2.- La importación nos ha creado un nuevo RunBook con el nombre Update-ModulesInAutomationToLatestVersion. Nos vamos al Test Pane del RunBook (tras editar y salvar ;-)). Aquí introducimos los parámetros que se nos solicitan:
    • RESOURCEGROUPNAME: El grupo que tiene nuestro Azure Automation.
    • AUTOMATIONACCOUNTNAME: Nombre de la cuenta de Azure Automation.
    • NEWMODULENAME: Nombre del Modulo que queremos subir a la ultima versión.

    OJO: Rellanar todos los parámetros, ya que sino afectaríamos a todos los Azure Automation.

    Upgrating modules

    Upgrating modules

Publicado en Azure, Sql Azure | 2 comentarios

Glosario de Directorio Activo Azure II

En esta entrada vamos a explicar los pasos para dar permisos delegados en una aplicación para acceder a apis que interactuan con una suscripción. Por ejemplo para acceder Azure Resource RateCard API o Azure Resource Usage API .

  • 1.- Crear la aplicación en la Directorio Activo de Azure.
    1-newapplication
  • 2.- Indicamos en la aplicación requiere de los permisos delegados para acceder a la Api.
    newpermisionwindowsazureservicemanagementapi1
    newpermisionwindowsazureservicemanagementapi2
  • 3.- Creamos la clave de acceso a la aplicación.
    newkey
  • 4.- Ahora nos posicionamos en la suscripción que va a ser usada para que la api interactua. Dentro de la subscripción vamos a configurar los derechos de acceso.
    accesrightstosubscription
  • 5.- Concedemos el derecho necesario, en nuestro caso de lectura
    accesrightstosubscription2
  • 6.- Buscamos la aplicación que hemos dado de alta en el directorio activo (buscarla por Guid, por nombre no va muy bien :-().
    accesrightstosubscription3
Publicado en Azure, Seguridad | Deja un comentario

Glosario de Azure Web App

En esta entrada se describen operativas relacionadas con Web Apps.

1.- Deployment Slot

En un nivel de servicio Standard o Premium , se permite crear entornos de desarrollo a nuestra Web App. Esto nos posibilita:

  • Testear la aplicación.
  • Permite subir a esteo entorno y realizar el swap o cambio a producción sin perdida de servicio (se automatiza con Auto Swap).

Los pasos son:

  • 1.- Crear el Slotaddslot
  • 2.- Copiar la configuración de otro entorno, así no tenemos que volver a configurar el nuevo entorno.

Cuando se realiza el swap o cambio hay configuraciones que se mueven de un entorno:

  • General settings como el framework version, 32/64-bit, Web sockets
  • App settings (Se puede bloquear para que no se mueva con el check Slot setting en el App Settings)
  • Connection strings (Se puede bloquear para que no se mueva con el check Slot setting en el App Settings)
  • Handler mappings
  • Monitoring and diagnostic settings
  • WebJobs content

Hay otra configuraciones que no se mueven:

  • Publishing endpoints
  • Custom Domain Names
  • SSL certificates and bindings
  • Scale settings
  • WebJobs schedulers

2.- Configurar SSL

  • 1- Dar de alta el dominio. Para ello debemos apuntar al CNAME del dominio de nuestra Web Appaltadominio
  • 2.- Dar de alta el Binding (como haríamos en el IIS). Subimos el certificado y lo bindeamos con el hostname del dominio.binding

Enlaces de Interes Web App

Publicado en Azure, web | Deja un comentario