Что такое намерение времени истечения срока действия маркера ID в OpenID Connect?



В OpenID подключите маркер доступа имеет срок действия. Для потока кода авторизации это обычно короткое время (например, 20 минут), после которого вы используете маркер обновления для запроса нового маркера доступа.



The идентификатор также имеет срок действия. Мой вопрос в том, какова цель этого?



любое время истечения срока действия маркера идентификатора меньше времени истечения срока действия маркера обновления будет означать, что в конечном итоге у вас будет истекший маркер идентификатора, но действительный маркер доступа.



Итак, вы должны:




  • дайте вашему ID-токену срок действия больше, чем срок действия токена обновления, или

  • установите его на тот же срок действия, что и маркер доступа, и выполните некоторые действия (что?), когда он истекает, или

  • просто потребляйте маркер ID в своем клиенте при получении, а затем игнорируйте время истечения срока действия после этого?


The спецификация OpenID Connect просто говорит, что при проверке маркера ID,



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


которые (возможно) поддерживает третий вариант.





EDIT



как OpenID Connect строит на OAuth2 ответ на дополнительный вопрос ниже можно найти в спецификация OAuth2 говорит,



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




связанный вопрос заключается в том, что когда вы обмениваете код авторизации на токены, та же спецификация говорит, что вы можете получить такой ответ как:



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


но к чему в данном случае относится" expires_in"? Маркер доступа, маркер обновления или маркер идентификатора?



(для сведения, IdentityServer3 устанавливает это время истечения маркера доступа).

898   7  

7 ответов:

Я отвечаю на свой собственный вопрос, поскольку обнаружил, что некоторые из предположений, лежащих в основе моего вопроса, были ошибочными, поэтому легче уточнить здесь, а не переписывать вопрос.

маркер ID предназначен для доказательства клиенту, что пользователь прошел проверку подлинности, и кто они в результате.

когда клиент получает маркер ID, он обычно делает что-то вроде преобразования его в ClaimsIdentity и сохраняет это, например, с помощью cookie.

идентификатор маркера чтобы не истек срок действия в этот момент использования (который он должен быть, так как он только что был выпущен). Но после этого он не используется снова, так что это не имеет значения, если он истекает пока пользователь все еще имеет активный сеанс. Клиент имеет необходимую ему информацию для проверки подлинности и, в свою очередь, может выбрать свою собственную политику для того, как долго длится сеанс, прежде чем пользователь должен снова войти в систему.

мое неверное предположение при задании вопроса состояло в том, что маркер ID и маркер доступа должны быть используется вместе, и поэтому оба должны иметь действительные сроки годности. Это неправильно по разным причинам:

  • маркеры ID предназначены только для аутентификации клиента (как описано выше).
  • маркеры доступа не имеют ничего общего с клиентами. Они предназначены для доступа к ресурсам, и клиент обрабатывает их только в том случае, если ему, в свою очередь, нужно вызвать ресурс.
  • что-то вроде автономного приложения MVC или WebForms только нужен идентификатор. Если это не вызывает внешний ресурс, нет ничего, чтобы предоставить доступ, поэтому нет маркера доступа.

Я должен был копаться в этом по моим собственным причинам и написал его, поэтому я опубликую то, что я узнал здесь...

во-первых, я отвечу на вопрос, рискуя заявить очевидное: токену ID нельзя доверять, и его содержимое должно игнорироваться, если текущее время больше, чем истекшее время. В ответе спрашивающего указано, что после первоначальной аутентификации пользователя маркер ID больше не используется. Однако, поскольку маркер идентификатора подпись на личности провайдер, это, конечно, может быть полезное в любое время, чтобы дать способ надежно определить, кто пользователь к другим услугам, которые приложение может использовать. Использование простого идентификатора пользователя или адреса электронной почты не надежный потому что его можно легко подделать (любой может отправить адрес электронной почты или идентификатор пользователя), но поскольку маркер идентификатора OIDC подписан сервером авторизации (который также обычно имеет преимущество быть третьей стороной) , он не может быть подделан и является гораздо более надежным механизм аутентификации.

например, мобильное приложение может захотеть иметь возможность сообщить серверной службе кто пользователь использует приложение, и ему может потребоваться сделать это после короткого периода после первоначальной проверки подлинности, в это время токен ID истекает и, таким образом, не может использоваться для надежной проверки подлинности пользователя.

поэтому, как и маркер доступа (используется для авторизации-указание разрешения пользователь) может будьте свежи,можете ли вы обновить маркер ID (используется для аутентификации-указание кто пользователь)? Согласно спецификации OIDC, ответ не очевиден. В OIDC / OAuth есть три "потока" для получения токенов, поток кода авторизации, неявный поток и гибридный поток (который я пропущу ниже, потому что это вариант двух других).

на неявный поток в OIDC / OAuth вы запрашиваете маркер идентификатора на конечная точка авторизации путем перенаправления пользователя в браузере на конечную точку авторизации и включения id_token значение response_type параметр запроса. Ан Неявный Поток Успешного Ответа Аутентификации требуется включить id_token.

на поток кода аутентификации клиент указывает code значение response_type параметра запроса при перенаправлении пользователя на конечную точку авторизации. Успешный ответ включает в себя код авторизации. Клиент клиент делает запрос к конечной точке с кодом авторизации и, по данным oidc Core раздел 3.1.3.3 успешный ответ токенаответ должен содержать маркер ID.

Итак, для любого потока, вот как вы изначально получаете маркер ID, но как его обновить? oidc раздел 12: использование токенов обновления имеет следующее утверждение о маркере обновления Ответ:

после успешной проверки токена обновления тело ответа является ответом токена раздела 3.1.3.3 за исключением того, что может не содержать маркер.

это не может содержат маркер идентификатора, и поскольку нет способа заставить его включить маркер идентификатора, вы должны предположить, что ответ не будет содержать маркер идентификатора. Таким образом, технически нет указанного способа "обновить" маркер идентификатора использование маркера обновления. Таким образом, единственный способ получить новый маркер ID-это повторно авторизовать / аутентифицировать пользователя, перенаправив его на конечную точку авторизации и запуск неявного потока или потока кода аутентификации, как описано выше. Спецификация OIDC добавляет prompt параметр запроса к запрос авторизации так что клиент может запрос что сервер авторизации не запрашивает пользователя с любым пользовательским интерфейсом, но перенаправление все еще должно произойти.

это то же самое намерение: вы не можете использовать id_token после его истечения. Главное отличие заключается в том, чтоid_token - Это структура данных, и вам не нужно будет вызывать какие-либо серверы или конечные точки, так как информация закодирована в самом токене. Обычный access_token обычно является непрозрачным артефактом (например, GUID).

потребитель id_token должен всегда проверять (время) его действительность.

Я не на 100% знаком с IS, но я бы предположил, что это поле удобства. Вы всегда следует проверять exp претензии.

срок действия-это только одна из проверок. id_tokens также имеют цифровую подпись, и это также проверка вы должны выполнить.

обновление токена означает, что вы можете использовать его снова для запроса чего - либо с сервера авторизации (в данном случае op-провайдер OpenID-Connect), даже если пользователь не вошел в систему. Обычно это разрешено только для ограниченных ресурсов и только после того, как пользователь вошел в систему и прошел проверку подлинности хотя бы один раз. Сами маркеры обновления также должны быть ограничены во времени.

в OIDC неявный поток вы называете авторизации конечная точка,
и получите маркер идентификатора в ответе вместе со всеми областями и в них всю информацию о претензиях.
Последующие вызовы API должны выполняться с помощью код.
Неявный поток предназначен для включения только javascript или только браузера приложения. Не приложение, которое взаимодействует с сервером.
Поэтому, даже если есть способ "обновить" этот токен, вы не должны - с точки зрения безопасности - позволить ему жить слишком долго. Он будет украден и использован неавторизованными пользователями, олицетворяющими идентификатор. Вы должны заставить новый логин для этого.

на код вы вызываете конечную точку авторизации OP и получаете код авторизации (также называется токен авторизации, или authcode для краткости). Это должно истекать аналогично id_token, который вы получили в неявном потоке, по тем же причинам и не может и не должен быть обновлен.

ваш пользовательский интерфейс или приложение затем вызовите Конечная точка токена OP и получает (иногда после дальнейшего согласия пользователя через пользовательский интерфейс, чтобы разрешить использование своих собственных ресурсов на сервере OP) оба:

  • id_token, для аутентификации - который никогда не должен использоваться Снова в вызовах сервера, кроме как в качестве подсказки во время выхода из системы, когда его срок действия больше не важен, и поэтому по причинам выше следует позволить истечь и никогда не обновляться.
  • access_token-который позже, при вызове API, может быть передан в конечную точку UserInfo OP. Это вернет утверждения, и API может авторизоваться соответствующим образом.

вы можете обновить этот access_token, так как он только сообщает API, какие утверждения у пользователя есть, и какие ресурсы (по областям и утверждениям каждой области) пользователь согласился предоставить вам. Как объяснено выше, это позволяет доступ даже после того, как пользователь не вошел в систему. Конечно, вы не хотите, чтобы маркер обновления, потому что вы не хотите разрешить олицетворение без входа в систему.

Я хотел опубликовать этот ответ в качестве комментария, но так как я не был очень активен на StackOverflow, я думаю, что я публикую его в качестве альтернативного ответа.

вы также можете использовать id_token Как id_token_hint при попытке выхода пользователя из сеанса http://openid.net/specs/openid-connect-session-1_0.html. я честно не думаю, что это действительно имеет значение, если id_token истек в этот момент, так как вы беспокоитесь только о выходе из системы конкретного пользователя.

Если я правильно понял, по данным этой и OpenID Connect Core 1.0 spec, сам маркер ID может быть сохранен в cookies как механизм для сохранения сеансов и отправлен с каждым запросом, требующим аутентификации, клиенту. Затем клиент может проверить маркер ID локально или через конечную точку верификатора поставщика (если это предусмотрено, как Google делает). Если срок действия маркера истек, он должен сделать другой запрос Аутентификации, кроме этого время с prompt=none в параметре URL. Также не забудьте отправить маркер с истекшим сроком действия в

TLDR;

Проверьте маркер идентификатора, прежде чем доверять тому, что он говорит.

Более Подробная Информация

что такое намерение времени истечения срока действия маркера ID в OpenID Connect?

цель состоит в том, чтобы позволить клиенту проверить маркер ID, и клиент должен проверьте маркер идентификатора перед операциями, которые используют информацию маркера идентификатора.

С неявная спецификация потока OpenID:

Если какая-либо из процедур проверки, определенных в этом документе, не выполняется, любые операции, требующие информации, которая не была правильно проверена, должны быть прерваны и сведения, которые не удалось проверить, не должны использоваться.

подтверждает, что документация Google OpenID Connect говорит Это о проверке токена ID:

одна вещь, которая делает ID токены полезными является тот факт, что вы можете передать их вокруг различные компоненты вашего приложения. Эти компоненты могут использовать маркер ID в качестве упрощенного механизма проверки подлинности для проверки подлинности приложения и пользователя. но прежде чем вы сможете использовать информацию в маркере ID или полагаться на нее как на утверждение, что пользователь прошел проверку подлинности, вы должны проверить его.

Итак, если наше клиентское приложение собирается предпринять некоторые действия на основе содержимого маркера ID, то мы должны снова проверить маркер ID.

Comments

    Ничего не найдено.