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

时间:2018-09-02 06:54:07

标签: api authentication jwt dotnetnuke dotnetnuke-9

我现在正在使用DNN 9,它是JWT的实现。

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

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

我想从DNN获取JWT,并在不与DNN一起运行但将能够从DNN数据库读取数据的微服务中使用它。

有人可以提供任何输入吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

如果服务可以访问DNN数据库,则可以使用参考代码所实现的验证。

从本质上讲,这些令牌也不是真正的 JWT令牌,尽管它们也不是真正的引用令牌。令牌保留在数据库中,但也包含公共数据。

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

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

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

首先从接收到的令牌中验证头(和方案)。然后读取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。

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