Ćwiczenie — Delegowanie dostępu do usługi Azure Storage przy użyciu zapisanych zasad dostępu

Ukończone

Zamiast tworzyć indywidualnie usługi SAS, każdy z własnymi uprawnieniami dostępu i datami wygaśnięcia, można je skojarzyć z zapisanymi zasadami dostępu. Zmiana zasad wpływa na wszystkie skojarzone z nimi sygnatury dostępu współdzielonego.

Teraz, gdy już wiesz, że istnieje lepszy sposób tworzenia usług SAS firmy i zarządzania nimi. Możesz zaktualizować nowe strony testowe w celu korzystania z zapisanych zasad dostępu.

W tym ćwiczeniu zaktualizujesz aplikację internetową, aby utworzyć usługi SAS z zapisanymi zasadami dostępu. Następnie użyjesz poleceń interfejsu wiersza polecenia platformy Azure, aby zmienić zasady i przetestować, czy dostęp zostanie odwołany.

Dodawanie metody w celu tworzenia zapisanych zasad dostępu

  1. W usłudze Azure Cloud Shell edytuj plik PatientRecordController.cs.

    code ~/sas/Controllers/PatientRecordController.cs
    
  2. U dołu klasy, w obszarze metody GetBlobSas, napisz metodę, aby utworzyć zapisane zasady dostępu.

    // 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. Ta metoda używa zmiennej globalnej na potrzeby identyfikatora zasad dostępu. Dodaj tę zmienną w górnej części klasy poniżej deklaracji dla zmiennej BlobContainerClient o nazwie _container.

    private String _storedPolicyID = "patient-images-policy";
    
  4. Zapisane zasady dostępu są używane dla każdego wygenerowanego tokenu SAS, więc wywołaj nową metodę podczas tworzenia wystąpienia klasy. Dodaj wywołanie u dołu metody.

    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. Teraz można uprościć metodę GetBlobSas w celu korzystania z zasad dostępu. Zmień metodę, aby ich używała.

     // 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. Kod obsługujący żądania tokenów SAS wymaga niewielkiej poprawki w celu wywoływania zaktualizowanej metody.

    // 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. Zapisz zmiany kodu, wybierając klawisze Ctrl+S, a następnie wybierając klawisze Ctrl+Q.

Testowanie nowego kodu

  1. Skompiluj aplikację w usłudze Cloud Shell.

    cd ~/sas/
    dotnet build
    
  2. Jeśli port został zamknięty od zakończenia poprzedniego ćwiczenia, uruchom curl polecenie , aby otworzyć go ponownie.

    curl -X POST http://localhost:8888/openPort/8000;
    
  3. Uruchom zaktualizowaną aplikację internetową.

    dotnet run
    
  4. Przejdź do adresu URL aplikacji internetowej i upewnij się, że kończy się on ukośnikiem (/).

  5. Na stronie głównej wybierz pozycję Get all patients (Pobierz wszystkich pacjentów).

  6. Skopiuj nazwę pliku obrazu. Przykład takiej nazwy to patient-32589.jpg.

  7. Wybierz link menu External companies (Firmy zewnętrzne) w górnej części strony.

  8. Wklej nazwę pliku obrazu w polu Patient image filename (Nazwa pliku obrazu pacjenta).

  9. Wybierz pozycję Get Key (Pobierz klucz), aby wypełnić token SAS.

  10. Wybierz pozycję View scan (Wyświetl skan), aby wyświetlić obraz.

Edytowanie zapisanych zasad dostępu

  1. Zaloguj się do witryny Azure Portal przy użyciu tych samych poświadczeń, które były używane do aktywowania piaskownicy.

  2. W menu zasobów witryny Azure Portal wybierz pozycję Wszystkie zasoby.

  3. Na liście zasobów wybierz konto magazynu dokumentacji medycznej.

  4. W okienku Przegląd wybierz pozycję Kontenery, a następnie wybierz pozycję patient-images.

  5. W menu obrazów pacjentów w obszarze Ustawienia wybierz pozycję Zasady dostępu.

  6. Zwróć uwagę, że aplikacja internetowa utworzyła zapisane zasady dostępu patient-images-policy.

  7. Po prawej stronie wybierz menu ..., a następnie wybierz pozycję Edytuj w menu podręcznym.

  8. W obszarze Edytuj zasady zmień uprawnienie z odczytu na listę i wybierz przycisk OK, aby potwierdzić.

  9. Wybierz pozycję Zapisz na obrazach pacjentów | Okienko zasad dostępu.

Testowanie nowych sygnatur dostępu współdzielonego

  1. Wróć do swojej aplikacji internetowej. Na stronie External companies (Firmy zewnętrzne) utwórz nowy token SAS, wybierając pozycję Get Key (Pobierz klucz).

  2. Wybierz pozycję View scan (Wyświetl skan).

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

Obraz nie jest zwracany z usługi Azure Storage i występuje błąd uwierzytelniania 403.