Я дал 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 не срабатывает, как бы это было сделано в первую очередь.
Мой вопрос в том, что это подходящее место для этого? Есть ли способ лучше? Как я могу избежать этого состояния гонки?
Я собираюсь установить это как ответ, потому что лучшая практика действительно вращается вокруг такого решения, если у вас должно быть 2 асинхронных токена с разными временами обновления. Нам пришлось добавить фильтр MVC, который делает это взломанным, но работает. – DasAmigo