Если сервисы имеют доступ к базе данных DNN, вы можете использовать проверку, реализованную в указанном коде.
Кажется, что токены не являются реальными токенами JWT , в том смысле, что они являются автономными, хотя они также не являются реальными эталонными токенами . Токены сохраняются в базе данных, но также содержат общедоступные данные.
Как это реализовано : токен идентифицируется sessionId , а секрет - это конкатенированная строка, преобразованная в байтовый массив:
var secret = ObtainSecret(sessionId, portalSettings.GUID,
userInfo.Membership.LastPasswordChangeDate);
Данные JWT . Он содержит заголовок, полезную нагрузку и подпись.
Сначала из полученного токена проверяется Заголовок (и схема). Затем считывается токен RAW, истекает срок действия и проверяется наличие SessionId, который добавляется как заявка (TokenId).
Последний шаг - поиск пользователя из хранилища (кеш / база данных), используя SessionId:
private UserInfo TryGetUser(JwtSecurityToken jwt, bool checkExpiry)
{
// validate against DB saved data
var sessionId = GetJwtSessionValue(jwt);
var ptoken = DataProvider.GetTokenById(sessionId);
Когда SessionId не найден, токен недействителен. Снова истекает срок действия.
И, наконец, полученные данные сравниваются с постоянным токеном, строка 423 :
if (ptoken.TokenHash != GetHashedStr(jwt.RawData))
Это должно предотвратить подделку токена.
Это означает, что вы можете использовать один и тот же код для ваших микросервисов при условии, что сервисы имеют доступ к базе данных DNN. Вызовите ValidateToken (), которая вернет имя пользователя, если оно действительно, или ноль, если оно недействительно.
Альтернативой является публикация собственных токенов JWT, как я описал здесь . Вы можете создать центральный API или использовать фиксированный общий секрет. Например. сертификат, который доступен для микросервисов. В этом случае вы имеете дело с автономными токенами JWT, которые можно проверить с помощью валидаторов по умолчанию. И вам не нужен доступ к базе данных.