Alıştırma - Paylaşılan erişim imzalarını kullanarak Azure Depolama’ya temsilci erişimi verme

Tamamlandı

Azure Depolama paylaşılan anahtarla, paylaşılan erişim imzasıyla (SAS) veya Microsoft Entra Kimliği aracılığıyla dosyalara erişim yetkisi vermenizi sağlar. SAS ile istemcinin dosyalarla ne yapabileceğini ve ne kadar süreyle yapabileceğini denetlersiniz.

Şirketinizin görüntü tanı sistemi hasta görüntülerine paylaşılan anahtar yoluyla dahili olarak erişiyor. Üçüncü tarafların tanılama görüntülerine erişmesine izin vermek için bir API oluşturmanız gerekir. Sas'nin üçüncü taraf istemcilere güvenli erişim vermenize nasıl yardımcı olabileceğini görmek için web uygulamanızda bir test sayfası oluşturursunuz.

Bu alıştırmada bir depolama hesabı oluşturacak ve bazı örnek hasta görüntülerini karşıya yükleyebilirsiniz. Ekibinizin mevcut web uygulamasını dağıtıp depolama alanına erişebildiğini test edebilirsiniz. Son adımda görüntüleri güvenli bir şekilde görmek üzere isteğe bağlı SAS belirteci oluşturmak için C# ve JavaScript kodu ekleyeceksiniz.

Screenshot of your company's patient diagnostic image system showing three images.

Depolama hesabı oluşturma ve görüntüleri karşıya yükleme

  1. Azure Cloud Shell'i kullanarak hasta görüntüleri için bir depolama hesabı oluşturmak üzere aşağıdaki kodu girin. Kod bir depolama hesabı adı oluşturur.

    export STORAGENAME=medicalrecords$RANDOM
    
    az storage account create \
        --name $STORAGENAME \
        --access-tier hot \
        --kind StorageV2 \
        --resource-group "<rgn>[sandbox resource group name]</rgn>"
    
  2. Görüntüleri depolamak için depolama hesabı altında bir kapsayıcı oluşturun.

    az storage container create \
        --name patient-images \
        --account-name $STORAGENAME \
        --public-access off
    
  3. Ekibinizin mevcut web uygulamasını kopyalayın. Bu depo, ekibiniz tarafından test için kullanılan örnek görüntüleri içerir.

    git clone https://github.com/MicrosoftDocs/mslearn-control-access-to-azure-storage-with-sas.git sas
    
  4. Görüntüleri depolama hesabınıza yüklemek için Azure CLI upload-batch komutunu kullanın.

    az storage blob upload-batch \
        --source sas \
        --destination patient-images \
        --account-name $STORAGENAME \
        --pattern *.jpg
    

Hasta tanı görüntü sistemini test etme

  1. Depolama hesabınız için bağlantı dizesi ekleyebilmemiz için appsettings.json dosyasını kod düzenleyicisinde açın.

    code sas/appsettings.json
    
  2. Cloud Shell'de, depolama hesabınıza bağlantı dizesi almak için aşağıdaki kodu girin.

    az storage account show-connection-string --name $STORAGENAME
    

    Şu biçimde bir yanıt görmeniz gerekir:

    {
      "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=<account-name>;AccountKey=<account-key>"
    }
    

    tırnak işaretleri dahil olmak üzere connectionString değerini kopyalayın.

  3. Kod düzenleyicisinde, Bağlan ionString değerini "[connection string]" kopyaladığınız dizeyle değiştirin.

  4. bağlantı dizesi gövdesindeki değerini AccountName= kopyalayın.

  5. AccountName parametresinin değerini kopyaladığınız hesap adı değeriyle değiştirin.

  6. bağlantı dizesi gövdesindeki değerini AccountKey= kopyalayın (tırnak işaretini eklemeyin). değerinin sonuna öğesini eklediğinizden == emin olun.

  7. AccountKey parametresinin değerini kopyaladığınız hesap anahtarı değeriyle değiştirin.

  8. Appsettings.json dosyası şimdi şu çıkışa benzer olmalıdır.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "StorageAccount": {
        "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>;EndpointSuffix=core.windows.net",
        "Container" : "patient-images",
        "AccountName":"<account-name>",
        "AccountKey":"<account-key>"
      }  
    }
    
  9. Ctrl+S ve ardından Ctrl+Q tuşlarına basarak kod düzenleyicisini kaydedin ve kapatın.

  10. Cloud Shell'de çalışırken web uygulamanıza erişebilmek için bir bağlantı noktası açın.

    curl -X POST http://localhost:8888/openPort/8000;
    

    Bu komut, uygulamanızın erişilebileceği bir url yer döndürür.

    {"message":"Port 8000 is open","url":"https://gateway11.northeurope.console.azure.com/n/cc-4016c848/cc-4016c848/proxy/8000/"}
    
  11. Uygulamanızı çalıştırın.

    cd sas
    dotnet run
    

    Uygulama derlendiğinde Cloud Shell konsolu aşağıdaki örneğe benzer ayrıntıları görüntüler.

    Hosting environment: Development
    Content root path: /home/<yourusername>/sas
    Now listening on: https://localhost:8001
    Now listening on: http://localhost:8000
    Application started. Press Ctrl+C to shut down.
    
  12. Tarayıcıda, önceki cURL komutu tarafından döndürülen URL'yi yapıştırın. Adresin sonuna eğik çizgi (/) eklediğinizden emin olun.

    URL şu biçimde olmalıdır: https://gateway11.northeurope.console.azure.com/n/cc-4016c848/cc-4016c848/proxy/8000/.

    Oturum açmanız istenirse tarayıcı pencerenizi yenileyin. Lamna Healthcare Patient Diagnostic Image System (Lamna Healthcare Hasta Tanılama Sistemi) görüntüleniyor.

  13. Depolama hesabındaki tüm görüntülerin listesini görüntülemek için Tüm hastaları al'ı seçin.

SAS oluşturmak için kod ekleme

  1. Cloud Shell'de Ctrl+C tuşlarına basarak web uygulamasını durdurun.

  2. İsteğe bağlı SAS oluşturmak ve web uygulamasının ön ucuna döndürmek için PatientRecordController sınıfını geliştirelim.

  3. PatientRecordController.cs dosyasını kod düzenleyicisinde açmak için aşağıdaki kodu girin.

    code Controllers/PatientRecordController.cs
    
  4. Aşağıdaki kodu yönteminin altındaki sınıfın GET PatientRecord/patient-nnnnnn altına ekleyin.

    // 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(blob) };
    }
    

    Bu yöntem istenen hasta görüntüsünü, bu görüntüye erişmek için kullanılabilecek SAS ile döndürür.

  5. Blob için SAS’yi oluşturacak bir yöntem ekleyin.

    // Build a SAS token for the given blob
    private string GetBlobSas(BlobClient blob)
    {
        // Create a user SAS that only allows reading for a minute
        BlobSasBuilder sas = new BlobSasBuilder 
        {
            BlobContainerName = blob.BlobContainerName,
            BlobName = blob.Name,
            Resource = "b",
            ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
        };
        // Allow read access
        sas.SetPermissions(BlobSasPermissions.Read);
    
        // 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();
    }
    

    Bu yöntem, salt okunur olan ve süresi bir dakika içinde dolan bir SAS oluşturmak BlobSasBuilder için geçirilen BlobClient nesnesini kullanır.

  6. Ctrl+S tuşlarına basarak dosyayı kaydedin ve ardından Ctrl+Q tuşlarına basarak düzenleyiciden çıkın.

SAS’yi kullanmak için kod ekleme

Şimdi görüntü için SAS istemek üzere web sayfasına kod ekleyelim.

  1. external.cshtml sayfasını düzenlemek için aşağıdaki komutu girin.

    code Pages/external.cshtml
    
    
  2. Dosyanın sonuna yakın olan tık #btn-submitdinleyicisinde satırını değiştirerek $.get öğesini ekleyin + '/secure':

    $('#btn-submit').click(function(){
        $('#result').empty();
        $.get('api/PatientRecords/' + $('#patientID').val() + '/secure', function (data) {
            var imageURL = data.imageURI + $('#sasKey').val();
            $('#result').html('<img id="patientScan" class="alert alert-success" src="' + imageURL + '" alt="patient scan" onerror="this.classList.remove(\'alert-success\'); this.classList.add(\'alert-danger\')"//>');
        }, 'json');
    });
    
  3. Tıklama dinleyicisi işlevinin #btn-submit altına, dosyanın alt kısmına, etiketin </script> üstüne aşağıdaki kodu ekleyin:

    $('#btn-getKey').click(function(){
        $.get('api/PatientRecords/' + $('#patientID').val() + '/secure', function (data) {
            $('#sasKey').val(data.sasToken);
        }, 'json');
    });
    

    Bu jQuery kodu btn-getKey düğmesine bir tıklama dinleyicisi ekler. Kod verili görüntülü dosyası için yeni güvenli URL’ye bir Ajax çağrısı yürütür. Geri döndüğünde, anahtar giriş kutusunu SAS ile doldurur.

  4. Ctrl+S tuşlarına basarak değişiklikleri kaydedin ve ardından Ctrl+Q tuşlarına basarak düzenleyiciden çıkın.

Değişikliklerinizi test etme

  1. Güncelleştirilmiş uygulamanızı çalıştırın.

    dotnet run
    
  2. Tarayıcınızda, web sitenizin sekmesini yenileyin. Get all patients’ı seçin ve görüntü dosya adlarından birini kopyalayın.

  3. Web sayfasının üst kısmındaki menüde Dış şirketler'i seçin.

  4. Dosya adını Patient image filename (Hasta görüntüsü dosya adı) alanına yapıştırın.

  5. View scan öğesini seçin. SAS oluşturmadığınız için hasta tarama görüntüsüne erişilemiyor.

    Dekont

    Konsolu tarayıcınızda görüntülüyorsanız web sunucusunun 404 hata kodu iletisi döndürdiğini görürsünüz.

  6. Anahtar Al’ı seçin. Bu seçim Anahtar alanını SAS ile doldurmalıdır.

  7. View scan öğesini seçin. Hastanın teşhis görüntüsü görünmelidir.

    Screenshot of API for external companies showing a patient's image.

  8. Tarayıcınızda görüntüye sağ tıklayın ve görüntü adresini kopyalayın.

  9. Yeni bir tarayıcı sekmesi açın, kopyalanan resim adresini adres çubuğuna yapıştırın ve Enter tuşuna basın. SAS'yi oluşturmanın üzerinden bir dakikadan uzun geçtiyse bir hata iletisi görmeniz gerekir. Bir dakikadan kısa bir süre geçtiyse, görüntü görüntülenmelidir.

    Dekont

    Sayfayı yenilemeniz gerekebilir.

    <Error>
        <Code>AuthenticationFailed</Code>
        <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly, including the signature.
        RequestId:03eda893-f01e-0028-2d73-c5c947000000
        Time:2021-01-07T16:02:55.3752851Z</Message>
        <AuthenticationErrorDetail>Signed expiry time [Tue, 07 Jan 2021 16:02:00 GMT] must be after signed start time [Tue, 07 Jan 2021 16:02:55 GMT]</AuthenticationErrorDetail>
    </Error>
    

    Dekont

    Bazı tarayıcılardan bu hata iletisini görüntülemek için, görüntüyü önbelleğe almamış yeni bir tarayıcı penceresi açmanız gerekebilir.

  10. Cloud Shell'de Ctrl+C tuşlarına basarak web uygulamasından çıkın.