Exercício – Utilizar políticas de acesso armazenadas para delegar o acesso ao Armazenamento do Azure

Concluído

Em vez de criar SASs individualmente, cada um com suas próprias permissões de acesso e datas de validade, você pode associá-los a uma política de acesso armazenado. Alterar a política afeta todas as SASs associadas à mesma.

Agora que você já sabe que existe uma maneira melhor de criar e gerenciar os SASs da sua empresa. Pode atualizar as novas páginas de teste para utilizarem políticas de acesso armazenadas.

Neste exercício, você atualiza seu aplicativo Web para criar SASs com políticas de acesso armazenadas. Em seguida, use os comandos da CLI do Azure para alterar as políticas e testar se o acesso foi revogado.

Adicionar um método para criar políticas de acesso armazenadas

  1. No Azure Cloud Shell, edite o ficheiro PatientRecordController.cs.

    code ~/sas/Controllers/PatientRecordController.cs
    
  2. Na parte inferior da classe, por baixo do método GetBlobSas, escreva um método para criar políticas de acesso armazenadas.

    // 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 utiliza uma variável global para o identificador da política de acesso. Adicione esta variável na parte superior da classe por baixo da declaração para a variável BlobContainerClient denominada _container.

    private String _storedPolicyID = "patient-images-policy";
    
  4. A política de acesso armazenada será utilizada para cada token de SAS que é gerado, pelo que liga ao novo método nas instâncias de classe. Adicione uma chamada no final do 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. GetBlobSas pode agora ser simplificado para utilizar a política de acesso. Altere o método para o utilizar.

     // 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. O código que processa os pedidos de token de SAS precisa de uma pequena correção para ligar ao método atualizado.

    // 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. Guarde as alterações ao código ao premir Ctrl+S e, em seguida, Ctrl+Q.

Testar o novo código

  1. Crie a aplicação no Cloud Shell.

    cd ~/sas/
    dotnet build
    
  2. Caso a porta tenha fechado desde que você terminou o exercício anterior, execute o curl comando para abri-la novamente.

    curl -X POST http://localhost:8888/openPort/8000;
    
  3. Execute a aplicação Web atualizada.

    dotnet run
    
  4. Aceda ao URL da aplicação Web e certifique-se de que este termina com uma barra (/).

  5. Na home page, selecione Obter todos os pacientes.

  6. Copie o nome de ficheiro de uma imagem. Por exemplo, patient-32589.jpg.

  7. Selecione a ligação do menu External companies (Empresas externas) na parte superior da página.

  8. Cole o nome do ficheiro de imagem no campo Nome do ficheiro de imagem do paciente.

  9. Selecione Obter Chave para popular o token de SAS.

  10. Selecione Ver digitalização para ver a imagem.

Editar a política de acesso armazenada

  1. Entre no portal do Azure usando as mesmas credenciais que você usou para ativar a área restrita.

  2. No menu de recursos do portal do Azure, selecione Todos os recursos.

  3. Na lista de recursos, selecione a conta de armazenamento de registros médicos.

  4. No painel Visão geral, selecione Contêineres e, em seguida, selecione imagens do paciente.

  5. No menu de imagens do paciente, em Configurações, selecione Política de acesso.

  6. Repare que a sua aplicação Web criou uma política de acesso armazenada patient-images-policy.

  7. À direita, selecione o menu ... e, em seguida, selecione Editar no menu de pop-up.

  8. Na política de edição, altere a lista Permissão de leitura para e selecione OK para confirmar.

  9. Selecione Salvar nas imagens do paciente | Painel de política de acesso.

Testar uma nova SAS

  1. Volte à aplicação Web. Na página External companies (Empresas externas), crie um novo token de SAS ao selecionar Get Key (Obter Chave).

  2. Selecione View scan (Ver digitalização).

    Captura de ecrã a mostrar a aplicação Web com um erro para ver uma imagem de paciente.

A imagem não é retornada do Armazenamento do Azure e você recebe um erro de autenticação 403.