Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-15.02

OIDC, ID token ve SSO

Aynı OP ile login olan iki Atlas uygulaması, ayrı RP session’ları üretir. ID token’ın alıcısı ve key provenance bu ayrımın merkezidir.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

B session oluştu

  1. SSO context

    OP session ve Atlas A session zaten geçerli; B’nin kendi session’ı henüz yoktur.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok; transaction bound
  2. B token aldı

    Önceden tamamlanan code exchange’in token response’u B’ye ulaştı; authentication validation bekliyor.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    ID alias received; validation pending
  3. B ID gate

    B için aud=[atlas-rp-b] eşleşir; issuer ve güvenilen key kaynağı kabul edilir. Verilen signature sonucu, transaction nonce’u ve now=1050 < exp=2000 koşulu da uygundur. B ID token’ı kabul eder; kendi session’ını henüz oluşturmamıştır.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    ID accepted; no session yet
  4. B local session

    ID gate sonrasında B issuer/subject binding’iyle kendi session’ını üretir; A veya OP session’ını değiştirmez.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session created locally
  5. Browser receipt

    B’nin local sonucu browser’a ulaştı; A’nın session’ı ve OP authentication context’i bağımsız kalır.

    Browser
    B session alias received
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session created locally

Audience yanlış

  1. SSO context

    OP session ve Atlas A session zaten geçerli; B’nin kendi session’ı henüz yoktur.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok; transaction bound
  2. B token aldı

    Önceden tamamlanan code exchange’in token response’u B’ye ulaştı; authentication validation bekliyor.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    ID alias received; validation pending
  3. B ID gate

    Gelen ID token aud=[atlas-rp-a] taşır, B ise clientId=atlas-rp-b için kabul eder. Signature, nonce ve zaman olumlu olsa da audience eşleşmediğinden ID kabulü reddedilir. B yeni local identity veya session oluşturmaz.

    Browser
    A session alias; B yok
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    ID audience denied; no session
  4. Browser receipt

    B’nin local sonucu browser’a ulaştı; A’nın session’ı ve OP authentication context’i bağımsız kalır.

    Browser
    B login error received; no B cookie
    OpenID Provider
    OP session valid; response ready
    Atlas A · RP
    A session valid
    Atlas B · RP
    ID audience denied; no session

OP session doldu

  1. A ve B ayrıdır

    Browser’da A alias’ı vardır fakat B session’ı yoktur; OP session’ın süresi bağımsız olarak dolmuştur.

    Browser
    A alias; B yok; prompt=none
    OpenID Provider
    OP session expired
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok
  2. OP request aldı

    Normal prompt=none authentication isteği OP’ye ulaştı; OP session gate’i henüz sonuç vermedi.

    Browser
    A alias; B yok; prompt=none
    OpenID Provider
    prompt=none received; session pending
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok
  3. OP login ister

    Seçili OP policy’si sessiz authentication yapamaz ve login_required kararı üretir; RP A’ya dokunmaz.

    Browser
    A alias; B yok; prompt=none
    OpenID Provider
    login_required selected; no ID token
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok
  4. Browser hata aldı

    OP’nin error response’u browser’a ulaştı; B session oluşmaz ve A’nın önceki session’ı geçerli kalır.

    Browser
    OP error received; no B session
    OpenID Provider
    login_required selected; no ID token
    Atlas A · RP
    A session valid
    Atlas B · RP
    B session yok

ROLLER · STATE · VERİ AKIŞI

OAuth’ın üstüne authentication bilgisi

OIDC, OAuth akışına End-User authentication bilgisini standart biçimde ekler. Client burada Relying Party, identity authority OpenID Provider’dır; genel IdP sözcüğü OIDC dışındaki federation sistemleri için de kullanılabilir. Seçili code flow’da openid scope’u OIDC isteğini belirtir. Token endpoint yanıtında ID token ve access token farklı işler görür: ID token RP’ye authentication olayını anlatır; access token uygun resource endpoint’te kullanılır. UserInfo varsa o endpoint’in credential’ı access token’dır; ID token’ı Notes API bearer credential’ı gibi kullanmayız.

Mina önce Atlas A’ya, sonra Atlas B’ye gider. OP’nin Mina’yı authenticate ettiği bir session bulunması, ikinci authentication’ın yeni parola ekranı olmadan tamamlanmasına yardımcı olabilir. B yine kendi transaction’ını başlatır, kendi client_id audience’ına uygun ID token’ı doğrular ve kendi session’ını üretir. OP→B bilgisi, A’nın cookie’sinin B’ye taşınması değildir. Consent, authentication freshness veya OP policy’si ek etkileşim isteyebilir; SSO her koşulda sessiz login vaadi değildir.

Claim’leri okuyabilmek doğrulamak değildir

Artifact’te iss=https://id.example.org, sub=subject-Mina ve aud=[atlas-rp-b] seçilidir. Stable local user anahtarı issuer ile subject çiftidir; display name veya email bu garantiyi taşımaz. RP önceden güvenilen issuer’ı exact karşılaştırır, kendi client_id’sinin audience’ta bulunduğunu ve ek audience’ların kabul edilir olduğunu denetler. Expiration zero-leeway örneğinde now<exp ister. Nonce authentication request’te gönderildiyse ID token’da bulunup transaction’daki nonce ile eşleşmelidir; her OIDC grant’inde her yeni token için bağımsız nonce varmış gibi genelleme yapılmaz.

Seçili RP profili registered RS256 algoritması ve issuer’ın güvenilir metadata’sındaki JWKS signing key’iyle signature kontrolü yapar. Token’ın kid alanı key seçimine yardım edebilir; key kaynağını güvenilir yapmaz. Discovery issuer’ı, configuration’ı almak için kullanılan issuer ve ID token iss aynı bağlamda eşleşir. Key değişiminde güvenilen issuer kaynağı korunur; token içinden gelen key URL’sini trust anchor saymayız. Bu artifact actual JWT/JWK içermez: key provenance ve signature sonucu deklaratif alanlardır, cryptographic doğrulama koşulları açıklanır fakat çalıştırılmış sayılmaz.

Core §3.1.3.7 code flow’da doğrudan token endpoint iletişiminden alınan ID token için issuer doğrulamasında TLS server validation’ın signature kontrolü yerine kullanılabilmesine izin verir. Bu ders daha dar signature-check profilini seçer; bütün OIDC bağlamları için bu istisnayı yok saymaz. Ayrıca algoritma seçimi, azp extension bağlamı, iat için yerel kabul aralığı, requested acr ve auth_time/max_age koşulları policy’ye göre ele alınır. Tek audience seçmemiz bu diğer profil ayrıntılarının gerçekten doğrulandığı iddiasını taşımaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

RP farklı

  1. RP authentication profile seçildi

    Atlas B clientId=atlas-rp-b ve issuer=https://id.example.org için ID token kabul eder. ID token recipient’ı RP authentication’dır; notes-api resource access için access token ayrı türdür.

    ID token profile
    audience-denied
    RP validation
    RP gate okunmadı
    Local session boundary
    RP B session yok
  2. Signature ile context ayrıldı

    signatureValidDeclared=true olarak verilmiştir. RegisteredAlgorithm RS256 olsa da bu predicate key provenance ve recipient kontrolünü tek başına tamamlamaz.

    ID token profile
    audience-denied
    RP validation
    Signature predicate=true
    Local session boundary
    RP B session yok
  3. RP’nin failed gate’i korundu

    aud=[atlas-rp-a] geldiğinde audienceMatches=false olur. A için assertion, B’de authentication kabulü değildir; decode işlemi bu recipient sınırını değiştirmez.

    ID token profile
    audience-denied
    RP validation
    Audience A ≠ RP B
    Local session boundary
    RP B session yok
  4. Nonce ve time olumlu sonucu yeterli sayılmadı

    Nonce bu case’te eşleşir ve now=1050, exp=2000 sınırının içindedir. Bu olumlu koşullar failed audience gate’ini telafi etmez.

    ID token profile
    audience-denied
    RP validation
    Nonce/time uygun; ID reject
    Local session boundary
    RP B session yok
  5. Local identity kabulü durduruldu

    Expected ID acceptance=false’tur. RP B, okunabilir sub=subject-Mina alanından yeni authenticated local context veya session üretmez.

    ID token profile
    audience-denied
    RP validation
    ID acceptance=false
    Local session boundary
    Yeni RP session kurulmaz
  6. Authentication ve API yetkisi ayrı kaldı

    RP authentication denial bu case’in sonucudur. OP session veya Atlas A session’ı otomatik silinmez; notes-api token ve object policy sonucu da bu red’den çıkarılmaz.

    ID token profile
    audience-denied
    RP validation
    Known: RP B ID rejection
    Local session boundary
    Other session/API state ayrı

Key kaynağı

  1. RP authentication profile seçildi

    Atlas B clientId=atlas-rp-b ve issuer=https://id.example.org için ID token kabul eder. ID token recipient’ı RP authentication’dır; notes-api resource access için access token ayrı türdür.

    ID token profile
    untrusted-key
    RP validation
    RP gate okunmadı
    Local session boundary
    RP B session yok
  2. Signature ile context ayrıldı

    signatureValidDeclared=true olarak verilmiştir. RegisteredAlgorithm RS256 olsa da bu predicate key provenance ve recipient kontrolünü tek başına tamamlamaz.

    ID token profile
    untrusted-key
    RP validation
    Signature predicate=true
    Local session boundary
    RP B session yok
  3. RP’nin failed gate’i korundu

    keyProvenance=false’tur. Beklenen kid alias’ının görünmesi veya issuer claim’inin eşleşmesi trusted signing-key kaynağını kurmaz.

    ID token profile
    untrusted-key
    RP validation
    Key provenance=false
    Local session boundary
    RP B session yok
  4. Nonce ve time olumlu sonucu yeterli sayılmadı

    Nonce bu case’te eşleşir ve now=1050, exp=2000 sınırının içindedir. Bu olumlu koşullar failed key provenance gate’ini telafi etmez.

    ID token profile
    untrusted-key
    RP validation
    Nonce/time uygun; ID reject
    Local session boundary
    RP B session yok
  5. Local identity kabulü durduruldu

    Expected ID acceptance=false’tur. RP B, okunabilir sub=subject-Mina alanından yeni authenticated local context veya session üretmez.

    ID token profile
    untrusted-key
    RP validation
    ID acceptance=false
    Local session boundary
    Yeni RP session kurulmaz
  6. Authentication ve API yetkisi ayrı kaldı

    RP authentication denial bu case’in sonucudur. OP session veya Atlas A session’ı otomatik silinmez; notes-api token ve object policy sonucu da bu red’den çıkarılmaz.

    ID token profile
    untrusted-key
    RP validation
    Known: RP B ID rejection
    Local session boundary
    Other session/API state ayrı

VARSAYIM · SINIR · KONTROL

Authentication sonucu yanlış yerde kullanılınca

B’ye gelen token’ın audience’ı Atlas A ise signature doğru kabul edilse bile B’de authentication kabul edilmez. Audience-denied branch’i başka uygulama için hazırlanmış bir assertion’ın sınırını gösterir; claim’in okunması bu sınırı kaldırmaz. Untrusted-key satırında kid beklenen alias olsa dahi issuer-key provenance başarısızdır. SignatureValidDeclared=true bu eksik bağın yerine geçmez. Etki analizi için hangi yanlış koşulun local user binding ve RP session üretimine kadar taşındığını sor; yalnız “JWT geldi” cevabı yeterli değildir.

OP session expired branch’inde prompt=none isteği OP’ye ulaşır, fakat OP seçili policy’de login_required döndürür. Atlas A’nın daha önce oluşturulmuş session’ı modelde hâlâ geçerlidir; B’ninki yoktur. Bu üç state’in ayrı kalması hatayı görünür kılar. Aynı şekilde A’dan logout olmak, uygulanmış bir federated logout mekanizması yoksa OP ve B’nin session’larını kendiliğinden silmez. Burada logout protokolleri çalıştırılmaz; bağımsız lifetime ve invalidation sahipliği anlatılır.

Identity sonrası resource policy

ID token’dan local user elde etmek, o user’ın tenant’ında hangi record’a erişebileceğini açıklamaz. API tarafında access token doğrulaması ve resource authorization ayrı devam eder. Email’i doğrudan account join anahtarı saymak da issuer/subject bağına farklı bir iş kuralını gizlice ekler. Hesap linking, organization membership ve authentication strength, kendi policy ve kanıtlarını ister. Bu derste saldırı yöntemi yerine, geçerli authentication bilgisinin neyi söylemediğine ve yanlış eşitlemenin hangi veri kararını etkilediğine bakıyoruz.

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

Hareket olmadan bütün senaryoları oku

RP B oluştu

  1. SSO session kaydı seçildi

    Bu case OP session, RP A session ve RP B’nin before/after state’ini ayrı alanlarla gösterir. SSO tek bir global cookie veya ortak session kaydı değildir.

    SSO observation
    case=normal
    OP/RP session review
    Session owner’ları okunmadı
    Session conclusion
    RP B sonucu bilinmiyor
  2. Başlangıç local session’ları okundu

    RP A true, RP B before false’tur. OP session true olduğundan OP yeniden authentication istemeden kendi policy’sini değerlendirebilir.

    SSO observation
    case=normal
    OP/RP session review
    RP A=true; RP B before=false
    Session conclusion
    OP session=true
  3. OP ve RP acceptance ayrıldı

    Normal ID validation accepted sonucu RP B’ye aittir. OP state true olsa da RP issuer/audience/nonce/key/time gate’lerini kendi profile’ında uygular.

    SSO observation
    case=normal
    OP/RP session review
    ID accepted=true
    Session conclusion
    RP B sonucu inceleniyor
  4. RP B transition gözlemi okundu

    rpBAfter=true normal ID acceptance sonrası local session oluştuğunu gösterir. RP’nin session lifetime’ı ID token exp ile otomatik aynı değildir.

    SSO observation
    case=normal
    OP/RP session review
    RP A=true; RP B after=true
    Session conclusion
    Local lifetime’lar ayrı
  5. Logout propagation kanıtı eklenmedi

    logoutProtocolImplemented=false profile sınırıdır. A logout, OP expiry veya browser cleanup’tan diğer session’ların güncel state’i hakkında otomatik propagation çıkarılmaz.

    SSO observation
    case=normal
    OP/RP session review
    Session ownership ayrı
    Session conclusion
    UNKNOWN: federated logout propagation
  6. SSO hükmü kendi session scope’unda kaldı

    Bu row normal RP B creation’ını açıklar; gerçek browser cookie acceptance veya notes-api resource authorization sonucu değildir.

    SSO observation
    case=normal
    OP/RP session review
    Known: independent RP states
    Session conclusion
    RP B created

OP session bitti

  1. SSO session kaydı seçildi

    Bu case OP session, RP A session ve RP B’nin before/after state’ini ayrı alanlarla gösterir. SSO tek bir global cookie veya ortak session kaydı değildir.

    SSO observation
    case=op-expired
    OP/RP session review
    Session owner’ları okunmadı
    Session conclusion
    RP B sonucu bilinmiyor
  2. Başlangıç local session’ları okundu

    RP A true, RP B before false’tur. OP session false’tur; RP A’nın önceden kurulmuş session’ı yine true kalır.

    SSO observation
    case=op-expired
    OP/RP session review
    RP A=true; RP B before=false
    Session conclusion
    OP session=false
  3. OP ve RP acceptance ayrıldı

    prompt=none için OP login_required sonucu verir. Bu outcome password yanlış anlamına gelmez; sessiz authentication için OP state yeterli değildir.

    SSO observation
    case=op-expired
    OP/RP session review
    OP decision=login_required
    Session conclusion
    RP B sonucu inceleniyor
  4. RP B transition gözlemi okundu

    idAccepted=false ve rpBAfter=false kalır. OP session’ın bitmesi, RP A session’ını aynı anda iptal etmiş değildir.

    SSO observation
    case=op-expired
    OP/RP session review
    RP A=true; RP B after=false
    Session conclusion
    Local lifetime’lar ayrı
  5. Logout propagation kanıtı eklenmedi

    logoutProtocolImplemented=false profile sınırıdır. A logout, OP expiry veya browser cleanup’tan diğer session’ların güncel state’i hakkında otomatik propagation çıkarılmaz.

    SSO observation
    case=op-expired
    OP/RP session review
    Session ownership ayrı
    Session conclusion
    UNKNOWN: federated logout propagation
  6. SSO hükmü kendi session scope’unda kaldı

    Bu row silent SSO’nun OP’de durduğunu açıklar; RP A session bilinir, yeni RP B session yoktur. Browser privacy nedeni veya bütün kullanıcı session’larının bittiği sonucu eklenmez.

    SSO observation
    case=op-expired
    OP/RP session review
    Known: independent RP states
    Session conclusion
    No new RP B session

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

RP kendi gate ve session’ının sahibidir

Atlas B önce issuer, client registration ve kabul edilen algoritmayı configuration’da sabitler; metadata issuer eşleşmesini ve signing-key provenance’i korur. Transaction’da nonce gönderilmiş olması validation planında görünürdür. Gelen ID token’ı sadece decode eden UI yerine server-side doğrulama sonucu local identity binding’e giriş olur. Artifact’te normal, wrong-audience, expiry-equality, nonce-mismatch ve untrusted-key satırları aynı gate conjunction’ını sınar. Signature alanı sadece seçili synthetic sonuçtur; gerçek validator testinin yerine konmaz.

Doğrulama tamamlanmadan RP session üretilmez. Üretilen session RP’nin local lifetime, rotation ve invalidation policy’sine bağlıdır; ID token exp’i otomatik cookie lifetime değildir. OP yeniden authentication isteyebilirken RP mevcut session’ıyla kendi policy’si kapsamında hizmet verebilir; tersi de mümkündür. Fresh authentication gereken işlemler için max_age/auth_time gibi seçili koşulları açıkça tasarla. Consent, account selection veya browser cookie policy yüzünden sessiz SSO’nun durması normal branch’tir, hepsi yanlış parola diye gösterilmez.

OP ve RP session kanıtı

Kanıt kaydı OP response received, RP validation accepted ve RP session created olaylarını ayırır. A ve B session’larının birbirinden bağımsız kalması hem normal SSO hem OP-expired branch’inde kontrol edilir. UserInfo eklenirse dönen sub’un ID token sub’u ile eşleşmesi gibi o yolun koşulları ayrıca uygulanır; fixture bu endpoint’i çağırmaz. Gerçek OP, JWS library, key rotation, federated logout veya browser third-party-cookie davranışı bu sahnenin tamamlanmasıyla doğrulanmış olmaz.

ŞİMDİ VAKAYA UYGULA

ID token acceptance hangi local state’i kurar?

Atlas A ve B kendi session’larını yönetir. RP B recipient ve key provenance gate’leri, OP state ve API permission’dan ayrı tutulur.

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

Atlas A/B identity ve session matrisi

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

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "flow": "code",
    "scope": [
      "openid",
      "notes:read"
    ],
    "issuer": "https://id.example.org",
    "clientId": "atlas-rp-b",
    "registeredAlgorithm": "RS256",
    "signatureCheckSelected": true,
    "nonceSent": true,
    "clockLeeway": 0,
    "actualJwtIncluded": false,
    "actualSignatureVerification": false,
    "logoutProtocolImplemented": false
  },
  "idToken": {
    "alias": "id-B",
    "iss": "https://id.example.org",
    "sub": "subject-Mina",
    "aud": [
      "atlas-rp-b"
    ],
    "exp": 2000,
    "iat": 1000,
    "nonceAlias": "nonce-B",
    "kidAlias": "issuer-signing-B"
  },
  "trustedKeys": {
    "configuredIssuer": "https://id.example.org",
    "metadataIssuer": "https://id.example.org",
    "jwksUri": "https://id.example.org/keys",
    "provenanceAccepted": true,
    "signatureValidDeclared": true,
    "algorithm": "RS256"
  },
  "validationCases": [
    {
      "name": "normal",
      "issuerMatches": true,
      "audienceMatches": true,
      "keyProvenance": true,
      "signatureValidDeclared": true,
      "algorithmAccepted": true,
      "nonceMatches": true,
      "now": 1050,
      "expected": true,
      "iss": "https://id.example.org",
      "aud": [
        "atlas-rp-b"
      ],
      "nonceAlias": "nonce-B",
      "algorithm": "RS256"
    },
    {
      "name": "audience-denied",
      "issuerMatches": true,
      "audienceMatches": false,
      "keyProvenance": true,
      "signatureValidDeclared": true,
      "algorithmAccepted": true,
      "nonceMatches": true,
      "now": 1050,
      "expected": false,
      "iss": "https://id.example.org",
      "aud": [
        "atlas-rp-a"
      ],
      "nonceAlias": "nonce-B",
      "algorithm": "RS256"
    },
    {
      "name": "expiry-equality",
      "issuerMatches": true,
      "audienceMatches": true,
      "keyProvenance": true,
      "signatureValidDeclared": true,
      "algorithmAccepted": true,
      "nonceMatches": true,
      "now": 2000,
      "expected": false,
      "iss": "https://id.example.org",
      "aud": [
        "atlas-rp-b"
      ],
      "nonceAlias": "nonce-B",
      "algorithm": "RS256"
    },
    {
      "name": "nonce-mismatch",
      "issuerMatches": true,
      "audienceMatches": true,
      "keyProvenance": true,
      "signatureValidDeclared": true,
      "algorithmAccepted": true,
      "nonceMatches": false,
      "now": 1050,
      "expected": false,
      "iss": "https://id.example.org",
      "aud": [
        "atlas-rp-b"
      ],
      "nonceAlias": "different-transaction",
      "algorithm": "RS256"
    },
    {
      "name": "untrusted-key",
      "issuerMatches": true,
      "audienceMatches": true,
      "keyProvenance": false,
      "signatureValidDeclared": true,
      "algorithmAccepted": true,
      "nonceMatches": true,
      "now": 1050,
      "expected": false,
      "iss": "https://id.example.org",
      "aud": [
        "atlas-rp-b"
      ],
      "nonceAlias": "nonce-B",
      "algorithm": "RS256"
    }
  ],
  "sessions": [
    {
      "case": "normal",
      "opSession": true,
      "rpA": true,
      "rpBBefore": false,
      "idAccepted": true,
      "rpBAfter": true
    },
    {
      "case": "audience-denied",
      "opSession": true,
      "rpA": true,
      "rpBBefore": false,
      "idAccepted": false,
      "rpBAfter": false
    },
    {
      "case": "op-expired",
      "opSession": false,
      "rpA": true,
      "rpBBefore": false,
      "prompt": "none",
      "opDecision": "login_required",
      "idAccepted": false,
      "rpBAfter": false
    }
  ],
  "tokenRecipients": {
    "id-B": "atlas-rp-b authentication",
    "access-B": "notes-api resource access",
    "session-B": "atlas-rp-b local session lookup"
  },
  "omitted": [
    "actual code exchange",
    "actual JWT/JWS/JWKS bytes",
    "UserInfo call",
    "azp extensions",
    "acr and max_age requested policies",
    "federated logout",
    "browser third-party-cookie policy",
    "iat freshness and client-specific accepted range"
  ]
}
idToken
Authentication claim alias’ları; stable identity iss/sub çiftidir.
trustedKeys
Seçili issuer metadata ve key provenance, kid’den ayrı.
validationCases
Gates birlikte gerekli; gerçek crypto sonucu değildir.
sessions
OP, A ve B session sahipliği bağımsızdır.
tokenRecipients
ID token, access token ve local session’ın farklı alıcıları.

Seçili single-audience RS256 profilidir; signatureValidDeclared bir fixture koşuludur. Gerçek JWT decode/JWS, metadata fetch, cookie veya OP çalıştırılmaz.

İki yanlış kanı

A’da login olmak B’nin session’ını da üretir.

OP session yeniden authentication’ı kolaylaştırabilir; B kendi transaction, validation ve session’ını oluşturur.

kid doğruysa key güvenilirdir.

kid yalnız seçime yardım eder; key’in doğrulanmış issuer kaynağı ve kabul edilen algoritması ayrı gereklidir.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

ID token için signatureValidDeclared=true, fakat keyProvenance=false. RP-B session kurulabilir mi?

  1. Evet. Signature true ise hangi key kullanıldığı önemsizdir.
  2. Hayır. untrusted-key sonucu reddedilir.
Gerekçeli cevabı oku

Hayır. untrusted-key sonucu reddedilir. — Signature sonucu, güvenilen issuer/JWKS kaynağının yerine geçmez. Bu kayıtta doğrulama koşullarının tamamı sağlanmamıştır.

OP session süresi dolmuş, RP-A session aktif. prompt=none için login_required dönüyor. RP-A kendiliğinden logout olur mu?

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

sessions[2]
{"case":"op-expired","opSession":false,"rpA":true,"rpBBefore":false,"prompt":"none","opDecision":"login_required","idAccepted":false,"rpBAfter":false}
  1. Hayır. RP-A aktif kalır; RP-B session kurulmaz.
  2. Evet. OP session bitince bütün RP session’lar silinir.
Gerekçeli cevabı oku

Hayır. RP-A aktif kalır; RP-B session kurulmaz. — RP-A’nın kendi session’ı bu kayıtta aktif kalır. prompt=none isteği yeni bir RP-B session’ı kuramaz; OP etkileşim gerektirir. Bu sonuç, etkileşimli bir authentication yolunun daha sonra da başarısız olacağını göstermez.

ID-B audience değeri RP-B, access-B alıcısı notes-api. ID token neden API authorization yerine kullanılmaz? Nonce’un rolünü de açıkla.

Gerekçeli cevabı oku

ID token, RP’nin OP authentication sonucunu doğrulamasına hizmet eder. Issuer, audience, zaman ve signature koşulları kontrol edilir; request’te nonce gönderildiyse transaction bağı da doğrulanır. Access token, RS’nin resource erişimi bağlamı içindir. Yerel session lookup ise ayrı bir taşıyıcı kullanır. ID token’ın RP audience’ı, API grant veya object izni değildir.

□ ID token, access token ve session taşıyıcılarının alıcılarını ayırdım.

□ Nonce kontrolünü ilgili login transaction’ına bağladım.

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

Kaynaklar ve kapsam

  • OpenID Connect Core 1.0 — Final incorporating errata set 2§1 Introduction and terminology; §2 ID Token · §3.1.2.1 Authentication Request: openid, prompt, nonce, max_age · §3.1.2.6 Authentication Error Response · §3.1.3.2 Token Request Validation; §3.1.3.5 Token Response Validation · §3.1.3.7 ID Token Validation; §3.1.3.8 Access Token Validation · §5.7 Claim Stability and Uniqueness · §5.3.1 UserInfo Request; §5.3.2 Successful UserInfo Response
  • OpenID Connect Discovery 1.0 — Final incorporating errata set 2§3 OpenID Provider Metadata: issuer, jwks_uri · §4.3 OpenID Provider Configuration Validation
  • RFC 9700 — Best Current Practice for OAuth 2.0 Security§2.1 Protecting Redirect-Based Flows; §2.1.1 Authorization Code Grant · §2.1.2 Implicit Grant; §2.2.1 Access Tokens; §2.2.2 Refresh Tokens · §2.3 Access Token Privilege Restriction; §2.4 Resource Owner Password Credentials Grant; §2.5 Client Authentication
  • OWASP Session Management Cheat SheetSameSite Attribute; Domain and Path Attributes · Session Expiration / Idle Timeout; Absolute Timeout · Renew the Session ID After Any Privilege Level Change
  • OWASP Authorization Cheat SheetRecommendations / Enforce Least Privileges · Recommendations / Deny by Default; Validate the Permissions on Every Request