токен доступа / обновить токен с MSAL

Чтобы выяснить ответ Veedrac , различная реализация имеет различную обработку совпадений нулевой ширины в операциях FindAll (или ReplaceAll). Два поведения можно наблюдать среди разных реализаций, а Python re просто выбирает следовать первой строке реализации.

1. Всегда сталкивайтесь с одним символом с совпадением нулевой ширины

. В Java и JavaScript совпадение нулевой ширины заставляет индекс обрываться одним символом, поскольку пребывание в одном и том же индексе приведет к бесконечному циклу в FindAll или ReplaceAll.

В результате вывод операций FindAll в такой реализации может содержать не более 1 совпадения, начиная с определенного индекса.

Пакет Python re по умолчанию, вероятно, также выполните ту же реализацию (и, похоже, это также относится к Ruby).

2. Запретить совпадение нулевой ширины в следующем совпадении с одним и тем же индексом

. В PHP, который предоставляет оболочку поверх libreary PCRE, совпадение нулевой ширины не приводит к тому, что индекс сразу же ударяется. Вместо этого он установит флаг (PCRE_NOTEMPTY), требующий следующего совпадения (которое начинается с того же индекса), чтобы совпадало с нулевой шириной. Если совпадение будет успешным, оно будет совпадать по длине совпадения (отличное от нуля); в противном случае он сталкивается одним символом.

Кстати, библиотека PCRE не обеспечивает встроенную операцию FindAll или ReplaceAll. Фактически это обеспечивается оболочкой PHP.

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

Пакет Python regex вероятно, следует этой строке реализации.

Эта линия реализации более сложна, так как она требует, чтобы реализация FindAll или ReplaceAll сохраняла дополнительное состояние, чтобы запретить совпадение нулевой ширины или нет. Разработчику также необходимо отслеживать эти дополнительные флаги, когда они используют API с низким уровнем соответствия.

0
задан AWeber 13 July 2018 в 20:03
поделиться

1 ответ

Я не понимаю, будет ли он всегда проверять истечение текущего AccessToken и автоматически обновлять его (используя RefreshToken) при вызове метода.

Резервный токен автоматически предоставляется, когда предоставляется область offline_access, если я правильно понимаю этот ответ

... вы запросили offline_access, чтобы ваше приложение получало токен обновления.

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

Если токен доступа истек или близок к истечению (в течение 5-минутного окна), обновите токен (если доступный) используется для получения нового токена доступа путем создания сетевого вызова.

Он будет повторять это поведение до тех пор, пока токен обновления не будет истек. Необязательно вы можете принудительно обновить токен доступа через токен обновления , используя параметр forceRefresh на AcquireTokenSilentAsync

Наконец, я собираюсь процитировать этот ответ на SO , поскольку он дает хорошее представление о MSAL и токенах

Просто, чтобы сделать небольшое разъяснение, MSAL не делает Фактически выдает токены или решает срок действия токена, а скорее глотает токен приобретений от Azure AD STS.

MSAL автоматически обновит ваш токен доступа после истечения срока действия при вызове AcquireTokenSilentAsync. .... Исходные токены по умолчанию теперь:

Токены доступа: 1 час

Обновить токены: 90 дней, 14-дневное неактивное скользящее окно

(13 июня 17)

Независимо от того, существует ли «наилучшая практика» для того, как часто мы должны вызывать AcquireTokenSilentAsync ()? Должны ли мы сами отслеживать истечение срока действия и называть этот метод, чтобы обновить заголовок аутентификации на предъявителя? Должен ли мы звонить AcquireTokenSilentAsync () в каждый запрос?

Документация также содержит список «Рекомендуемый шаблон вызова» для вызова AcquireTokenSilentAsync. В документации также упоминается, что

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

Основываясь на примерах, которые я видел, включая рекомендуемый шаблон вызова из документации, я бы сказал, что вы могли бы просто вызвать AcquireTokenSilentAsync и поймать MsalUiRequiredException как указание на то, что токен истекает, и пользователь должен снова войти в систему.

Я не вижу, как GraphServiceClient (касательная тема, я знаю) с помощью DelegateAuthenticationProvider сделает все, что поможет WRT-обновление. Нужно ли нам расширять этот класс и выполнять собственное обновление, когда токен близится к истечению срока действия? Я чувствую, что это / должно быть уже в SDK.

Если я правильно понимаю DelegateAuthenticationProvider, то что он делает, это изменить requestMessage, прежде чем передать его на Graph. Все, что нам нужно сделать, это предоставить токен доступа с заголовком авторизации для запроса. Мы уже знаем, что когда мы получаем токен доступа, он действителен, поэтому мы можем просто добавить его.

        new DelegateAuthenticationProvider(async (requestMessage) =>
        {
            ConfidentialClientApplication cca = new ConfidentialClientApplication(_ClientId, _Authority, _RedirectUri, new ClientCredential(_ClientSecret), _UserTokenSessionCache.GetTokenCache(identifier, httpContext), _ApplicationTokenCache.GetTokenCache());
            AuthenticationResult result = await cca.AcquireTokenSilentAsync();
            requestMessage.Headers.Add("Authorization", result.CreateAuthorizationHeader());
            //OR
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);
        });

(Существует нет разницы между любым способом установки заголовки)

Я был на этом пути, и это делает трюк для меня. Я настоятельно рекомендую прочитать их документацию, потому что это дает хорошее представление о том, как реализовать MSAL.Net.

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

Надеюсь, это поможет!

0
ответ дан Bart de Ruijter 17 August 2018 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: