Использование таблицы AspNetUserTokens для хранения токена обновления в ASP.NET Core Web Api

Я работаю с приложением ASP.NET Core Web API. Я пытаюсь реализовать аутентификацию на основе токенов JWT поверх удостоверения ASP.NET (встроенного в таблицы базы данных).

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

https://www.blinkingcaret.com/2018/05/30/refresh-tokens-in-asp-net-core-web-api/

https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web-token/

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

Мой вопрос: если кто-то использовал AspNetUserTokens для хранения refreshtoken, пожалуйста, поделитесь идеей, поскольку класс usermanager не раскрывает модель прямого токена (AspNetUserTokens) и не уверен, что я использую IdentityDbContext, каковы преимущества и недостатки? Я реализовал IdentityDbContext, но я не вижу встроенного класса в Microsoft.AspNetCore.Identity для хранения токена в AspNetUserTokens

Был бы очень признателен за руководство.

Спасибо

Ответ 1

Я прямо отвечу на ваш вопрос и предложу альтернативу. Вы можете удалить, установить, получить и проверить токены с помощью таблицы AspNetUserTokens. Тем не менее, вы можете пропустить БД, и я опишу это ниже.

Следующие методы UserManager будут генерировать и хранить:

await _userManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await _userManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await _userManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);

Следующие методы UserManager получат и подтвердят:

var refreshToken = await _userManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var isValid = await _userManager.VerifyUserTokenAsync(user, "MyApp", "RefreshToken", refreshToken );

Вам нужно будет настроить такого провайдера с помощью IdentityBuilder при запуске.

identity.AddTokenProvider("MyApp", typeof(DataProtectorTokenProvider<User>)

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

_userManager.UpdateSecurityStampAsync(user);