Gyakorlat – Az Azure-tároló hozzáférésének delegálása közös hozzáférésű jogosultságkódokkal

Befejeződött

Az Azure Storage lehetővé teszi a megosztott kulccsal, közös hozzáférésű jogosultságkóddal (SAS) vagy Microsoft Entra-azonosítóval rendelkező fájlokhoz való hozzáférést. SAS-ekkel megszabhatja, hogy az ügyfelek milyen műveleteket végezhetnek a fájlokkal és mennyi ideig.

A cége képdiagnosztikai rendszere belsőleg, egy megosztott kulccsal éri el a betegképeket. Létre kell hoznia egy API-t, amely lehetővé teszi a harmadik felek számára a diagnosztikai képekhez való hozzáférést. Egy tesztlapot hoz létre a webalkalmazásban, amelyből megtudhatja, hogyan segíthet az SAS a külső ügyfelek biztonságos hozzáférésének biztosításában.

Ebben a gyakorlatban létrehoz egy tárfiókot, és feltölt néhány példa betegképet. Üzembe helyezheti a csapat meglévő webalkalmazását, és tesztelheti, hogy hozzáfér-e a tárterülethez. Az utolsó lépésként hozzáadja a C#- és JavaScript-kódot, amellyel létrehozza igény szerint a képek biztonságos megtekintéséhez szükséges SAS-jogkivonatot.

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

Tárfiók létrehozása és képek feltöltése

  1. Az Azure Cloud Shell használatával adja meg a következő kódot a betegképek tárfiókjának létrehozásához. A kód létrehoz egy tárfióknevet.

    export STORAGENAME=medicalrecords$RANDOM
    
    az storage account create \
        --name $STORAGENAME \
        --access-tier hot \
        --kind StorageV2 \
        --resource-group "<rgn>[sandbox resource group name]</rgn>"
    
  2. Hozzon létre egy tárolót a tárfiókban a rendszerképek tárolásához.

    az storage container create \
        --name patient-images \
        --account-name $STORAGENAME \
        --public-access off
    
  3. Klónozza a csapata meglévő webalkalmazását. Ez az adattár a csapat által a teszteléshez használt példaképeket tartalmazza.

    git clone https://github.com/MicrosoftDocs/mslearn-control-access-to-azure-storage-with-sas.git sas
    
  4. Az Azure CLI upload-batch parancsával töltse fel a rendszerképeket a tárfiókba.

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

A betegdiagnosztikai képrendszer tesztelése

  1. Nyissa meg az appsettings.json fájlt a kódszerkesztőben, hogy hozzáadhassuk a tárfiókhoz tartozó kapcsolati sztring.

    code sas/appsettings.json
    
  2. A Cloud Shellben írja be a következő kódot a tárfiók kapcsolati sztring beszerzéséhez.

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

    A válasznak ebben a formátumban kell megjelennie:

    {
      "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=medicalrecords3215;AccountKey=UGLNuJWUBtodz+VbhhFcMwkzDpX49Wf7FxtuQDTOHhH+LpCtSQ2LBP0Ju8TQby5CeOt7DMYBgH45SX9yFwqPvA=="
    }
    

    Másolja ki a connectionString értéket az idézőjelekkel együtt.

  3. A kódszerkesztőben cserélje le a Csatlakozás ionString értéket "[connection string]" a másolt sztringre.

  4. Másolja ki a kapcsolati sztring törzsének értékétAccountName=.

  5. Cserélje le az AccountName paraméter értékét a másolt fióknévértékre.

  6. Másolja ki a kapcsolati sztring törzsének értékét AccountKey= (ne tartalmazza az idézőjelet). Ügyeljen arra, hogy az == érték végén szerepeljen.

  7. Cserélje le az AccountKey paraméter értékét a másolt fiókkulcs értékére.

  8. Az appsettings.json fájlnak a következő kimenethez kell hasonlítania.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "StorageAccount": {
        "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=medicalrecords3215;AccountKey=UGLNuJWUBtodz+VbhhFcMwkzDpX49Wf7FxtuQDTOHhH+LpCtSQ2LBP0Ju8TQby5CeOt7DMYBgH45SX9yFwqPvA==;EndpointSuffix=core.windows.net",
        "Container" : "patient-images",
        "AccountName":"medicalrecords3215",
        "AccountKey":"UGLNuJWUBtodz+VbhhFcMwkzDpX49Wf7FxtuQDTOHhH+LpCtSQ2LBP0Ju8TQby5CeOt7DMYBgH45SX9yFwqPvA=="
      }  
    }
    
  9. Mentse és zárja be a kódszerkesztőt a Ctrl+S, majd a Ctrl+Q billentyűkombinációval.

  10. Nyisson meg egy portot, hogy hozzáférhessen a webalkalmazáshoz, amikor a Cloud Shellben fut.

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

    Ez a parancs egy olyan helyre ad vissza, url ahol az alkalmazás elérhető.

    {"message":"Port 8000 is open","url":"https://gateway11.northeurope.console.azure.com/n/cc-4016c848/cc-4016c848/proxy/8000/"}
    
  11. Futtassa az alkalmazást.

    cd sas
    dotnet run
    

    Az alkalmazás lefordításakor a Cloud Shell-konzol az alábbi példához hasonló adatokat jelenít meg.

    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. Egy böngészőben illessze be az előző cURL-parancs által visszaadott URL-címet. Ügyeljen rá, hogy a perjel (/) szerepeljen a cím végén.

    Az URL-címnek a következő formátumban kell lennie: https://gateway11.northeurope.console.azure.com/n/cc-4016c848/cc-4016c848/proxy/8000/.

    Ha a rendszer kéri a bejelentkezést, frissítse a böngészőablakot. Megjelenik a Lamna Healthcare betegdiagnosztikai rendszer.

  13. Válassza az Összes beteg lekérése lehetőséget a tárfiókban lévő összes kép listájának megtekintéséhez.

SAS létrehozása kód hozzáadásával

  1. A Cloud Shellben állítsa le a webalkalmazást a Ctrl+C billentyűkombinációval.

  2. Bővítsük a PatientRecordController osztályt, hogy létrehozzunk egy igény szerinti SAS-t, és visszajuttassuk a webalkalmazás elejére.

  3. Írja be a következő kódot a PatientRecordController.cs fájl megnyitásához a kódszerkesztőben.

    code Controllers/PatientRecordController.cs
    
  4. Adja hozzá a következő kódot az osztály aljára a GET PatientRecord/patient-nnnnnn metódus alatt.

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

    Ez a metódus visszaküldi a kért betegképet egy SAS-szel együtt, amellyel megnyitható.

  5. Adjon hozzá egy metódust, amely létrehozza az SAS-t a blobhoz.

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

    Ez a metódus az átadott BlobClient objektummal hoz létre egy BlobSasBuilder olyan SAS-t, amely írásvédett, és egy percen belül lejár.

  6. Mentse a fájlt a Ctrl+S billentyűkombinációval, majd lépjen ki a szerkesztőből a Ctrl+Q billentyűkombinációval.

Kód hozzáadása az SAS használatához

Adjunk hozzá kódot a weblaphoz, hogy a rendszerkép sasát kérjük.

  1. Írja be a következő parancsot a external.cshtml oldal szerkesztéséhez.

    code Pages/external.cshtml
    
    
  2. A fájl vége közelében, a kattintásfigyelőben #btn-submitmódosítsa a vonalat a $.get hozzáadáshoz + '/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. #btn-submit A kattintásfigyelő függvény alatt, a fájl alján, a </script> címke fölött adja hozzá a következő kódot:

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

    Ez a jQuery-kód egy kattintásfigyelőt ad btn-getKey gombhoz. A kód egy Ajax-hívást intéz az adott képfájl új, biztonságos URL-címéhez. Amikor végbemegy, feltölti a kulcs beviteli mezőjét az SAS-szel.

  4. Mentse a módosításokat a Ctrl+S billentyűkombinációval, majd lépjen ki a szerkesztőből a Ctrl+Q billentyűkombinációval.

A módosítások tesztelése

  1. Futtassa a frissített alkalmazást.

    dotnet run
    
  2. A böngészőben frissítse a webhely lapját. Válassza a Get all patients lehetőséget, majd másolja ki a képfájlnevek egyikét.

  3. A weblap tetején található menüben válassza a Külső vállalatok lehetőséget.

  4. Illessze be a fájlnevet a Patient image filename mezőbe.

  5. Válassza a View scan lehetőséget. A betegvizsgálat képe nem érhető el, mert nem hozott létre SAS-t.

    Megjegyzés:

    Ha a böngészőben tekinti meg a konzolt, a webkiszolgáló egy 404-ben kapott hibaüzenetet fog látni.

  6. Válassza a Kulcs lekérése lehetőséget, amely feltölti a Kulcs mezőt egy SAS-szel.

  7. Válassza a View scan lehetőséget. A beteg diagnosztikai képének meg kell jelennie.

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

  8. A böngészőben kattintson a jobb gombbal a képre, és másolja a ki annak címét.

  9. Nyisson meg egy új böngészőlapot, illessze be a másolt kép címét a címsorba, és nyomja le az Enter billentyűt. Ha az SAS létrehozása óta több mint egy perc telt el, hibaüzenet jelenik meg. Ha kevesebb mint egy perc telt el, a képnek meg kell jelennie.

    Megjegyzés:

    Lehetséges, hogy frissítenie kell az oldalt.

    <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>
    

    Megjegyzés:

    Ha néhány böngészőből szeretné megtekinteni ezt a hibaüzenetet, előfordulhat, hogy meg kell nyitnia egy új böngészőablakot, amely nem gyorsítótárazza a rendszerképet.

  10. A Cloud Shellben lépjen ki a webalkalmazásból a Ctrl+C billentyűkombinációval.