验证DNN(DotNetNuke)在微服务中创建的JWT

问题描述 投票:0回答:1

我正在玩DNN 9,目前正在实施JWT。

他们的实施在这里 - https://github.com/dnnsoftware/Dnn.Platform/tree/development/DNN%20Platform/Dnn.AuthServices.Jwt

我想在Docker容器中编写微服务,这些容器都回溯到DNN的SQL。但是,我需要了解如何验证将通过客户端发送的JWT,以确保它没有被篡改。 DNN的web api实现自动执行此操作。问题是我没有看到如何验证令牌是否有效,因为我没有必须添加“秘密”。

我想从DNN的角度获得JWT,并在没有运行DNN的微服务中使用它,但是能够从DNN数据库中读取数据。

有人可以提供任何意见吗?

谢谢 :)

api authentication jwt dotnetnuke dotnetnuke-9
1个回答
1
投票

如果服务可以访问DNN数据库,那么您可以使用由引用代码实现的验证。

似乎令牌不是真正的JWT令牌,因为它们是独立的,尽管它们也不是真正的参考令牌。令牌持久存储在数据库中,但也包含公共数据。

如何实现:令牌由sessionId标识,秘密是串联字符串,转换为字节数组:

var secret = ObtainSecret(sessionId, portalSettings.GUID, 
                          userInfo.Membership.LastPasswordChangeDate);

数据是JWT。它包含标题,有效负载和签名。

首先从收到的令牌验证Header(和方案)。然后读取RAW令牌,验证到期,并检查是否存在SessionId,将其添加为声明(TokenId)。

最后一步是使用SessionId从商店(缓存/数据库)到lookup the user

private UserInfo TryGetUser(JwtSecurityToken jwt, bool checkExpiry)
{
    // validate against DB saved data
    var sessionId = GetJwtSessionValue(jwt);
    var ptoken = DataProvider.GetTokenById(sessionId);

找不到SessionId时,令牌无效。再次验证过期。

最后将收到的数据与持久性令牌line 423进行比较:

if (ptoken.TokenHash != GetHashedStr(jwt.RawData))

这应该可以防止令牌被篡改。

这意味着只要服务可以访问DNN数据库,您就可以为微服务使用相同的代码。调用ValidateToken(),它将在有效时返回用户名,或在无效时返回null。

另一种方法是发布你自己的JWT代币,就像我描述的here一样。您可以创建中央API或使用固定的共享密钥。例如。微服务可用的证书。在这种情况下,您正在处理可以使用默认验证器验证的自包含JWT令牌。而且您不需要访问数据库。

© www.soinside.com 2019 - 2024. All rights reserved.