Ejercicio: Uso de directivas de acceso almacenadas para delegar el acceso a Azure Storage

Completado

En lugar de crear SAS individualmente, cada una con sus propios permisos de acceso y fechas de expiración, puede asociarlas a una directiva de acceso almacenada. El cambio de directiva afecta a todas las SAS asociadas que tenga.

Ahora ya sabe que hay una manera mejor de crear y administrar las SAS de la empresa. Puede actualizar las nuevas páginas de prueba para usar directivas de acceso almacenadas.

En este ejercicio, actualizará la aplicación web para crear SAS con directivas de acceso almacenadas. Luego, usará comandos de la CLI de Azure para cambiar las directivas y probar que se ha revocado el acceso.

Adición de un método para crear directivas de acceso almacenadas

  1. En Azure Cloud Shell, edite el archivo PatientRecordController.cs.

    code ~/sas/Controllers/PatientRecordController.cs
    
  2. En la parte inferior de la clase, en el método GetBlobSas, escriba un método para crear directivas de acceso almacenadas.

    // Use a stored access policy for the SAS
    private void CreateStoredAccessPolicy()
    {
        // Create a stored access policy for our blobs
        BlobSignedIdentifier identifier = new BlobSignedIdentifier
        {
            Id = _storedPolicyID,
            AccessPolicy = new BlobAccessPolicy
            {
                ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
                Permissions = "r"
            }
        };
    
        _container.SetAccessPolicy(permissions: new BlobSignedIdentifier[] { identifier });
    } 
    
  3. Este método usa una variable global como identificador de directiva de acceso. Agregue esta variable en la parte superior de la clase en la declaración de la variable BlobContainerClient denominada _container.

    private String _storedPolicyID = "patient-images-policy";
    
  4. La directiva de acceso almacenada se usa para cada token de SAS que se genere, por lo que debe llamar al método nuevo al crear las instancias de clase. Agregue una llamada en la parte inferior del método.

    public PatientRecordsController(ILogger<PatientRecordsController> logger, IConfiguration iconfiguration)
    {
        _logger = logger;
        _iconfiguration = iconfiguration; 
        _container = new BlobContainerClient(
            _iconfiguration.GetValue<string>("StorageAccount:ConnectionString"),
            _iconfiguration.GetValue<string>("StorageAccount:Container")
        );
        CreateStoredAccessPolicy();
    }
    
  5. Ahora se puede simplificar GetBlobSas para usar la directiva de acceso. Cambie el método para usarlo.

     // Build a SAS token for the given blob
     private string GetBlobSas()
     {
         // Create a user SAS that only allows reading for a minute
         BlobSasBuilder sas = new BlobSasBuilder 
         {
             Identifier = _storedPolicyID,
             BlobContainerName = _iconfiguration.GetValue<string>("StorageAccount:Container")
         };
    
         // Use the shared key to access the blob
         var storageSharedKeyCredential = new StorageSharedKeyCredential(
             _iconfiguration.GetValue<string>("StorageAccount:AccountName"),
             _iconfiguration.GetValue<string>("StorageAccount:AccountKey")
         );
    
         return '?' + sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();
     }
    
  6. El código que controla las solicitudes de token de SAS necesita una pequeña corrección para llamar al método actualizado.

    // GET PatientRecord/patient-nnnnnn/secure
    [HttpGet("{Name}/{secure}")]
    public PatientRecord Get(string name, string flag)
    {
        BlobClient blob = _container.GetBlobClient(name);
        return new PatientRecord { name=blob.Name, imageURI=blob.Uri.AbsoluteUri, sasToken=GetBlobSas() };
    }
    
  7. Para guardar los cambios en el código, presione Ctrl+S y después Ctrl+Q.

Prueba del código nuevo

  1. En Cloud Shell, compile la aplicación.

    cd ~/sas/
    dotnet build
    
  2. En caso de que el puerto se haya cerrado desde que terminó el ejercicio anterior, ejecute el comando curl para abrirlo de nuevo.

    curl -X POST http://localhost:8888/openPort/8000;
    
  3. Ejecute la aplicación web de actualización.

    dotnet run
    
  4. Vaya a la dirección URL de la aplicación web y asegúrese de que termina en una barra diagonal (/).

  5. En la página principal, seleccione Get all patients (Obtener todos los pacientes).

  6. Copie un nombre de archivo de imagen. Un ejemplo es patient-32589.jpg.

  7. Seleccione el vínculo del menú External companies (Empresas externas) en la parte superior de la página.

  8. Pegue el nombre de archivo de imagen en el campo Patient image filename (Nombre del archivo de imagen de paciente).

  9. Seleccione Obtener clave para rellenar el token de SAS.

  10. Seleccione View scan (Ver examen) para ver la imagen.

Edición de la directiva de acceso almacenada

  1. Inicie sesión en Azure Portal con las mismas credenciales que ha usado para activar el espacio aislado.

  2. En el menú de recursos de Azure Portal, seleccione Todos los recursos.

  3. En la lista de recursos, seleccione la cuenta de almacenamiento medical-records.

  4. En el panel Información general, seleccione Contenedores y luego patient-images.

  5. En el menú de imágenes de pacientes, en Configuración, seleccione Directiva de acceso.

  6. Tenga en cuenta que la aplicación web ha creado una directiva de acceso almacenada patient-images-policy.

  7. A la derecha, seleccione el menú ... y luego elija Editar en el menú emergente.

  8. En Editar directiva, cambie el valor de Permiso de lectura a lista y seleccione Aceptar para confirmar.

  9. Seleccione Guardar en el panel patient-images | Directiva de acceso.

Prueba de una nueva SAS

  1. Vuelva a la aplicación web. En la página External companies (Empresas externas), seleccione Obtener clave para crear un token de SAS.

  2. Seleccione View scan (Ver examen).

    Captura de pantalla de la aplicación web que no puede ver una imagen de paciente.

Azure Storage no devuelve ka imagen y el usuario obtiene un error de autenticación 403.