Azure API Management kullanarak GeoCatalog için API ara sunucusu oluşturma

Bu makale, Azure API Management'ı (APIM) Microsoft Planet Computer Pro GeoCatalog önünde API proxy'si olarak ayarlama işleminde size yol gösterir. Bu yapılandırmayla şunları yapabilirsiniz:

  • Anonim erişimi etkinleştirme: Arayanların kendi Microsoft Entra kimlik bilgilerine ihtiyacı yoktur. APIM, yönetilen kimlik kullanarak GeoCatalog'da kendi adına kimlik doğrulaması yapar.
  • Non-Entra Authentication: çağıranlar, Entra tabanlı olmayan kimlik doğrulama yöntemlerini destekleyebilir. APIM, yönetilen bir kimlik kullanarak GeoCatalog'da kendi adına kimlik doğrulaması yapar.
  • Koleksiyon düzeyinde erişim denetimini zorunlu tutma: GeoCatalogs koleksiyon düzeyinde rol tabanlı erişim denetimini (RBAC) yerel olarak desteklemese de, proxy aracılığıyla hangi Spatiotemporal Erişim Kataloğu (STAC) koleksiyonlarının görünür olduğunu kısıtlayın.

Aşağıdaki diyagramda APIM proxy'si eklemeden önceki ve sonraki mimari gösterilmektedir:

Önce Her arayan doğrudan GeoCatalog'da kimlik doğrulaması yapar:

caller ──(Entra token)──► GeoCatalog

Sonra APIM, arayanlarla GeoCatalog arasında yer alıp kimlik doğrulaması ve erişim denetimini işler:

caller ──(anonymous / APIM Subscription Keys)──► APIM ──(managed identity token)──► GeoCatalog

Prerequisites

Yönetilen kimliği APIM'e atama

APIM'nin GeoCatalog'unuzda kimlik doğrulamasından önce kullanıcı tarafından atanan yönetilen kimliği APIM örneğiyle ilişkilendirmeniz gerekir.

  1. Azure portalında API Management örneğine gidin.
  2. Sol kenar çubuğundan Kimlik'i seçin.
  3. Kullanıcı tarafından atanan sekmesini seçin.
  4. Ekle'yi ve ardından GeoCatalog'unuzda GeoCatalog Okuyucusu rolüne sahip kullanıcı tarafından atanan yönetilen kimliği seçin.
  5. Onaylamak için Ekle'yi seçin.

APIM'de API oluşturma

APIM'de GeoCatalog arka ucuna istekleri yönlendiren yeni bir API tanımlayın.

  1. APIM örneğinizde sol kenar çubuğundan API'ler'i seçin.

  2. + API HTTP Ekle'yi> seçin.

  3. API'yi aşağıdaki ayarlarla yapılandırın:

    Setting Değer
    Görüntü adı Açıklayıcı bir ad (örneğin, GeoCatalog API)
    Web hizmeti URL'si GeoCatalog uç noktanız (örneğin, https://<name>.<id>.<region>.geocatalog.spatio.azure.com)
    URL düzeni HTTPS
    API URL uzantısı Boş bırakın (kök yol)
    Abonelik gerekiyor Hayır, Anonim erişim için; Evet, Abonelik Anahtarı tabanlı erişim için
  4. Oluştur'i seçin.

API işlemlerini tanımlama

GeoCatalog API yüzeyiyle eşleştirmek için aşağıdaki işlemleri ekleyin. Joker karakter (/*) işlemleri tüm eşleşen istekleri arka uca iletir. Açık koleksiyon işlemleri, daha sonra erişim denetimi için koleksiyona özgü ilkeler uygulamanıza olanak tanır.

Ekran adı Yöntem URL şablonu
GET GET /*
Koleksiyon öğelerini alma GET /stac/collections/{collection_id}/items
Tek koleksiyon alma GET /stac/collections/{collection_id}
Koleksiyon alt kaynaklarına erişim sağlama GET /stac/collections/{collection_id}/*
PAYLAŞ PAYLAŞ /*

Her işlemi eklemek için:

  1. Oluşturduğunuz API'yi seçin.
  2. + İşlem ekle'yi seçin.
  3. Önceki tablodaki Görünen ad, Yöntem ve URL şablonunu girin.
  4. Kaydetseçeneğini seçin.

API düzeyi ilkesini yapılandırma

API düzeyinde ilke, API'nin tamamı için kimlik doğrulamasını ve URL yeniden yazmayı işler. Bu ilke, kullanıcı tarafından atanan yönetilen kimlikten bir belirteç alır ve GeoCatalog arka uç sistemine iletilen her isteğe iliştirir.

  1. Oluşturduğunuz API'yi ve ardından Tüm işlemler'i seçin.
  2. Gelen işleme bölümünde /< (kod düzenleyicisi) simgesini seçin>.
  3. İlke içeriğini aşağıdaki ilkeyle değiştirin:
<policies>
    <inbound>
        <base />
        <authentication-managed-identity
            resource="https://geocatalog.spatio.azure.com"
            client-id="<managed-identity-client-id>" />
        <set-header name="Accept-Encoding"
            exists-action="delete" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <find-and-replace
            from="https://<name>.<id>.<region>.geocatalog.spatio.azure.com"
            to="https://<apim-name>.azure-api.net" />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Aşağıdaki yer tutucuları değiştirin:

Yer tutucu Değer
<managed-identity-client-id> APIM'ye atanan kullanıcı tarafından atanan yönetilen kimliğin istemci kimliği
<name>.<id>.<region> GeoCatalog uç nokta bileşenleriniz
<apim-name> APIM örneğinizin adı

Aşağıdaki tabloda her ilke öğesi açıklanmaktadır:

İlke öğesi Amaç
authentication-managed-identity Belirtilen yönetilen kimliği kullanarak hedef kitle için https://geocatalog.spatio.azure.com bir belirteç alır ve giden isteğe ekler.
set-header (sil Accept-Encoding) Gelen isteklerden Accept-Encoding başlığını kaldırır. Bkz Accept-Encoding'yi Neden Kaldırma.
find-and-replace Yanıt gövdelerindeki GeoCatalog arka uç URL'sini APIM ağ geçidi URL'sine yeniden yazar. Bu yeniden yazma olmadan, STAC bağlantıları (self, root, parentvb.) arka uç URL'sini arayanlara gösterir.

Neden Accept-Encoding'i çıkar

Python requests ve httpx gibi istemciler varsayılan olarak Accept-Encoding: gzip, deflate gönderir. Arka uç bu üst bilgiyi aldığında sıkıştırılmış bir yanıt döndürür. find-and-replace gibi APIM giden ilkeleri, ham yanıt gövdesi üzerinde çalışır ve sıkıştırmasını açamaz, bu yüzden sessizce hiçbir işlem yapmaz. Üstbilgiyi kaldırmak, arka uçtan çıkış politikalarının işleyebileceği sıkıştırılmamış bir yanıt döndürülmesini zorlar.

Note

curl ve wget varsayılan olarak Accept-Encoding göndermiyor. Bu, bu araçlarla test ettiğinizde giden ilkelerin görünüşe göre düzgün çalıştığı anlamına gelir. Tutarsızlık yalnızca sıkıştırma isteyen istemcilerle ortaya çıkar.

Koleksiyon düzeyinde erişim denetimini zorunlu kılma

Varsayılan olarak, GeoCatalog tüm koleksiyonlarını kimliği doğrulanmış arayanlara gösterir. APIM aracılığıyla hangi koleksiyonların görünür olduğunu kısıtlamak için, geniş STAC bulmayı engelleyen ve izin verilenler listesini zorlayan işlem düzeyi ilkeleri uygulayın.

İzin verilen koleksiyonları tanımlama

İzin verilen koleksiyon kimliklerinin listesini depolamak için APIM'de adlandırılmış bir değer oluşturun:

  1. APIM örneğinizde sol kenar çubuğundan Adlandırılmış değerler'i seçin.
  2. + Ekle'yi seçin.
  3. Ad'ı olarak allowed-collectionsayarlayın.
  4. Değer'i izin verilen koleksiyon kimliklerinin virgülle ayrılmış bir listesine ayarlayın (örneğin, sentinel-2-l2a,landsat-8-c2-l2).
  5. Kaydetseçeneğini seçin.

Giriş sayfasını ve koleksiyon listesini engelleme

Katalogdaki tüm koleksiyonları gösteren yolları engelleyin. Aşağıdaki işlemleri ekleyin ve 404 öğesini hemen döndüren bir ilke ekleyin:

Ekran adı Yöntem URL şablonu
Blok kökü GET /
Koleksiyonları engelle GET /stac/collections

Her iki işleme de aşağıdaki işlem düzeyi ilkesini uygulayın:

<policies>
    <inbound>
        <base />
        <return-response>
            <set-status code="404" reason="Not Found" />
        </return-response>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

STAC /stac/search uç noktası, GET üzerinde sorgu dizesi olarak veya POST üzerindeki JSON gövdesinde bir collections parametre kabul eder. Katalogdaki her koleksiyonda koruyucu önlemler olmadan bir kullanıcı arama yapabilir. Aşağıdaki ilkeler yalnızca izin verilen kümedeki koleksiyonların istendiğini doğrular.

İki işlem ekleyin:

Ekran adı Yöntem URL şablonu
GET araması GET /stac/search
POST araması PAYLAŞ /stac/search

GET /stac/search ilkesi

Bu ilke sorgu parametresini collections doğrular. Virgülle ayrılmış her değer izin verilen kümede olmalıdır. Parametresi olmayan collections istekler ile 403 Forbiddenreddedilir.

GET arama işlemine aşağıdaki ilkeyi uygulayın:

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var raw = context.Request.Url.Query
                    .GetValueOrDefault("collections", "");
                if (string.IsNullOrWhiteSpace(raw)) {
                    return true;
                }
                foreach (var c in raw.ToLower().Split(
                    new [] { "," },
                    StringSplitOptions.RemoveEmptyEntries))
                {
                    if (!c.Trim().Equals(allowed)) {
                        return true;
                    }
                }
                return false;
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Note

APIM ilke ifadeleri kısıtlı bir C# ortamında çalışır. Çift tırnakların ifadede çalışabilmesi için condition='@{...}' (tek tırnaklı öznitelik) kullanın. Genel tür parametrelerinden (örneğin, GetValueOrDefault<string>) ve LINQ lambda ifadelerinden kaçının; bunun yerine açık tür dönüşümleri ve foreach döngüleri kullanın.

POST /stac/search ilkesi

Bu ilke JSON gövdesini ayrıştırır ve diziyi collections doğrular. Parametresi olmayan collections istekler ile 403 Forbiddenreddedilir.

POST arama işlemine aşağıdaki ilkeyi uygulayın:

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <set-variable name="requestBody"
            value="@(context.Request.Body
                .As&lt;string&gt;(
                    preserveContent: true))" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var body = (string)context
                    .Variables["requestBody"];
                var json = Newtonsoft.Json.Linq
                    .JObject.Parse(body);
                var arr = json["collections"]
                    as Newtonsoft.Json.Linq.JArray;
                if (arr == null || arr.Count == 0) {
                    return true;
                }
                foreach (var token in arr) {
                    if (!token.ToString().Trim()
                        .ToLower().Equals(allowed))
                    {
                        return true;
                    }
                }
                return false;
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Koleksiyon uç noktaları üzerinde izin verilen koleksiyonları zorunlu kılma

Açık işlemler olmadan, GET /stac/collections/sentinel-2-l2a veya GET /stac/collections/sentinel-2-l2a/items gibi istekler joker karakteri GET /*'ye düşer ve herhangi bir koleksiyon düzeyi denetimi olmadan arka uca ulaşır. collection_id bölümünde oluşturduğunuz aşağıdaki işlemlere karşı {{allowed-collections}} doğrulayan path-parameter ilkesini uygulayın:

Ekran adı Yöntem URL şablonu
Tek koleksiyon alma GET /stac/collections/{collection_id}
Koleksiyon alt kaynaklarına erişim sağlama GET /stac/collections/{collection_id}/*
Koleksiyon öğelerini alma GET /stac/collections/{collection_id}/items

Aşağıdaki ilkeyi üç işlem için de uygulayın:

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var collectionId = (string)context
                    .Request.MatchedParameters[
                        "collection_id"];
                return !collectionId.Trim()
                    .ToLower().Equals(allowed);
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

SAS belirteci yollarında izin verilen koleksiyonları zorunlu kılma

GeoCatalog SAS API'si, çağıranların depolama belirteçleri oluşturmasına ve varlıkHREF'lerini imzalamasına olanak tanır. Çağıran, kısıtlama olmaksızın herhangi bir koleksiyon için belirteçler alabilir. Aşağıdaki ilkeler yalnızca izin verilen koleksiyonlara erişilmesini sağlar.

Aşağıdaki işlemleri ekleyin:

Ekran adı Yöntem URL şablonu
SAS belirteci al GET /sas/token/{collection_id}
SAS işaretini engelle GET /sas/sign

404 Engelleme ilkesini (kök ve koleksiyon bloğuyla aynı) SAS imzasını engelle işlemine uygulayın. Arayanlar bunun yerine koleksiyon düzeyinde SAS belirteçleri almak için kullanmalıdır /sas/token/{collection_id} .

GET SAS belirteci işlemine aşağıdaki ilkeyi uygulayın:

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var collectionId = (string)context
                    .Request.MatchedParameters[
                        "collection_id"];
                return !collectionId.Trim()
                    .ToLower().Equals(allowed);
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Veri yollarında izin verilen koleksiyonları zorunlu kılma

/data/mosaic/ Uç noktalar tayl işleme, sınırlayıcı kutu kırpmaları ve arama kaydı hizmeti sağlar. İki ilke grubu gereklidir:

  1. Arama kaydı - JSON gövdesindeki collections dizisini doğrulayın.
  2. Diğer tüm koleksiyon yolları - yol parametresini collectionId doğrulayın.

Aşağıdaki işlemleri ekleyin:

Ekran adı Yöntem URL şablonu
POST yazmaç araması PAYLAŞ /data/mosaic/register
GET veri toplama GET /data/mosaic/collections/{collectionId}/*

POST /data/mosaic/register ilkesi

Bu ilke, JSON gövdesindeki diziyi collections izin verilen kümeye göre doğrular. Parametresi olmayan collections istekler reddedilir.

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <set-variable name="requestBody"
            value="@(context.Request.Body
                .As&lt;string&gt;(
                    preserveContent: true))" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var body = (string)context
                    .Variables["requestBody"];
                var json = Newtonsoft.Json.Linq
                    .JObject.Parse(body);
                var arr = json["collections"]
                    as Newtonsoft.Json.Linq.JArray;
                if (arr == null || arr.Count == 0) {
                    return true;
                }
                foreach (var token in arr) {
                    if (!token.ToString().Trim()
                        .ToLower().Equals(allowed))
                    {
                        return true;
                    }
                }
                return false;
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

GET /data/mozaik/collections/{collectionId}/* politika

Bu ilke, path parametresini collectionId izin verilen kümeye göre doğrular. Bu ilkeyi her iki GET veri toplama işlemine de uygulayın.

<policies>
    <inbound>
        <base />
        <set-variable name="allowedCsv"
            value="{{allowed-collections}}" />
        <choose>
            <when condition='@{
                var allowed = ((string)context
                    .Variables["allowedCsv"])
                    .Trim().ToLower();
                var collectionId = (string)context
                    .Request.MatchedParameters[
                        "collectionId"];
                return !collectionId.Trim()
                    .ToLower().Equals(allowed);
            }'>
                <return-response>
                    <set-status code="403"
                        reason="Forbidden" />
                    <set-body>
                        Collection not allowed.
                    </set-body>
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Sık sorulan sorular

İzin verilen koleksiyonlar listesini nasıl güncelleştirebilirim?

allowed-collections APIM örneğindeki adlandırılmış değeri düzenleyin. İlke değişikliği gerekmez.

Çağıran koleksiyon parametresini atlarsa ne olur?

İstek 403 Forbidden ile reddedilir. Arayanlar her zaman hangi koleksiyonları aramak istediklerini belirtmelidir.