Övning – Använda lagrade åtkomstprinciper för att delegera åtkomst till Azure Storage

Slutförd

I stället för att skapa SASs individuellt, var och en med sina egna åtkomstbehörigheter och förfallodatum, kan du associera dem med en lagrad åtkomstprincip. Om principen ändras påverkas alla signaturer för delad åtkomst som är kopplade till den.

Nu när du vet att det finns ett bättre sätt att skapa och hantera företagets SAS. Du kan uppdatera dina nya testsidor för att använda lagrade åtkomstprinciper.

I den här övningen uppdaterar du webbappen för att skapa SAS med lagrade åtkomstprinciper. Sedan använder du Azure CLI-kommandon för att ändra principerna och testa att åtkomsten återkallas.

Lägga till en metod för att skapa lagrade åtkomstprinciper

  1. Redigera filen PatientRecordController.cs i Azure Cloud Shell.

    code ~/sas/Controllers/PatientRecordController.cs
    
  2. Längst ned i klassen, under metoden GetBlobSas, skriver du en metod för att skapa lagrade åtkomstprinciper.

    // 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. Den här metoden använder en global variabel för åtkomstprincipidentifieraren. Lägg till den här variabeln överst i klassen under deklarationen för BlobContainerClient-variabeln med namnet _container.

    private String _storedPolicyID = "patient-images-policy";
    
  4. Den lagrade åtkomstprincipen används för varje SAS-token som genereras, så anropa den nya metoden i klassens instansiering. Lägg till ett anrop längst ned i metoden.

    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. Nu kan GetBlobSas förenklas och använda åtkomstprincipen. Ändra metoden till att använda den.

     // 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. Den kod som hanterar begäranden om SAS-token behöver en liten korrigering så att den anropar den uppdaterade metoden.

    // 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. Spara dina kodändringar genom att välja Ctrl+S och sedan Ctrl+Q.

Testa den nya koden

  1. I Cloud Shell kompilerar du appen.

    cd ~/sas/
    dotnet build
    
  2. Om porten har stängts sedan du avslutade föregående övning kör curl du kommandot för att öppna den igen.

    curl -X POST http://localhost:8888/openPort/8000;
    
  3. Kör den uppdaterade webbappen.

    dotnet run
    
  4. Gå till webbappens webbadress och kontrollera att den slutar med ett snedstreck (/).

  5. På startsidan väljer du Get all patients (Hämta alla patienter).

  6. Kopiera namnet på en bildfil. Ett exempel är patient-32589.jpg.

  7. Välj menylänken External companies (Externa företag) längst upp på sidan.

  8. Klistra in bildfilnamnet i fältet Patient image filename (Namn på patientbildfil).

  9. Välj Get Key (Hämta nyckel) för att fylla SAS-token.

  10. Välj View scan (Visa skanning) för att visa bilden.

Redigera principen för lagrad åtkomst

  1. Logga in på Azure-portalen med samma autentiseringsuppgifter som du använde för att aktivera sandbox-miljön.

  2. I resursmenyn i Azure-portalen väljer du Alla resurser.

  3. I listan över resurser väljer du lagringskontot för medicinska journaler .

  4. I fönstret Översikt väljer du Containrar och sedan patientbilder.

  5. På menyn patientbilder går du till Inställningar och väljer Åtkomstprincip.

  6. Observera att webbappen har skapat den lagrade åtkomstprincipen patient-images-policy.

  7. Till höger väljer du menyn ... och väljer sedan Redigera från popup-menyn.

  8. I redigera-principen ändrar du Behörighet från läs till lista och väljer OK för att bekräfta.

  9. Välj Spara på patientbilderna | Fönstret Åtkomstprincip .

Testa en ny SAS

  1. Gå tillbaka till din webbapp. På sidan External companies (Externa företag) skapar du en ny SAS-token genom att välja Hämta nyckel.

  2. Välj View scan (Visa skanning).

    Screenshot of the web app failing to view a patient image.

Avbildningen returneras inte från Azure Storage och du får ett 403-autentiseringsfel.