Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-15.S02

SAML federation modeline giriş

IdP authentication sonucunu SP’nin transaction, recipient ve signature context’ine bağla.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Normal SSO

  1. SP request hazır

    SP request-A’yı initiating browser context’ine bağladı; IdP ve ACS registration bu sentetik profilde önceden seçilidir.

    Atlas SP
    Request-A pending; no session
    Browser
    Normal login navigation
    IdP
    Configured IdP; no request
  2. Redirect browser’da

    SP’nin normal redirect response’u browser’a ulaştı; declared AuthnRequest navigation hedefi registered IdP’dir.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Configured IdP; no request
  3. AuthnRequest IdP’de

    Browser’ın normal navigation request’i IdP’ye ulaştı; request-A ve SP context’i alındı, authentication local adımdır.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Request-A received; pending
  4. IdP local authentication

    Declared IdP authentication tamamlandı ve selected assertion/response hazırlandı; gerçek XML veya signature byte’ı üretilmez.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Response-A + assertion-A ready
  5. POST form browser’da

    IdP’nin normal HTTP response’u browser’a ulaştı; ACS’ye gönderilecek form selected response alias’ını taşır.

    Atlas SP
    Request-A pending; no session
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  6. Response ACS’ye ulaştı

    Browser’ın normal POST request’i ACS’ye ulaştı; response/assertion alındı ama SP validation ve session hâlâ pending’dir.

    Atlas SP
    Response received; validation pending
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  7. SP local validation

    Atlas SP için issuer/key ve aynı verified/consumed node koşulları uygundur. Audience Atlas entity ID’sini içerir; ACS, request-A ve browser-A bağları eşleşir. now=1050 hem Conditions [1000,1100) hem confirmation <1080 sınırındadır; selected validation kabul edilir.

    Atlas SP
    All selected gates valid
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  8. Local session sonucu

    Bütün seçili assertion/context koşulları geçti; SP kendi yeni local session’ını oluşturur, pending request’i tüketir ve assertion kullanımını confirmation validity süresince izler. Browser’a session response’u bu sahnede dönmez; IdP session ve resource policy ayrı kalır.

    Atlas SP
    New SP session; request consumed
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready

Audience deny

  1. SP request hazır

    SP request-A’yı initiating browser context’ine bağladı; IdP ve ACS registration bu sentetik profilde önceden seçilidir.

    Atlas SP
    Request-A pending; no session
    Browser
    Normal login navigation
    IdP
    Configured IdP; no request
  2. Redirect browser’da

    SP’nin normal redirect response’u browser’a ulaştı; declared AuthnRequest navigation hedefi registered IdP’dir.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Configured IdP; no request
  3. AuthnRequest IdP’de

    Browser’ın normal navigation request’i IdP’ye ulaştı; request-A ve SP context’i alındı, authentication local adımdır.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Request-A received; pending
  4. IdP local authentication

    Declared IdP authentication tamamlandı ve selected assertion/response hazırlandı; gerçek XML veya signature byte’ı üretilmez.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Response-A + assertion-A ready
  5. POST form browser’da

    IdP’nin normal HTTP response’u browser’a ulaştı; ACS’ye gönderilecek form selected response alias’ını taşır.

    Atlas SP
    Request-A pending; no session
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  6. Response ACS’ye ulaştı

    Browser’ın normal POST request’i ACS’ye ulaştı; response/assertion alındı ama SP validation ve session hâlâ pending’dir.

    Atlas SP
    Response received; validation pending
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  7. SP local validation

    Assertion audience restriction yalnız catalog SP entity ID’sini içerir; Atlas entity ID’si bu restriction’ı sağlamaz. Doğru ACS, signature ve now=1050 bu farklı recipient bağını telafi etmez. SP validation’ı audience nedeniyle reddeder.

    Atlas SP
    Audience mismatch
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  8. Local session sonucu

    Yalnız bütün selected koşullar geçerse SP session yaratılır; failure branch’lerinde receipt olmuş olsa da session oluşmaz.

    Atlas SP
    No SP session; denied
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready

Time deny

  1. SP request hazır

    SP request-A’yı initiating browser context’ine bağladı; IdP ve ACS registration bu sentetik profilde önceden seçilidir.

    Atlas SP
    Request-A pending; no session
    Browser
    Normal login navigation
    IdP
    Configured IdP; no request
  2. Redirect browser’da

    SP’nin normal redirect response’u browser’a ulaştı; declared AuthnRequest navigation hedefi registered IdP’dir.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Configured IdP; no request
  3. AuthnRequest IdP’de

    Browser’ın normal navigation request’i IdP’ye ulaştı; request-A ve SP context’i alındı, authentication local adımdır.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Request-A received; pending
  4. IdP local authentication

    Declared IdP authentication tamamlandı ve selected assertion/response hazırlandı; gerçek XML veya signature byte’ı üretilmez.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Response-A + assertion-A ready
  5. POST form browser’da

    IdP’nin normal HTTP response’u browser’a ulaştı; ACS’ye gönderilecek form selected response alias’ını taşır.

    Atlas SP
    Request-A pending; no session
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  6. Response ACS’ye ulaştı

    Browser’ın normal POST request’i ACS’ye ulaştı; response/assertion alındı ama SP validation ve session hâlâ pending’dir.

    Atlas SP
    Response received; validation pending
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  7. SP local validation

    now=1080, Conditions bitişi 1100’den erkendir; fakat bearer confirmation NotOnOrAfter=1080 eşitlik anını dışlar. SP’ye mesaj varmış olsa da confirmation artık geçerli değildir. Signature ve request bağı olumlu kalırken SP time gate’inde reddeder.

    Atlas SP
    Confirmation window expired
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  8. Local session sonucu

    Yalnız bütün selected koşullar geçerse SP session yaratılır; failure branch’lerinde receipt olmuş olsa da session oluşmaz.

    Atlas SP
    No SP session; denied
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready

Node deny

  1. SP request hazır

    SP request-A’yı initiating browser context’ine bağladı; IdP ve ACS registration bu sentetik profilde önceden seçilidir.

    Atlas SP
    Request-A pending; no session
    Browser
    Normal login navigation
    IdP
    Configured IdP; no request
  2. Redirect browser’da

    SP’nin normal redirect response’u browser’a ulaştı; declared AuthnRequest navigation hedefi registered IdP’dir.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Configured IdP; no request
  3. AuthnRequest IdP’de

    Browser’ın normal navigation request’i IdP’ye ulaştı; request-A ve SP context’i alındı, authentication local adımdır.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Request-A received; pending
  4. IdP local authentication

    Declared IdP authentication tamamlandı ve selected assertion/response hazırlandı; gerçek XML veya signature byte’ı üretilmez.

    Atlas SP
    Request-A pending; no session
    Browser
    AuthnRequest navigation ready
    IdP
    Response-A + assertion-A ready
  5. POST form browser’da

    IdP’nin normal HTTP response’u browser’a ulaştı; ACS’ye gönderilecek form selected response alias’ını taşır.

    Atlas SP
    Request-A pending; no session
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  6. Response ACS’ye ulaştı

    Browser’ın normal POST request’i ACS’ye ulaştı; response/assertion alındı ama SP validation ve session hâlâ pending’dir.

    Atlas SP
    Response received; validation pending
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  7. SP local validation

    signedNodeAlias=assertion-A iken consumedNodeAlias=assertion-other’dır. Verilen signature sonucu yalnız doğrulanan node’un kapsamındadır; başka node’u tüketme kararını doğrulamaz. SP aynı-node bağını kabul etmez ve yeni local identity kurmaz.

    Atlas SP
    Verified/consumed node mismatch
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready
  8. Local session sonucu

    Yalnız bütün selected koşullar geçerse SP session yaratılır; failure branch’lerinde receipt olmuş olsa da session oluşmaz.

    Atlas SP
    No SP session; denied
    Browser
    ACS POST form ready
    IdP
    Response-A + assertion-A ready

ROLLER · STATE · VERİ AKIŞI

Kim konuşur, kim karar verir?

SAML federation’da IdP principal’ın authentication sonucunu assertion ile ifade eder; SP bu sonucu kendi local application context’inde değerlendiren relying party’dir. Atlas örneği SP-initiated browser SSO seçer: SP pending request-A üretir, browser request’i registered IdP’ye taşır, IdP response’u browser üzerinden SP’nin ACS endpoint’ine ulaştırır. Browser taşımaya aracılık eder; SP’nin IdP signing trust’ının sahibi olmaz. Local SP session, IdP session’dan ayrı kurulur.

Response ID’si response-A, içindeki assertion ID’si assertion-A’dır; bunlar aynı field değildir. Assertion, issuer, subject, AuthnStatement, Conditions ve bearer SubjectConfirmation içerir. Response Status=Success tek başına local login accept anlamına gelmez. SP selected profile’ın issuer, signature coverage, audience, recipient, time ve request correlation koşullarını birlikte okur. Tablo tek bearer assertion seçer; başka profile veya unsolicited response desteği bu tercih üzerinden genellenmez.

Destination, audience ve recipient farklı bağlar

Response Destination mesajın alındığı ACS location’ıyla eşleşir; bearer Recipient assertion’ın confirmation hedefi ACS URL’sidir. Audience ise SP’nin unique entity identifier’ıdır; ACS URL’siyle aynı olmak zorunda değildir. Response ve bearer InResponseTo selected request-A’ya bağlıdır. SP ayrıca kendi pending request ve browser context’ini korur. Core’daki optional field genel tanımı ile bu SP-initiated selected profile’ın correlation gereksinimini karıştırma; unsolicited akışın ayrı kuralları vardır ve burada kabul edilmez.

Conditions NotBefore başlangıcı dahil, NotOnOrAfter bitişi hariç bir zaman aralığı verir. Bearer SubjectConfirmationData’nın kendi NotOnOrAfter sınırı da RP’nin confirmation anında geçerli olmalıdır; bu field yalnız browser delivery deadline’ı değildir. Bearer data’ya NotBefore eklenmez. Örnekte Conditions [1000,1100), confirmation before 1080 ve clock skew=0 seçilmiştir; now=1080 confirmation gate’inde deny olur. Gerçek deployment clock skew policy’sini açıkça yönetir; daha erken response receipt geç gelen validation’ı otomatik geçerli yapmaz.

İmza hangi business verisini korur?

POST profile’ın onaylı E26 errata’sı her assertion’ın digital signature ile korunmasını ister; bunu assertion’ı ayrı imzalayarak veya onu kapsayan Response’u imzalayarak sağlamak mümkündür. Burada individual assertion coverage seçiyoruz. Signature validation’ın trusted IdP key’i, accepted algorithm ve verified node kapsamı bilinmelidir; mesajın içindeki certificate/KeyInfo kendiliğinden trust anchor olmaz. Business identity, gerçekten doğrulanan ve policy’si değerlendirilen node’dan okunmalıdır.

signedNodeAlias ile consumedNodeAlias aynı node’u göstermiyorsa signature valid declared olsa bile local accept üretmeyiz. Bu iki alias XML, certificate veya gerçek signature değildir; parsed business node binding’ini anlatan inert typed ledger’dır. NameID mapping’i trusted issuer ve identifier format/qualifier anlaşmasına bağlıdır; yalnız display name veya email benzerliğinden local account üretilmez. Login acceptance da application role, tenant ve resource authorization’ını otomatik vermez.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

SP farklı

  1. SAML relying-party context’i seçildi

    Profile SP-initiated, tek bearer assertion ve unsolicitedAccepted=false seçer. Response Destination Atlas ACS olsa da assertion’ın recipient, audience ve request bağı ayrıca değerlendirilir.

    SAML profile
    case=audience-denied
    Assertion context validation
    Assertion gate okunmadı
    SP session boundary
    SP session yok
  2. Declared signature ile trusted provenance ayrıldı

    cryptographicValidDeclared=true, keyProvenanceDeclared=true ve selectedCoverage=individual-assertion verilmiştir. Mesajdaki certificate tek başına trust anchor değildir; verified node’un hangi veri olduğu korunur.

    SAML profile
    case=audience-denied
    Assertion context validation
    Individual assertion signature predicate
    SP session boundary
    SP session yok
  3. Tüketim veya audience gate’i uygulandı

    Audience restriction yalnız https://catalog.example.org/saml/entity içerir. Atlas SP entity ID’si burada yoktur; doğru ACS destination farklı intended SP’yi kabul ettirmez.

    SAML profile
    case=audience-denied
    Assertion context validation
    Intended audience ≠ Atlas SP
    SP session boundary
    SP session yok
  4. Diğer olumlu gates ret’i değiştirmedi

    now=1050, pending request-A ve browser-A uygun kalır. Olumlu correlation ve time predicate’leri failed audience gate’ini telafi etmez.

    SAML profile
    case=audience-denied
    Assertion context validation
    Context/time valid; selected gate failed
    SP session boundary
    SP session yok
  5. Local session kabulü durduruldu

    Expected=false’tur; bu assertion üzerinden yeni SP session oluşturulmaz. NameID metni veya AuthnStatement varlığı, failed context gate’i aşmak için local identity proof sayılmaz.

    SAML profile
    case=audience-denied
    Assertion context validation
    Selected validation denied
    SP session boundary
    No new SP session
  6. Typed ledger güven sınırı korundu

    Bu branch association ve intended-recipient sınırını açıklar; gerçek XML signature veya parser işlemi çalıştırmaz. Attribute/role/tenant authorization, accepted authentication sonrasında da ayrı policy’dir.

    SAML profile
    case=audience-denied
    Assertion context validation
    Known: selected gate denial
    SP session boundary
    No broadened local authority

Node bağı farklı

  1. SAML relying-party context’i seçildi

    Profile SP-initiated, tek bearer assertion ve unsolicitedAccepted=false seçer. Response Destination Atlas ACS olsa da assertion’ın recipient, audience ve request bağı ayrıca değerlendirilir.

    SAML profile
    case=node-denied
    Assertion context validation
    Assertion gate okunmadı
    SP session boundary
    SP session yok
  2. Declared signature ile trusted provenance ayrıldı

    cryptographicValidDeclared=true, keyProvenanceDeclared=true ve selectedCoverage=individual-assertion verilmiştir. Mesajdaki certificate tek başına trust anchor değildir; verified node’un hangi veri olduğu korunur.

    SAML profile
    case=node-denied
    Assertion context validation
    Individual assertion signature predicate
    SP session boundary
    SP session yok
  3. Tüketim veya audience gate’i uygulandı

    signedNodeAlias=assertion-A, consumedNodeAlias=assertion-other’dır. Bir node için signature success, başka business node’un identity/conditions verisini doğrulamaz.

    SAML profile
    case=node-denied
    Assertion context validation
    Verified node ≠ consumed node
    SP session boundary
    SP session yok
  4. Diğer olumlu gates ret’i değiştirmedi

    now=1050, pending request-A ve browser-A uygun kalır. Olumlu correlation ve time predicate’leri failed node association gate’ini telafi etmez.

    SAML profile
    case=node-denied
    Assertion context validation
    Context/time valid; selected gate failed
    SP session boundary
    SP session yok
  5. Local session kabulü durduruldu

    Expected=false’tur; bu assertion üzerinden yeni SP session oluşturulmaz. NameID metni veya AuthnStatement varlığı, failed context gate’i aşmak için local identity proof sayılmaz.

    SAML profile
    case=node-denied
    Assertion context validation
    Selected validation denied
    SP session boundary
    No new SP session
  6. Typed ledger güven sınırı korundu

    Bu branch association ve intended-recipient sınırını açıklar; gerçek XML signature veya parser işlemi çalıştırmaz. Attribute/role/tenant authorization, accepted authentication sonrasında da ayrı policy’dir.

    SAML profile
    case=node-denied
    Assertion context validation
    Known: selected gate denial
    SP session boundary
    No broadened local authority

VARSAYIM · SINIR · KONTROL

Valid assertion yanlış bağlamda kullanılamaz

Audience-denied branch’inde response doğru ACS’ye gelir, issuer ve signature fixture’ı doğru kalır, fakat assertion catalog SP’ye yöneliktir. Atlas kendi entity ID’sini audience restriction’da bulamadığı için local session yaratmaz. Bir restriction içindeki Audience’lar OR, farklı restriction grupları AND’dır; hepsini tek büyük allowlist’e dökmek kısıtı değiştirir. Bu, transport veya XML format hatası değil, intended relying party bağının başarısızlığıdır.

Expired branch’inde Conditions henüz bitmemişken now=1080, bearer confirmation sınırına eşittir. SP receipt state’i gösterildikten sonra local time gate deny üretir. Request-B correlation, başka browser alias’ı veya daha önce kullanılmış assertion ID de ayrı context sorularıdır. Profile’ın valid signatures kontrolü bu koşulları atlamaya izin vermez; ilk başarısız gate ve hangi local state’in oluşmadığı kanıtta ayrı görünmelidir.

Signature sonucu node seçimini örtmez

Node-denied branch’i yalnız typed ledger’da verified assertion-A ile business consumer’ın assertion-other referansını ayırır. İçinde XML signing örneği, parser manipulation veya yeniden üretim akışı yoktur. Öğrenilecek varsayım şudur: “bir signature doğrulandı” sonucu hangi issuer/subject/condition node’u için geçerliydi? Key provenance, coverage ve aynı node’un tüketilmesi kaybolursa identity kararı kendi kanıtından kopar. Signed XML integrity sağlar; attribute doğruluğu ve local role policy’si ayrıca değerlendirilir.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Confirmation time

  1. Bearer confirmation penceresi seçildi

    Normal Conditions NotBefore=1000 ve NotOnOrAfter=1100’dür. Bearer SubjectConfirmation ise NotOnOrAfter=1080 taşır; iki pencere ayrı gate’tir.

    SAML decision ledger
    Conditions + confirmation
    Time/correlation review
    Time karşılaştırılmadı
    SP evidence conclusion
    Acceptance bilinmiyor
  2. Seçilen clock profile okundu

    clockSkew=0’dır; integer değerler synthetic UTC timeline offsets’tir. Bunlar wire xs:dateTime string’leri veya production clock ölçümü değildir.

    SAML decision ledger
    Clock skew=0
    Time/correlation review
    Synthetic UTC offsets
    SP evidence conclusion
    Acceptance bilinmiyor
  3. İlk ve son uygun anlar karşılaştırıldı

    now=1000 NotBefore equality’de uygundur; now=1079 her iki upper bound’un önündedir. Bu satırlar time gate için olumlu kontrollerdir.

    SAML decision ledger
    1000 and 1079 eligible
    Time/correlation review
    Time expected=true
    SP evidence conclusion
    Other validation gates separate
  4. Erken upper bound equality’de kapandı

    now=1080’de Conditions hâlâ 1100 önündedir, fakat bearer confirmation NotOnOrAfter eşitliği acceptance’ı durdurur. Confirmation window yalnız delivery süresi gibi yorumlanmaz.

    SAML decision ledger
    now=1080
    Time/correlation review
    Conditions valid; confirmation expired
    SP evidence conclusion
    Time acceptance=false
  5. Time denial diğer gates’le karışmadı

    Expired row’da signature ve request context olumlu kalır. Bu nedenle reason confirmation expiry’dir; yanlış issuer, password veya audience failure diye yeniden adlandırılmaz.

    SAML decision ledger
    Known: expired confirmation
    Time/correlation review
    Signature/context predicates unchanged
    SP evidence conclusion
    No inferred issuer compromise
  6. Time kanıtı profile scope’unda kaldı

    Bu fixture’ın time expected sonuçları açıklanır. Clock synchronization, çoklu assertions/confirmations ve actual SP acceptance ayrı evidence ister; new local session burada doğrulanmaz.

    SAML decision ledger
    Known: selected time boundaries
    Time/correlation review
    Clock/runtime evidence ayrı
    SP evidence conclusion
    UNKNOWN: actual SP session

Request binding

  1. Pending request scope seçildi

    Pending request-A browser-A’ya bağlıdır. Response InResponseTo ile bearer SubjectConfirmation InResponseTo aynı kararın ayrı correlation alanlarıdır.

    SAML decision ledger
    request-A / browser-A
    Time/correlation review
    Correlation okunmadı
    SP evidence conclusion
    Local session bilinmiyor
  2. Normal binding satırı okundu

    responseRequest=request-A, subjectRequest=request-A, browserAlias=browser-A ve pending=true satırı expected=true verir. Tek request alanı eşleşmesi yeterli diye daraltılmaz.

    SAML decision ledger
    Both request links match
    Time/correlation review
    Browser/pending match
    SP evidence conclusion
    Correlation expected=true
  3. Response ve subject mismatch ayrıldı

    Response request-B veya subject request-B olan iki ayrı satır expected=false’tur. Birinin eşleşmesi diğer mismatch’i telafi etmez; iki alan tek join’e yassılaştırılmaz.

    SAML decision ledger
    Distinct mismatch rows
    Time/correlation review
    Either request mismatch denies
    SP evidence conclusion
    Correlation expected=false
  4. Initiating browser scope’u korundu

    İki request alanı eşleşse de browserAlias=browser-B satırı expected=false’tur. Request-A’nın görünmesi farklı browser context’inde local session acceptance üretmez.

    SAML decision ledger
    Request links match
    Time/correlation review
    Browser B ≠ pending Browser A
    SP evidence conclusion
    Correlation expected=false
  5. Audience grouping ayrı okundu

    Bir AudienceRestriction içindeki entity IDs OR, farklı restrictions AND ile değerlendirilir. Correlation başarısı bu intended-SP kuralını tamamlamaz; ayrı audience evidence gerekir.

    SAML decision ledger
    Correlation policy known
    Time/correlation review
    Audience groups: OR within, AND across
    SP evidence conclusion
    Other gates remain separate
  6. Local session hükmü genişletilmedi

    Correlation matrix yalnız request ve browser bağının eşleşmesini gösterir. Issuer, signature coverage, tüketilen node, audience/recipient ve zaman koşulları ayrıca gereklidir; bunlar olmadan SP authentication kabulü çıkarılmaz. Local role ve resource izni ise authentication’dan ayrı application policy’sidir.

    SAML decision ledger
    Known: typed correlation rules
    Time/correlation review
    Other gate evidence required
    SP evidence conclusion
    UNKNOWN: actual SP acceptance

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Trust configuration mesajdan önce gelir

Atlas selected IdP entity ID, SP entity ID, ACS URL ve signing key provenance’ını configuration’da ayırır. Current library algorithm policy’si kullanılır; 2005 standardındaki tarihsel signature algorithm önerilerini güncel deployment default’u diye taşımayız. XML parser/schema/ID uniqueness, signature validation ve business node seçimi reviewed library sınırında birlikte tutulur. Unknown schema veya mesajın taşıdığı yeni key referansı otomatik network trust kaynağı değildir.

Pending request ledger’ı request ID ve initiating browser context’ini bağlar. Selected bearer assertion’ın issuer, signature coverage, Conditions, audience, recipient ve InResponseTo’su local gate’te doğrulanmadan session yaratılmaz. Birden fazla assertion varsa her biri bağımsız değerlendirilmeli; bearer confirmation alternatiflerinden profile’a uygun bir tanesinin geçmesi yeterli olabilir. Buradaki tek assertion/tek confirmation profili bu çokluk kurallarını uyguladığını iddia etmez.

Session creation ile reusable assertion ayır

Normal branch’te bütün selected gate’ler geçtikten sonra SP yeni local session oluşturur; request state’i tüketilir ve used assertion ID confirmation validity boyunca tutulur. POST profile bunu bearer reuse kontrolü için ister; storage concurrency ve clock policy gerçek üründe ayrıca doğrulanır. Assertion’ın accept edilmesi SP session’ını sonsuz yapmaz; local session lifetime ve varsa AuthnStatement SessionNotOnOrAfter bağlamı ayrı izlenir.

Normal akışı audience, confirmation süresi ve node bağı nedeniyle reddedilen dallarla karşılaştır. Response ve bearer InResponseTo alanları aynı pending request’e, browser context’i de aynı başlatana bağlı olmalıdır. Tablo bu karar koşullarını alias ve zaman değerleriyle gösterir; gerçek XML canonicalization, digital signature, parser, SAML binding, IdP/SP, browser form veya persistent session davranışı bu alanlardan doğrulanmış sayılmaz. Authentication kabul edilse de application’ın tenant ve record policy’si kendi sahibinde ayrıca uygulanır.

ŞİMDİ VAKAYA UYGULA

Signature success hangi context gate’lerini tamamlamaz?

Atlas’ın tek bearer assertion profile’ı audience, same verified node, request/browser binding ve iki time window ister. Typed ledger gerçek XML runtime değildir.

Vakadaki identity hangi issuer ve recipient ilişkisinden geliyor? Login veya delegation başarısı ile current tenant/object permission için gereken kanıtları ayır.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

SAML response/assertion context ledger’ı

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "protocol": "SAML 2.0",
    "selected": "SP-initiated Web Browser SSO; abstract Redirect request / POST response",
    "idpEntityId": "https://identity.example.org/saml",
    "spEntityId": "https://atlas.example.org/saml/entity",
    "acsURL": "https://atlas.example.org/saml/acs",
    "oneBearerAssertion": true,
    "unsolicitedAccepted": false,
    "noActualXML": true,
    "noActualSignature": true,
    "noActualNetwork": true,
    "algorithmPolicy": "Configured current library policy; no legacy 2005 algorithm recommendation adopted",
    "normalIdpAuthenticationDeclared": true,
    "acsRegistrationCheckedDeclared": true
  },
  "normal": {
    "response": {
      "ID": "response-A",
      "Version": "2.0",
      "Issuer": "https://identity.example.org/saml",
      "InResponseTo": "request-A",
      "Destination": "https://atlas.example.org/saml/acs",
      "Status": "Success"
    },
    "assertion": {
      "ID": "assertion-A",
      "Issuer": "https://identity.example.org/saml",
      "NameID": {
        "format": "persistent",
        "value": "subject-A",
        "nameQualifier": "https://identity.example.org/saml",
        "spNameQualifier": "https://atlas.example.org/saml/entity"
      },
      "AuthnStatementPresent": true,
      "Conditions": {
        "NotBefore": 1000,
        "NotOnOrAfter": 1100,
        "AudienceRestrictions": [
          [
            "https://atlas.example.org/saml/entity"
          ]
        ]
      },
      "SubjectConfirmation": {
        "method": "bearer",
        "Recipient": "https://atlas.example.org/saml/acs",
        "InResponseTo": "request-A",
        "NotOnOrAfter": 1080
      }
    },
    "signature": {
      "selectedCoverage": "individual-assertion",
      "signedNodeAlias": "assertion-A",
      "consumedNodeAlias": "assertion-A",
      "trustedKeyAlias": "configured-idp-signing-key",
      "keyProvenanceDeclared": true,
      "cryptographicValidDeclared": true,
      "schemaAndUniqueIdsDeclared": true
    },
    "context": {
      "now": 1050,
      "clockSkew": 0,
      "pendingRequestId": "request-A",
      "browserAlias": "browser-A",
      "pendingBrowserAlias": "browser-A",
      "pending": true,
      "assertionPreviouslyUsed": false
    }
  },
  "cases": [
    {
      "case": "normal",
      "ledger": {
        "response": {
          "ID": "response-A",
          "Version": "2.0",
          "Issuer": "https://identity.example.org/saml",
          "InResponseTo": "request-A",
          "Destination": "https://atlas.example.org/saml/acs",
          "Status": "Success"
        },
        "assertion": {
          "ID": "assertion-A",
          "Issuer": "https://identity.example.org/saml",
          "NameID": {
            "format": "persistent",
            "value": "subject-A",
            "nameQualifier": "https://identity.example.org/saml",
            "spNameQualifier": "https://atlas.example.org/saml/entity"
          },
          "AuthnStatementPresent": true,
          "Conditions": {
            "NotBefore": 1000,
            "NotOnOrAfter": 1100,
            "AudienceRestrictions": [
              [
                "https://atlas.example.org/saml/entity"
              ]
            ]
          },
          "SubjectConfirmation": {
            "method": "bearer",
            "Recipient": "https://atlas.example.org/saml/acs",
            "InResponseTo": "request-A",
            "NotOnOrAfter": 1080
          }
        },
        "signature": {
          "selectedCoverage": "individual-assertion",
          "signedNodeAlias": "assertion-A",
          "consumedNodeAlias": "assertion-A",
          "trustedKeyAlias": "configured-idp-signing-key",
          "keyProvenanceDeclared": true,
          "cryptographicValidDeclared": true,
          "schemaAndUniqueIdsDeclared": true
        },
        "context": {
          "now": 1050,
          "clockSkew": 0,
          "pendingRequestId": "request-A",
          "browserAlias": "browser-A",
          "pendingBrowserAlias": "browser-A",
          "pending": true,
          "assertionPreviouslyUsed": false
        }
      },
      "expected": true
    },
    {
      "case": "audience-denied",
      "ledger": {
        "response": {
          "ID": "response-A",
          "Version": "2.0",
          "Issuer": "https://identity.example.org/saml",
          "InResponseTo": "request-A",
          "Destination": "https://atlas.example.org/saml/acs",
          "Status": "Success"
        },
        "assertion": {
          "ID": "assertion-A",
          "Issuer": "https://identity.example.org/saml",
          "NameID": {
            "format": "persistent",
            "value": "subject-A",
            "nameQualifier": "https://identity.example.org/saml",
            "spNameQualifier": "https://atlas.example.org/saml/entity"
          },
          "AuthnStatementPresent": true,
          "Conditions": {
            "NotBefore": 1000,
            "NotOnOrAfter": 1100,
            "AudienceRestrictions": [
              [
                "https://catalog.example.org/saml/entity"
              ]
            ]
          },
          "SubjectConfirmation": {
            "method": "bearer",
            "Recipient": "https://atlas.example.org/saml/acs",
            "InResponseTo": "request-A",
            "NotOnOrAfter": 1080
          }
        },
        "signature": {
          "selectedCoverage": "individual-assertion",
          "signedNodeAlias": "assertion-A",
          "consumedNodeAlias": "assertion-A",
          "trustedKeyAlias": "configured-idp-signing-key",
          "keyProvenanceDeclared": true,
          "cryptographicValidDeclared": true,
          "schemaAndUniqueIdsDeclared": true
        },
        "context": {
          "now": 1050,
          "clockSkew": 0,
          "pendingRequestId": "request-A",
          "browserAlias": "browser-A",
          "pendingBrowserAlias": "browser-A",
          "pending": true,
          "assertionPreviouslyUsed": false
        }
      },
      "expected": false
    },
    {
      "case": "expired",
      "ledger": {
        "response": {
          "ID": "response-A",
          "Version": "2.0",
          "Issuer": "https://identity.example.org/saml",
          "InResponseTo": "request-A",
          "Destination": "https://atlas.example.org/saml/acs",
          "Status": "Success"
        },
        "assertion": {
          "ID": "assertion-A",
          "Issuer": "https://identity.example.org/saml",
          "NameID": {
            "format": "persistent",
            "value": "subject-A",
            "nameQualifier": "https://identity.example.org/saml",
            "spNameQualifier": "https://atlas.example.org/saml/entity"
          },
          "AuthnStatementPresent": true,
          "Conditions": {
            "NotBefore": 1000,
            "NotOnOrAfter": 1100,
            "AudienceRestrictions": [
              [
                "https://atlas.example.org/saml/entity"
              ]
            ]
          },
          "SubjectConfirmation": {
            "method": "bearer",
            "Recipient": "https://atlas.example.org/saml/acs",
            "InResponseTo": "request-A",
            "NotOnOrAfter": 1080
          }
        },
        "signature": {
          "selectedCoverage": "individual-assertion",
          "signedNodeAlias": "assertion-A",
          "consumedNodeAlias": "assertion-A",
          "trustedKeyAlias": "configured-idp-signing-key",
          "keyProvenanceDeclared": true,
          "cryptographicValidDeclared": true,
          "schemaAndUniqueIdsDeclared": true
        },
        "context": {
          "now": 1080,
          "clockSkew": 0,
          "pendingRequestId": "request-A",
          "browserAlias": "browser-A",
          "pendingBrowserAlias": "browser-A",
          "pending": true,
          "assertionPreviouslyUsed": false
        }
      },
      "expected": false
    },
    {
      "case": "node-denied",
      "ledger": {
        "response": {
          "ID": "response-A",
          "Version": "2.0",
          "Issuer": "https://identity.example.org/saml",
          "InResponseTo": "request-A",
          "Destination": "https://atlas.example.org/saml/acs",
          "Status": "Success"
        },
        "assertion": {
          "ID": "assertion-A",
          "Issuer": "https://identity.example.org/saml",
          "NameID": {
            "format": "persistent",
            "value": "subject-A",
            "nameQualifier": "https://identity.example.org/saml",
            "spNameQualifier": "https://atlas.example.org/saml/entity"
          },
          "AuthnStatementPresent": true,
          "Conditions": {
            "NotBefore": 1000,
            "NotOnOrAfter": 1100,
            "AudienceRestrictions": [
              [
                "https://atlas.example.org/saml/entity"
              ]
            ]
          },
          "SubjectConfirmation": {
            "method": "bearer",
            "Recipient": "https://atlas.example.org/saml/acs",
            "InResponseTo": "request-A",
            "NotOnOrAfter": 1080
          }
        },
        "signature": {
          "selectedCoverage": "individual-assertion",
          "signedNodeAlias": "assertion-A",
          "consumedNodeAlias": "assertion-other",
          "trustedKeyAlias": "configured-idp-signing-key",
          "keyProvenanceDeclared": true,
          "cryptographicValidDeclared": true,
          "schemaAndUniqueIdsDeclared": true
        },
        "context": {
          "now": 1050,
          "clockSkew": 0,
          "pendingRequestId": "request-A",
          "browserAlias": "browser-A",
          "pendingBrowserAlias": "browser-A",
          "pending": true,
          "assertionPreviouslyUsed": false
        }
      },
      "expected": false
    }
  ],
  "audienceRows": [
    {
      "restrictions": [
        [
          "https://atlas.example.org/saml/entity",
          "https://catalog.example.org/saml/entity"
        ]
      ],
      "expected": true
    },
    {
      "restrictions": [
        [
          "https://atlas.example.org/saml/entity"
        ],
        [
          "https://catalog.example.org/saml/entity"
        ]
      ],
      "expected": false
    },
    {
      "restrictions": [
        [
          "https://atlas.example.org/saml/entity"
        ],
        [
          "https://atlas.example.org/saml/entity",
          "https://catalog.example.org/saml/entity"
        ]
      ],
      "expected": true
    }
  ],
  "timeRows": [
    {
      "now": 999,
      "expected": false
    },
    {
      "now": 1000,
      "expected": true
    },
    {
      "now": 1079,
      "expected": true
    },
    {
      "now": 1080,
      "expected": false
    },
    {
      "now": 1100,
      "expected": false
    }
  ],
  "correlationRows": [
    {
      "responseRequest": "request-A",
      "subjectRequest": "request-A",
      "browserAlias": "browser-A",
      "pending": true,
      "expected": true
    },
    {
      "responseRequest": "request-B",
      "subjectRequest": "request-A",
      "browserAlias": "browser-A",
      "pending": true,
      "expected": false
    },
    {
      "responseRequest": "request-A",
      "subjectRequest": "request-B",
      "browserAlias": "browser-A",
      "pending": true,
      "expected": false
    },
    {
      "responseRequest": "request-A",
      "subjectRequest": "request-A",
      "browserAlias": "browser-B",
      "pending": true,
      "expected": false
    }
  ],
  "signatureCoverage": {
    "approvedPOSTAlternatives": [
      "individual-assertion",
      "covering-response"
    ],
    "selected": "individual-assertion",
    "sameVerifiedNodeConsumedRequired": true,
    "certificateInMessageIsTrustAnchor": false,
    "xmlEncryptionProvidesSignature": false
  },
  "localSession": {
    "createdOnlyAfterAllSelectedGates": true,
    "newSessionSeparateFromIdpSession": true,
    "assertionIdRetainedThroughConfirmationValidity": true,
    "storageConcurrencyNotExecuted": true,
    "roleOrTenantPolicySeparate": true
  },
  "timeNotation": "Integer offsets in a synthetic UTC teaching timeline; not wire xs:dateTime strings",
  "subjectConfirmationQualification": {
    "noNotBeforeInBearerData": true,
    "confirmationWindowNotDeliveryOnly": true,
    "multipleConfirmationsAnyValidOneForEachAssertion": true,
    "multipleAssertionsIndependentlyValidated": true
  }
}
profile
SP-initiated selected binding ve trust context’leri; XML çalışmaz.
normal.response
Response ID, Destination ve request correlation.
normal.assertion
Subject, audience, Conditions ve bearer confirmation ayrı alanlardır.
normal.signature
Declared trusted key ve aynı verified/consumed node ilişkisi.
timeRows
UTC öğretim offset’leri; confirmation bitişi hariçtir.

Inert aliases ve UTC offset tablosudur; wire XML/xs:dateTime, certificate, signature, IdP authentication, browser binding veya persistent session üretmez.

İki yanlış kanı

POST response’ta her assertion ayrı imzalanmak zorundadır.

Onaylı E26, assertion’ları koruyan individual Assertion signature veya covering Response signature’a izin verir.

ACS’ye ulaşan response artık valid login’dir.

Receipt sonrası trusted issuer/key, coverage, audience, recipient, request ve time gate’leri geçmeden SP session yaratılmaz.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Conditions süresi 1100’e kadar, fakat bearer SubjectConfirmation NotOnOrAfter=1080. now=1080 ve clockSkew=0. Assertion kabul edilir mi?

  1. Hayır. Subject confirmation sınırına ulaşılmış.
  2. Evet. Conditions 1100 olduğu için bütün confirmation süreleri geçersizdir.
Gerekçeli cevabı oku

Hayır. Subject confirmation sınırına ulaşılmış. — NotOnOrAfter eşitlik anını kabul etmez. Daha uzun Conditions süresi, confirmation süresinin dolmasını geçerli yapmaz.

Bir restriction içindeki iki audience ile iki ayrı restriction neden aynı sonucu vermiyor?

Dersten seçilen artifact alanları; öğretim örneği

audienceRows
[{"restrictions":[["https://atlas.example.org/saml/entity","https://catalog.example.org/saml/entity"]],"expected":true},{"restrictions":[["https://atlas.example.org/saml/entity"],["https://catalog.example.org/saml/entity"]],"expected":false},{"restrictions":[["https://atlas.example.org/saml/entity"],["https://atlas.example.org/saml/entity","https://catalog.example.org/saml/entity"]],"expected":true}]
  1. Bütün audience listeleri düzleştirilir; herhangi tek eşleşme yeterli.
  2. SP her restriction’ı sağlamalı; bir restriction içindeki adaylardan biri yeterli.
Gerekçeli cevabı oku

SP her restriction’ı sağlamalı; bir restriction içindeki adaylardan biri yeterli. — Atlas ve catalog aynı restriction içindeyse Atlas eşleşir. Ayrı restriction’larda Atlas’ın yalnız catalog isteyen ikinci koşulu sağlamaması ret üretir.

Signature cryptographicValidDeclared=true. SP neden signedNodeAlias ile consumedNodeAlias, InResponseTo, Destination ve Recipient bağlarını da doğrular?

Gerekçeli cevabı oku

Güvenilen key provenance ve signature coverage gerekir; mesaj içindeki certificate kendiliğinden trust anchor olmaz. Business kararında tüketilen node, doğrulanan node’a bağlı olmalıdır. InResponseTo bekleyen request/browser transaction’ını, Destination ve Recipient doğru ACS bağını korur. Zaman, audience ve kullanım state’i de ayrıca denetlenir. SP session, IdP session’dan ayrıdır; role/tenant izni sonradan uygulanır. Bu typed ledger gerçek XML veya signature validation çalıştırmaz.

□ Signature sonucunu bütün assertion/context koşulları saymadım.

□ SP session ile IdP session ve resource iznini ayırdım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • OASIS SAML 2.0 — Assertions and Protocols, OASIS Standard§2.5.1.1–2.5.1.4 conditions/time/audience · §3.2.2 response ID, InResponseTo, Destination · §5.1–5.4 signature coverage/inheritance/reference and KeyInfo
  • OASIS SAML 2.0 — Profiles, OASIS Standard§4.1.3.3–4.1.3.6 browser SSO roles and session choice · §4.1.4.1–4.1.4.3 request/response usage and processing · §4.1.4.5 POST; §4.1.5 unsolicited responses
  • OASIS SAML 2.0 Approved Errata 05 — 1 May 2012Status and latest approved alias · E26 response/bearer/POST signature and processing clarification · E46 audience OR within / AND between restrictions · E52 subject confirmation time is RP confirmation window
  • OWASP SAML Security Cheat SheetValidate Signatures: trusted schema/key provenance and security element selection · Validate Protocol Processing Rules · X.509 Certificate Considerations: IdP/SP signing trust association