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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
B session oluştu
- 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
- 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
- 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
- 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
- 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ış
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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ğı
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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?
- Evet. Signature true ise hangi key kullanıldığı önemsizdir.
- 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}
- Hayır. RP-A aktif kalır; RP-B session kurulmaz.
- 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