Aracılığıyla paylaş


Veri API oluşturucusunda oturum bağlamı ile satır düzeyi güvenlik uygulama

Veri API'sinin oluşturucusunda satır düzeyi güvenlik uygulamak için SQL'in oturum bağlamı özelliğini kullanın.

Veri API'sini oluşturucunun satır düzeyi güvenliği etkinleştirmek için SQL oturum bağlamı ayarlamasını gösteren diyagram.

Önemli

SQL Server satır düzeyi güvenlik ile oturum bağlamı, Veri API'sini oluşturucu veritabanı ilkelerinden farklıdır. Veritabanı ilkeleri (örneğin, --policy-database "@item.owner eq @claims.user_id") Data API Builder tarafından WHERE yan tümcelerine dönüştürülürken, oturum bağlamı talepleri SQL Server'a ileterek SQL yerel satır düzeyi güvenliğin filtrelemeyi işlemesini sağlar.

Önkoşullar

  • Mevcut SQL sunucusu ve veritabanı.
  • Veri API'si oluşturucu CLI. CLI'yi yükleme

Uyarı

Oturum bağlamı şu şekilde desteklenir:

  • SQL Server 2016 ve üzeri
  • Azure SQL Veritabanı
  • Azure Synapse Analytics (Ayrılmış SQL havuzu)
  • Azure Synapse Analytics (Sunucusuz SQL havuzu) desteklenmiyor

SQL tablosu ve verileri oluşturma

Bu örnek senaryoda kullanmak üzere kurgusal verilerle bir tablo oluşturun.

  1. Tercih ettiğiniz istemciyi veya aracı kullanarak SQL veritabanına bağlanın.

  2. Revenues adlı id, category, revenue ve accessible_role sütunlarıyla bir tablo oluşturun.

    DROP TABLE IF EXISTS dbo.Revenues;
    
    CREATE TABLE dbo.Revenues(
        id int PRIMARY KEY,  
        category varchar(max) NOT NULL,  
        revenue int,  
        accessible_role varchar(max) NOT NULL  
    );
    GO
    
  3. Tabloya Revenues dört örnek satır ekleyin.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    

    Bu örnekte sütun, accessible_role satıra erişebilecek rol adını depolar.

Tavsiye

Yaygın oturum bağlamı kullanım örnekleri:

  • Rol tabanlı filtreleme (burada gösterildiği gibi) kullanarak roles
  • Çok kiracılı yalıtım kullanarak tenant_id
  • Kullanıcıya özel filtreleme kullanarak user_id
  1. Verilerinizi basit SELECT * bir sorguyla test edin.

    SELECT * FROM dbo.Revenues
    
  2. RevenuesPredicateadlı bir işlev oluşturun. Bu işlev sonuçları geçerli oturum bağlamını temel alarak filtreler.

    CREATE FUNCTION dbo.RevenuesPredicate(@accessible_role varchar(max))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS RETURN SELECT 1 AS fn_securitypredicate_result
    WHERE @accessible_role = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));
    
  3. işlevini kullanarak adlı RevenuesSecurityPolicy bir güvenlik ilkesi oluşturun.

    CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy
    ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role)
    ON dbo.Revenues;
    

Uyarı

Yan WITH SCHEMABINDING tümcesi güvenlik ilkelerinde kullanılan işlevler için gereklidir, bu nedenle temel alınan şema değişiklikleri koşulu geçersiz kılmaz.

(İsteğe bağlı) Saklı bir yordam oluştur.

Bu bölümde doğrudan T-SQL'de oturum bağlamı değerlerini kullanmaya yönelik basit bir "merhaba dünya" deseni gösterilmektedir.

  1. roles oturum bağlam değerini okuyan ve sonuçları filtrelemek için kullanan bir saklı yordam oluşturun.

    CREATE OR ALTER PROCEDURE dbo.GetRevenuesForCurrentRole
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @role varchar(max) = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));
    
        SELECT id, category, revenue, accessible_role
        FROM dbo.Revenues
        WHERE accessible_role = @role;
    END
    GO
    

Aracı çalıştır

Bir yapılandırma dosyası ve tek bir varlık oluşturmak için Veri API oluşturucusu (DAB) aracını çalıştırın.

  1. --set-session-context'yi true olarak ayarlarken yeni bir yapılandırma oluşturun.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true \
        --auth.provider Simulator
    

    SQL Server için oturum bağlamı etkinleştirildiğinde, Veri API oluşturucusu çağrısı sp_set_session_context yaparak kimliği doğrulanmış kullanıcı taleplerini SQL'e gönderir (örneğin, roles). Oturum bağlamı etkinleştirildiğinde bu veri kaynağı için yanıt önbelleğe alma devre dışı bırakılır.

Uyarı

Etkinleştirildiğinde set-session-context , veri kaynağı için yanıt önbelleğe alma devre dışı bırakılır. Yüksek trafikli senaryolar için performansı test etmeyi, koşul sütununu dizine eklemeyi veya gereksinimlerinizi karşılarken Veri API'si oluşturucu veritabanı ilkelerini kullanmayı göz önünde bulundurun.

  1. revenue tablosu için dbo.Revenues adlı yeni bir varlık ekleyin.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "Authenticated:read"
    
  2. Veri API'sini oluşturucu aracını başlatın.

    dab start
    
  3. Etkili bir rol belirtmeden uç noktayı sorgular. Aşağıdaki nedenden dolayı veri döndürülmediğini gözlemleyin:

    • Etkin rol varsayılan olarak olarak Authenticatedbelirlenir.
    • Hiçbir satırda accessible_role = 'Authenticated' yok.
    • Güvenlik ilkesi, rol eşleşmediğinde sonuçları filtreler.
    curl http://localhost:5000/api/revenue
    
  4. Etkin rolü Oscar olarak ayarlayarak uç noktayı sorgula. Filtrelenen sonuçların yalnızca Oscar satırlarını içerdiğini gözlemleyin.

    curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenue
    
  5. Hannah rolünü tekrarlayın.

    curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
    

GraphQL ile test

Oturum bağlamı GraphQL sorgularıyla da çalışır.

query {
    revenues {
        items {
            id
            category
            revenue
            accessible_role
        }
    }
}

Rol başlığını iletin.

curl -X POST http://localhost:5000/graphql \
    -H "Content-Type: application/json" \
    -H "X-MS-API-ROLE: Oscar" \
    -d '{"query": "{ revenues { items { id category revenue accessible_role } } }"}'

Veri API'si oluşturucusu SQL Server'a ne gönderir?

Oturum bağlamı etkinleştirildiğinde, Veri API oluşturucusu sorgunuzu yürütmeden önce her istekte oturum bağlamı değerlerini ayarlar.

EXEC sp_set_session_context 'roles', 'Oscar', @read_only = 0;
-- Then executes your query
SELECT * FROM dbo.Revenues;

Kimliği doğrulanmış tüm kullanıcı talepleri anahtar-değer çiftleri olarak gönderilir. Yaygın talepler arasında , roles veya subve kimlik sağlayıcınızdan gelen tüm özel talepler bulunuroid.

SQL'de test

Çalıştığından emin olmak için doğrudan SQL'de filtreyi ve koşulu test edin.

  1. Tercih ettiğiniz istemciyi veya aracı kullanarak SQL sunucusuna yeniden bağlanın.

  2. sp_set_session_context komutunu çalıştırarak oturum bağlamınızın roles talebini statik değer Oscar'ye el ile ayarlayın.

    EXEC sp_set_session_context 'roles', 'Oscar';
    
  3. Tipik SELECT * bir sorgu çalıştırın. Sonuçların koşul kullanılarak otomatik olarak filtrelendiğini gözlemleyin.

    SELECT * FROM dbo.Revenues;  
    
  4. (İsteğe bağlı) Saklı yordamı kullanarak tabloyu sorgular.

    EXEC dbo.GetRevenuesForCurrentRole;
    

Kaynakları temizle

Örnek nesneleri kaldırmak istiyorsanız şunu çalıştırın:

DROP SECURITY POLICY IF EXISTS dbo.RevenuesSecurityPolicy;
DROP FUNCTION IF EXISTS dbo.RevenuesPredicate;
DROP PROCEDURE IF EXISTS dbo.GetRevenuesForCurrentRole;
DROP TABLE IF EXISTS dbo.Revenues;

Sorun giderme

  • Sonuç döndürülmedi: Güvenlik ilkesinin etkinSELECT * FROM sys.security_policies () olduğunu doğrulayın, oturum bağlam değerini ()SELECT SESSION_CONTEXT(N'roles') denetleyin ve Veri API'sini oluşturucu yapılandırmanızda ayarlandığını onaylayın --set-session-context true .
  • Döndürülen tüm satırlar: Güvenlik ilkesinin devre dışı bırakılmadığını (WITH STATE = OFF) ve koşulun yalnızca yetkili satırları döndürdüğünü 1 onaylayın.
  • Performans sorunları: Koşul sütununu ()accessible_role dizine alın ve performans etkisini yalıtmak için ilkeyi geçici olarak devre dışı bırakmayı göz önünde bulundurun.