2016-10-12 5 views
1

Я дал Owin Трубопроводный свой собственный CookieAuthenticationProvider сКак я могу избежать проблемы параллелизма обновления токена в ICookieAuthenticationProvider.ValidateIdentity?

public async override Task ValidateIdentity(CookieValidateIdentityContext context) 

В этом методе я проверяю маркер 3 участника в формуле идентичности пользователей, чтобы увидеть, если он истек или близок к окончанию. Если это так, я использую его токен обновления, чтобы получить новый токен доступа от третьего лица, сгенерируйте новый идентификатор с новыми токенами доступа и обновления, затем войдите и замените текущий идентификатор. Таким образом, пользователь всегда имеет действительный токен доступа на стороннем сайте.

Это работает довольно безупречно, за исключением того, что у нас есть много запросов ajax, а также некоторые запросы в реальном времени signalr. Как правило, 2 запроса от пользователя будут обрабатываться на разных потоках A & B. Thread A попадает в [ Authorize], который запускает идентификатор Validate. Он видит, что токен или истекает, и требует обновления. Тем временем поток B заканчивается тем же. Thread A заканчивается первым и теперь имеет новый токен доступа и обновляет токен, Thread B не обновляется, потому что он вызвал обновление, используя исходный токен обновления, который третья сторона считает недействительной, и отказывает в любом новом токене доступа, чтобы запрос пользователя становился несанкционированным , Нить A заканчивается, и все выглядит хорошо. Нить B не срабатывает, как бы это было сделано в первую очередь.

Мой вопрос в том, что это подходящее место для этого? Есть ли способ лучше? Как я могу избежать этого состояния гонки?

ответ

0

Если вы хотите синхронизировать два запроса, вам понадобится услуга выгрузки центрального токена. Вы даже не можете хранить маркеры в пользовательской информации/cookie, но храните их непосредственно в службе и у кого есть те, кто нуждается в токенах, запрашивают их у службы. По запросу вы можете проверить продление и убедиться, что одновременно выполняется только одно обновление.

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^