Проверка JWT, созданного DNN (DotNetNuke) в микросервисе - PullRequest
0 голосов
/ 02 сентября 2018

Я играю с DNN 9, и сейчас он реализует JWT.

Их реализация здесь - https://github.com/dnnsoftware/Dnn.Platform/tree/development/DNN%20Platform/Dnn.AuthServices.Jwt

Я хочу написать микросервисы в контейнерах Docker, которые все возвращаются к SQL DNN. Однако мне нужно понять, как проверить JWT, который будет отправлен через клиент, чтобы убедиться, что он не был подделан. Реализации веб-API DNN делают это автоматически. Проблема в том, что я не вижу, как я могу проверить, что токен действителен, потому что нет никакого «секрета», который я должен добавить.

Я бы хотел получить JWT из точки DNN и использовать ее в микросервисе, который не работает с DNN, но сможет читать данные из базы данных DNN.

Может ли кто-нибудь предоставить какой-либо вклад?

Спасибо:)

1 Ответ

0 голосов
/ 10 сентября 2018

Если сервисы имеют доступ к базе данных 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, которые можно проверить с помощью валидаторов по умолчанию. И вам не нужен доступ к базе данных.

...