验证 DNN (DotNetNuke) 在微服务中创建的 JWT
Verifying a JWT that DNN (DotNetNuke) created in a microservice
我正在研究 DNN 9,它目前是 JWT 的实现。
他们的实现在这里 - https://github.com/dnnsoftware/Dnn.Platform/tree/development/DNN%20Platform/Dnn.AuthServices.Jwt
我想在 Docker 容器中编写微服务,这些容器都可以追溯到 DNN 的 SQL。但是,我需要了解如何验证将通过客户端发送的 JWT,以确保它没有被篡改。 DNN 的网络 api 实现会自动执行此操作。问题是我不知道如何验证令牌是否有效,因为没有我必须添加的 'secret'。
我想从 DNN enpoint 获取 JWT 并在不是 运行 DNN 但能够从 DNN 数据库读取数据的微服务中使用它。
任何人都可以提供任何意见吗?
谢谢:)
如果服务可以访问 DNN 数据库,那么您可以使用引用代码实现的验证。
从某种意义上说,这些标记似乎不是真正的 JWT 标记,尽管它们不是真正的 参考标记 要么。令牌保留在数据库中,但也包含 public 数据。
这是如何实现的:令牌由 sessionId 标识,秘密是一个连接的字符串,转换为字节数组:
var secret = ObtainSecret(sessionId, portalSettings.GUID,
userInfo.Membership.LastPasswordChangeDate);
数据是JWT。它包含一个 Header、一个有效载荷和一个签名。
首先从收到的令牌中验证 Header(和方案)。然后读取 RAW 令牌,验证过期并检查 SessionId 是否存在,将其添加为声明 (TokenId)。
最后一步是从存储(缓存/数据库)lookup the user,使用 SessionId:
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(),它将 return 有效时的用户名或无效时的空值。
另一种方法是像我描述的那样发布您自己的 JWT 令牌 here。您可以创建中央 API 或使用固定的共享机密。例如。微服务可用的证书。在这种情况下,您正在处理 self-contained JWT 令牌,可以使用默认验证器对其进行验证。而且您不需要访问数据库。
我正在研究 DNN 9,它目前是 JWT 的实现。
他们的实现在这里 - https://github.com/dnnsoftware/Dnn.Platform/tree/development/DNN%20Platform/Dnn.AuthServices.Jwt
我想在 Docker 容器中编写微服务,这些容器都可以追溯到 DNN 的 SQL。但是,我需要了解如何验证将通过客户端发送的 JWT,以确保它没有被篡改。 DNN 的网络 api 实现会自动执行此操作。问题是我不知道如何验证令牌是否有效,因为没有我必须添加的 'secret'。
我想从 DNN enpoint 获取 JWT 并在不是 运行 DNN 但能够从 DNN 数据库读取数据的微服务中使用它。
任何人都可以提供任何意见吗?
谢谢:)
如果服务可以访问 DNN 数据库,那么您可以使用引用代码实现的验证。
从某种意义上说,这些标记似乎不是真正的 JWT 标记,尽管它们不是真正的 参考标记 要么。令牌保留在数据库中,但也包含 public 数据。
这是如何实现的:令牌由 sessionId 标识,秘密是一个连接的字符串,转换为字节数组:
var secret = ObtainSecret(sessionId, portalSettings.GUID,
userInfo.Membership.LastPasswordChangeDate);
数据是JWT。它包含一个 Header、一个有效载荷和一个签名。
首先从收到的令牌中验证 Header(和方案)。然后读取 RAW 令牌,验证过期并检查 SessionId 是否存在,将其添加为声明 (TokenId)。
最后一步是从存储(缓存/数据库)lookup the user,使用 SessionId:
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(),它将 return 有效时的用户名或无效时的空值。
另一种方法是像我描述的那样发布您自己的 JWT 令牌 here。您可以创建中央 API 或使用固定的共享机密。例如。微服务可用的证书。在这种情况下,您正在处理 self-contained JWT 令牌,可以使用默认验证器对其进行验证。而且您不需要访问数据库。