OpenID Connect'te ID Token sona erme süresinin amacı nedir?


93

OpenID Connect'te bir erişim belirtecinin sona erme süresi vardır. Yetkilendirme kodu akışı için bu genellikle kısadır (ör. 20 dakika) ve ardından yeni bir erişim belirteci istemek için yenileme belirtecini kullanırsınız.

Belirteci İD da bir son kullanım süresine sahiptir. Sorum şu ki, bunun amacı nedir?

Yenileme belirtecinin sona erme süresinden daha kısa olan herhangi bir kimlik belirteci sona erme süresi, sonunda süresi dolmuş bir kimlik belirtecine, ancak geçerli bir erişim jetonuna sahip olacağınız anlamına gelir.

Öyleyse demek istiyorsun:

  • ID jetonunuza yenileme jetonunun sona erme tarihinden daha uzun bir süre verin
  • erişim jetonuyla aynı sona erme tarihine ayarlayın ve süresi dolduğunda bir işlem yapın (ne?) veya
  • sadece müşterinizdeki kimlik jetonunu aldıktan sonra tüketin, ardından son kullanma süresini göz ardı edin.

OpenID Bağlan şartname sadece doğrulanırken bir kimlik belirteci olduğunu söylüyor

"The current time MUST be before the time represented by the exp Claim."

(muhtemelen) yukarıdaki üçüncü seçeneği destekler.


DÜZENLE

OpenID Bağlan OAuth2'ye üzerine inşa gibi aşağıda tamamlayıcı sorunun cevabı bulunabilir OAuth2 şartname diyor

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.

İlgili bir soru, belirteçler için bir yetkilendirme kodu değiştirdiğinizde, aynı belirtim aşağıdaki gibi bir yanıt alabileceğinizi söylüyor:

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}

Peki bu durumda "expires_in" neyle ilgilidir? Erişim jetonu, yenileme jetonu veya kimlik jetonu?

(Bilgi için, IdentityServer3 bunu erişim belirteci sona erme süresine ayarlar).

Yanıtlar:


91

Sorumun arkasındaki bazı varsayımların yanlış olduğunu keşfettiğim için kendi sorumu yanıtlıyorum, soruyu yeniden yazmak yerine burada açıklığa kavuşturmak çok daha kolay.

Kimlik belirteci, bir Müşteriye kullanıcının kimliğini doğruladığını ve bunun sonucunda kim olduklarını kanıtlamak içindir.

Bir Müşteri bir Kimlik belirteci aldığında, genellikle bunu bir ClaimsIdentity'ye dönüştürmek gibi bir şey yapar ve bunu, örneğin bir çerez kullanarak devam ettirir.

Bu kullanım noktasında ID jetonunun süresi dolmuş olmalıdır (yeni verildiği için böyle olması gerekir). Ancak bundan sonra tekrar kullanılmaz, bu nedenle kullanıcının hala aktif bir oturumu varken süresinin dolup dolmaması önemli değildir . İstemci, ihtiyaç duyduğu kimlik doğrulama bilgilerine sahiptir ve kullanıcı tekrar oturum açmadan önce oturumun ne kadar süreceği konusunda kendi politikasını seçebilir.

Soruyu sorarken yanlış varsayımım, bir kimlik belirteci ve erişim belirtecinin birlikte kullanılması gerektiğiydi ve bu nedenle her ikisinin de geçerli son kullanma tarihlerine sahip olması gerekiyordu. Bu, çeşitli nedenlerden dolayı yanlıştır:

  • Kimlik jetonları yalnızca bir Müşterinin kimliğini doğrulamak içindir (yukarıda açıklandığı gibi).
  • Erişim belirteçlerinin İstemcilerle ilgisi yoktur. Kaynaklara erişim içindir ve bir Müşteri bunları yalnızca sırayla bir kaynağı çağırması gerektiğinde ele alır.
  • Bağımsız bir MVC veya WebForms uygulaması gibi bir şey yalnızca bir kimlik belirtecine ihtiyaç duyar. Harici bir kaynağı çağırmıyorsa, erişim izni verecek bir şey yoktur, dolayısıyla erişim belirteci yoktur.

3
Bunun için herhangi bir referansınız var mı? Eugenio, cevabında bir kimlik kartını yenileyebileceğinizi iddia ediyor. Bu doğru mu?
AndyD

6
Son kullanma tarihini uzatmak anlamında bir kimlik belirtecini yenileyemezsiniz (bir erişim belirtecinin bir çevrimdışı erişim belirteci kullanılarak yenilenebilmesi gibi). Ancak, OpenID Connect Sağlayıcısı ile süresi dolmamış bir kimlik doğrulama oturumunuz varsa (örneğin, IdentityServer3'te oturum açtıktan sonra bir tanımlama bilgisi), o zaman bir oturum açma isteğini tekrarladığınızda, Sağlayıcı kimlik doğrulamayı atlayabilir (çünkü tanımlama bilgileri bunu yaptığınızı söyler) ve yalnızca bir yeni Kimlik Simgesi (ve istenirse erişim belirteci). Bu, elbette, yalnızca çerezin Kimlik Jetonundan daha uzun bir kullanım ömrüne sahip olması durumunda çalışır.
Appetere

1
Bunu yapabilmenize rağmen , bunu yapmanın doğru olup olmadığından emin değilim. Ayrıca, bir avuç tarayıcı yeniden yönlendirmesi gerektireceğinden, son kullanıcı için sorunsuz olmayacaktır.
Kir

@Kir Javascript tek sayfalı bir uygulama (SPA) kullanıyorsanız, erişim belirteci yenilemesindeki ilk girişim tipik olarak bir arka plan işlemi olacaktır, bu nedenle son kullanıcı kesintiye uğramaz. Örneğin, kaynağınızın API'si erişim belirtecinin süresinin dolduğunu yanıtlarsa, SPA, Kimlik Sunucusuna yeni bir erişim belirteci için bir arka plan isteğinde bulunur. Yalnızca bu başarısız olursa (kimlik simgesinin süresi dolduğu için), kullanıcıdan tekrar oturum açmasını istemeniz gerekir. Örnek kod için github.com/IdentityServer/IdentityServer3.Samples/tree/master/… adresindeki JavascriptImplicitClient örneğine bakın .
Appetere

OIdC sağlayıcısı onu Refresh_token isteğinden döndürürse, Id_token'ı yenileyebilirsiniz. Stackoverflow.com/questions/41168304/… ve stackoverflow.com/questions/41741982/…
sayfalarına

37

Bunu kendi nedenlerimle araştırmak zorunda kaldım ve yazdım, bu yüzden öğrendiklerimi buraya göndereceğim ...

İlk olarak, soruyu bariz bir şekilde belirtme riski altında cevaplayacağım: Kimlik jetonuna güvenilemez ve mevcut zaman süresi dolmuş süreden daha büyükse içeriği göz ardı edilmelidir. Soruyu soran kişinin cevabı, kullanıcının ilk kimlik doğrulamasından sonra Kimlik Simgesinin tekrar kullanılmadığını belirtir. Bununla birlikte, Kimlik Simgesi kimlik sağlayıcı tarafından imzalandığından , bir uygulamanın kullanabileceği diğer hizmetlere kullanıcının kim olduğunun güvenilir bir şekilde belirlenmesi için herhangi bir zamanda bir yol verilmesi kesinlikle yararlı olabilir. Basit bir kullanıcı kimliği veya e-posta adresi kullanmak güvenilir değildir çünkü kolayca sahte olabilir (herkes bir e-posta adresi veya kullanıcı kimliği gönderebilir), ancak bir OIDC Kimlik Simgesi Yetkilendirme sunucusu tarafından imzalandığı için (ki bu genellikle üçüncü taraf olma avantajına da sahiptir) sahtecilik yapılamaz ve çok daha güvenilir kimlik doğrulama mekanizması.

Örneğin, bir mobil uygulama, bir arka uç hizmetine , kullanıcının uygulamayı kullanan kim olduğunu söyleyebilmek isteyebilir ve bunu, ilk kimlik doğrulamasını takip eden kısa sürenin ardından, Kimlik Simgesinin süresi dolduğunda yapması gerekebilir, ve bu nedenle, kullanıcının kimliğini güvenilir bir şekilde doğrulamak için kullanılamaz.

Bu nedenle, erişim belirtecinin (yetkilendirme için kullanılır - kullanıcının sahip olduğu izinleri belirtir) yenilenmesi gibi, Kimlik Simgesini (kimlik doğrulama için kullanılır - kullanıcının kim olduğunu belirterek) yenileyebilir misiniz ? OIDC spesifikasyonuna göre cevap açık değil. OIDC / OAuth'ta token almak için üç "akış" vardır, Yetkilendirme Kodu akışı, Örtük akış ve Hibrit akış (aşağıda atlayacağım çünkü diğer ikisinin bir çeşidi).

İçin OIDC / OAuth içinde örtülü akışı size Yetkilendirme bitiş noktasına tarayıcıda kullanıcı yönlendirme ve dahil ederek yetki uç noktada Kimlik Token talep id_tokendeğeri olarak response_typeistek parametresi. Bir Örtülü Akışı Başarılı Doğrulama Tepki içerecek şekilde GEREKLİ id_token.

İçin Kimlik Doğrulama Kodu akışı , müşteri belirtir codedeğeri olarak response_typeistek parametresi yetkilendirme bitiş noktasına kullanıcıyı yönlendirme yaparken. Başarılı bir yanıt, bir yetkilendirme kodunu içerir. İstemci istemci, yetkilendirme kodu ile belirteç uç noktasına bir talepte bulunur ve OIDC Çekirdek Bölüm 3.1.3.3 Başarılı Belirteç Yanıtı'na göre yanıtın bir Kimlik Simgesi İÇERMESİ ZORUNLUDUR .

Yani her iki akış için de başlangıçta Kimlik Jetonunu bu şekilde alırsınız, ancak onu nasıl yenilersiniz? OIDC Bölüm 12: Yenileme Belirteçlerinin kullanılması, Yenileme Belirteci Yanıtıyla ilgili aşağıdaki ifadeye sahiptir:

Yenileme Belirtecinin başarılı bir şekilde doğrulanması üzerine yanıt gövdesi, bir id_token içermemesi dışında Bölüm 3.1.3.3'ün Belirteç Tepkisidir .

O olmayabilir Kimlik Token içerir ve kimlik kodu şu zorlamak belirtilen yolu yoktur çünkü, yanıt kimliği Token içermeyecek kabul gerekir. Dolayısıyla teknik olarak, bir yenileme belirteci kullanarak bir Kimlik Belirtecini "yenilemenin" belirli bir yolu yoktur. Bu nedenle, yeni bir Kimlik Simgesi almanın tek yolu, kullanıcıyı yetkilendirme uç noktasına yeniden yönlendirerek ve yukarıda açıklandığı gibi örtük akışı veya kimlik doğrulama kodu akışını başlatarak kullanıcıyı yeniden yetkilendirmek / doğrulamaktır . OIDC belirtiminiz eklese promptisteği parametresini yetkilendirme isteği istemci böylece talep olduğunu yetkilendirme sunucusu değil istemi herhangi UI kullanıcı, ancak yönlendirme hala vardır gerçekleşmesi.


Keyfi Yetkilendirme sağlayıcısıyla çalışmak için genel bir yazılım yazıyorsanız, id_token'ı yenilemeden döndürmeye güvenemezsiniz. Bununla birlikte, belirli bir sağlayıcıyla (IdentityServer4 gibi) çalışıyorsanız, kapasitesini kontrol edebilir ve yenileme talebinden sonra alınan id_token'ı kullanabilirsiniz
Michael Freidgeim

Peki id_token nasıl yenilenebilir?
jwilleke

@jwilleke AFAIK, yukarıda belirtildiği gibi "yeni bir Kimlik Simgesi almanın tek yolu, kullanıcıyı yetkilendirme uç noktasına yeniden yönlendirerek kullanıcıyı yeniden yetkilendirmek / doğrulamaktır"
Scott Willeke

@MichaelFreidgeim İlginç, Open ID Connect Discovery mekanizmasından mı bahsediyorsunuz ? Bunu tam olarak nasıl yapıyoruz?
Scott Willeke

1
"Yenilemenin yanıt gövdesi bir id_token içermeyebilir" ile ilgili iyi yanıt. Olumlu oy verildi. Bu arada, benim anladığım kadarıyla, OIDC belirtimleri yeni bir kimlik belirteci almak için Yenileme Belirtecini kullanmak için bir alan bırakıyor: müşteri bunu kapsamdan biri olarak "id_token" belirterek yapabilir; ancak burada genel uyarı yine de geçerlidir, çünkü talep ettiğiniz kapsamın karşılanıp karşılanmayacağına ilişkin son kararı Doğrulama Sunucusu verecektir.
RayLuo

7

Ben göre, doğru anlamak bu ve OpenID Bağlan Çekirdek 1.0 spec , kendisi belirteç kimlik oturumları devam edecek bir mekanizma olarak çerezler depolanır ve Müşteri her kimlik doğrulama gerektiren istekle gönderilebilir. Müşteri daha sonra kimlik jetonunu yerel olarak veya Sağlayıcının doğrulayıcı uç noktası aracılığıyla (eğer sağlanmışsa, Google'ın yaptığı gibi ) doğrulayabilir . Jetonun süresi dolmuşsa, bu sefer prompt=noneURL parametresinde olanlar dışında başka bir kimlik doğrulama talebinde bulunmalıdır . Ayrıca id_token_hintparametredeki süresi dolmuş kimlik belirtecini gönderdiğinizden emin olun , aksi takdirde Sağlayıcı bir hata döndürebilir.

Bu nedenle, Kimlik Belirtecinin süresinin dolması doğal görünmektedir, ancak prompt=noneyeni kimlik simgesinin kullanıcı müdahalesi olmadan sorunsuz bir şekilde elde edilebilmesini sağlar (tabii ki kullanıcı bu OpenID'den çıkmadıkça).


6

Aynı amaç: id_tokensüresi dolduktan sonra kullanamazsınız . Temel fark, id_tokenbir veri yapısı olmasıdır ve bilgi belirtecin kendisinde kodlandığı için herhangi bir sunucu veya uç nokta çağırmanıza gerek kalmaz. Normal access_token, genellikle opak bir yapıdır (bir GUID gibi).

Tüketicisi id_tokenher zaman bunun (zaman) geçerliliğini doğrulamalıdır.

IS'ye% 100 aşina değilim, ancak bunun uygun bir alan olduğunu tahmin ediyorum. Her zaman expiddiayı kontrol etmelisiniz .

Son kullanma tarihi, doğrulamalardan sadece biridir. id_tokene-postalar da dijital olarak imzalanır ve bu aynı zamanda gerçekleştirmeniz gereken bir doğrulamadır .


Teşekkürler Eugenio. Asıl sorum, kimlik kartının süresi dolduğunda ne yapmanız gerektiği? Kısa ömürlü bir erişim belirtecini yenilemek için bir yenileme belirteci kullanmanız gerektiğini düşündüm (muhtemelen yanlış bir şekilde). Ancak kimlik belirtecinin kullanım süresi erişim belirteciyle aynı süreye sahipse, hemen süresi dolmuş bir kimlik belirtecine sahip olursunuz, bu nedenle erişim belirtecini yenilemek anlamsız görünecektir. Sanırım burada bir şey eksik olabilir!
Appetere

1
Yeni bir access_token veya id_token almak için (iptal edilmemiş) renew_token'ı kullanırsınız. Veya basitçe kullanıcı olarak tekrar oturum açın. id_tokens mantıksal olarak access_tokens'e eşdeğerdir. Sadece farklı bir format.
Eugenio Pace

2
En son anlayışım, kullanıcının yetkilendirme sunucusuyla kimliği doğrulanmış bir oturumu olduğunda, erişim belirtecinin süresi dolduğunda yetkilendirme sunucusuna 401 => 302 yeniden yönlendirmenin, kullanıcının müdahalesi olmadan yeni erişim ve kimlik belirteçleri alacağıdır. Ancak çevrimdışı modda, yenileme_token'ı yalnızca belirli bir kullanıcının bazı kaynaklara erişmesine izin verildiğini belirten yeni bir erişim belirteci döndürecektir. Bir id_token döndüremez, çünkü bu, belirli bir kullanıcının kimliğinin doğrulandığını ve çevrimdışı modda olduğunu söyler.
Appetere

Bu, id_token ile access_token arasındaki farkın ne olduğuna ilişkin bir soruya harika bir cevap olacaktır (özellikle opak / referans belirteçleri kullanırken). Önce soruyu yanıtlamaya odaklanın ve ardından erişim belirteçlerinin ve kimlik belirteçlerinin nasıl kullanıldığını netleştirin.
Trent

5

Bir belirteci yenilemek, KULLANICI GİRİŞİ YAPILMADIĞINDA BİLE, yetkilendirme sunucusundan (bu durumda OP - OpenID-Connect Sağlayıcısı) bir şey istemek için onu tekrar kullanabileceğiniz anlamına gelir. Buna genellikle yalnızca sınırlı kaynaklar için ve yalnızca kullanıcı oturum açtıktan ve en az bir kez kimlik doğrulandıktan sonra izin verirsiniz. Yenileme belirteçlerinin kendileri de zaman açısından sınırlı olmalıdır.

OIDC örtük akışında , Yetkilendirme uç noktasını çağırırsınız ve
yanıtta tüm kapsamlar ve bunların içindeki tüm talep bilgileri ile birlikte kimlik belirtecini alırsınız.
Bir API'ye yapılan sonraki çağrıların kod akışı ile yapılması amaçlanmıştır .
Örtülü akış, yalnızca bir JavaScript'i veya yalnızca tarayıcıyı etkinleştirmeyi amaçlamaktadır. Bir sunucuyla etkileşim kuran bir uygulama değil.
Dolayısıyla, bu belirteci "yenilemenin" bir yolu olsa bile, güvenlik açısından çok uzun yaşamasına izin vermemelisiniz. Kimliği taklit eden yetkisiz kullanıcılar tarafından çalınacak ve yeniden kullanılacaktır. Bunun için yeni bir giriş yapmaya zorlamalısınız.

Gelen kod akış sen OP'ın Yetkilendirme bitiş noktası arama ve bir alma Yetkilendirme kodu (kısa için bir yetkilendirme jetonu veya yetkilendirme kodu olarak adlandırılır). Bu, örtülü akışta aldığınız id_token'a benzer şekilde, aynı nedenlerle sona ermelidir ve yenilenemez ve yenilenmemelidir.

Kullanıcı arayüzünüz veya uygulamanız daha sonra OP'nin Token uç noktasını çağırır ve (bazen kullanıcının OP'nin sunucusunda sahip olduğu kaynakların kullanımına izin vermek için bir UI aracılığıyla daha fazla onay vermesinden sonra) şunları alır:

  • Kimlik doğrulaması için bir id_token - oturum kapatma sırasında bir ipucu olarak, sona ermesinin artık önemli olmadığı durumlarda ve bu nedenle yukarıdaki nedenlerden dolayı sunucu çağrılarında bir daha asla kullanılmaması gereken bir id_token, sona ermeli ve asla yenilenmemelidir.
  • Bir erişim belirteci - daha sonra bir API çağrılırken OP'nin UserInfo uç noktasına verilebilir. Bu, talepleri döndürür ve API buna göre yetkilendirebilir.

Bu erişim belirtecini yenileyebilirsiniz, çünkü yalnızca API'ye kullanıcının sahip olduğu iddiaları ve kullanıcının size vermeyi kabul ettiği kaynakları (kapsamlar ve her kapsamın iddialarına göre) söyler. Yukarıda açıklandığı gibi bu, kullanıcı artık oturum açmadıktan sonra bile erişime izin vermek içindir. Elbette, id_token'ın yenilenmesine asla izin vermek istemezsiniz çünkü oturum açmadan kimliğe bürünmeye izin vermek istemezsiniz.


2
Örtülü akış hakkında söyledikleriniz kısmen yanlış. Örtük akışı kullanan bir istemci, bir kimlik belirtecine ek olarak bir erişim belirteci alabilir ve bu erişim belirtecini bir sunucuyla etkileşim kurmak için kullanabilir.
Shaun Luttin

Ortak bir uygulama vardır, id_token sona erdiğinde, istemci sunucudan yeni belirteçler talep eder, böylece kullanıcının tekrar yetkilendirmesine gerek kalmaz. Örneğin bkz. Damienbod.com/2017/06/02/…
Michael Freidgeim

4

Bu cevabı bir yorum olarak göndermek istedim, ancak StackOverflow'da çok aktif olmadığım için sanırım onu ​​alternatif bir cevap olarak gönderiyorum.

Ayrıca kullanmak id_tokenolarak id_token_hintbir oturum dışında kullanıcıyı log çalışırken http://openid.net/specs/openid-connect-session-1_0.html . Dürüst olmak gerekirse id_token, bu noktada süresinin dolmasının gerçekten önemli olduğunu düşünmüyorum, çünkü yalnızca belirli bir kullanıcının oturumunu kapatmakla ilgileniyorsunuz.


4

TLDR;

Yazdığı şeye güvenmeden önce kimlik jetonunu doğrulayın.

Daha fazla detay

OpenID Connect'te kimlik belirteci sona erme süresinin amacı nedir?

Amaç, istemcinin kimlik belirtecini doğrulamasına izin vermektir ve istemcinin , kimlik belirtecinin bilgilerini kullanan işlemlerden önce kimlik belirtecini doğrulaması gerekir .

Gönderen OpenID Örtülü Akış Spec :

Bu belgede tanımlanan doğrulama prosedürlerinden herhangi biri başarısız olursa, doğru şekilde doğrulanamayan bilgileri gerektiren herhangi bir işlem iptal edilmeli ve doğrulanamayan bilgiler KULLANILMAMALIDIR.

Bunu doğrulamak için Google'ın OpenID Connect belgeleri , kimlik belirteci doğrulaması hakkında şunları söylüyor:

Kimlik jetonlarını kullanışlı kılan bir şey, bunları uygulamanızın farklı bileşenlerine aktarabilmenizdir. Bu bileşenler, uygulamanın ve kullanıcının kimliğini doğrulayan hafif bir kimlik doğrulama mekanizması olarak bir kimlik belirteci kullanabilir. Ancak, kimlik belirtecindeki bilgileri kullanmadan veya kullanıcının kimliğini doğruladığına dair bir iddia olarak buna güvenmeden önce, onu doğrulamanız gerekir.

Bu nedenle, istemci uygulamamız kimlik belirtecinin içeriğine bağlı olarak bazı işlemler yapacaksa, kimlik belirtecini yeniden doğrulamamız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.