如何解密Web API 2 JWT令牌?

6
我正在尝试使用OAuth承载令牌Web API 2,但我不知道如何解密它们或获取数据。我真正想做的是找到或编写一个等效的工具来处理从Web API获取的令牌,类似于这个Google工具https://developers.google.com/wallet/digital/docs/jwtdecoder。该Google工具允许您粘贴表示JWT令牌的文本字符串,然后将其拆分并解码其中的JSON。在Visual Studio 2013中,如果选择新的ASP.NET项目,然后选择带有单独用户帐户的Web API模板,您将获得包含令牌端点的示例项目。如果启动该项目,然后向内置Web服务器的/token发送“grant_type=password&username=joe&password=joe”请求,您将收到一个令牌作为响应。
{
"access_token":"x3vHm40WUXBiMZi_3EmdmCWLLuv4fsgjsg4S5Ya8kppDY_-2ejn7qF5Y_nbQ0bYVIKl6MNzL2GtXv-MAuwjippAAv5VDaxoKdxEVxeFrQ_eXsKNaQK7IvmVs1rIZ9eeRfRGK2AQ59wWQcyTtYO0dPJx9K7PGrSKz4ADAZ9SEZqQ4IesVhYbRCwToyxoyU5L9qdU8jXdHumkIrULRQhf68rIaBrEA_Be-V0rzWJ644fRLvv3z69XoHs3Az7PineILyNwbDck9uU2jkaXnwxoCTa4qlK8bR-lEI9-VXPNdbCvfgb5H9wfYsJcw2CMzNxNhV8v9YVZEt90evylwtTCEpXq4T3zRCQvrpbCvZrXqJ8uvlFeqCsvvhlIkSfPhBY8nm2ocWtBGPZm58zLe5FMi1jept0B54U38ZxkZlrGQKar47jkmnc6gpLrkpDBp7cWz",
"token_type":"bearer",
"expires_in":1209599,
"userName":"joe",
".issued":"Fri, 01 Aug 2014 16:16:02 GMT",
".expires":"Fri, 15 Aug 2014 16:16:02 GMT"
}

我想找出的是access_token的格式和包含的信息。我发现的线索是:您可以通过在Startup.Auth.cs中设置OAuthAuthorizationServerOptions.AccessTokenFormat属性来选择Web API使用哪种令牌。OAuthAuthorizationServerOptions的文档说:“用于保护访问令牌中包含的信息的数据格式。如果应用程序未提供,则默认数据保护提供程序取决于主机服务器。在IIS上的SystemWeb主机将使用ASP.NET机器密钥数据保护,而HttpListener和其他自托管服务器将使用DPAPI数据保护。如果分配了不同的访问令牌提供程序或格式,则必须将兼容的实例分配给资源服务器的OAuthBearerAuthenticationOptions.AccessTokenProvider或OAuthBearerAuthenticationOptions.AccessTokenFormat属性。”所以它可能是使用MachineKey编码的。这很好,我可以设置Machine Key,但是如果我知道创建令牌时使用的机器密钥,该如何解密它?
1个回答

8
您关于令牌生成的说法是正确的。该令牌是一个加密或签名的字符串,包含已登录用户所有声明和票据属性的反序列化版本。如果在IIS模式(SystemWeb)下运行,则通过machineKey节点中的“decryptionKey”和“validationKey”密钥值进行加密和签名。如果作为自托管OWIN应用程序运行,则使用DPAPI进行加密保护,实际上使用3DES算法。
要解密它,您需要在API控制器操作方法中调用此代码(不是必需的,但如果您想查看此加密令牌内部内容,则需要):
string token = "Your token goes here";
Microsoft.Owin.Security.AuthenticationTicket ticket= Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(token);

如果您需要配置AuthZ服务器以发行JWT签名令牌,以便您可以使用像Google JWT解码器这样的工具对其进行解码,则建议您阅读我的博客文章,了解有关在ASP.NET Web API 2中使用Owin的JSON Web Token的详细信息,单击此处:JSON Web Token in ASP.NET Web API 2 using Owin


这几乎是我想要的,它帮助我解决了我正在处理的问题。我真正想要的是一种在不需要 ASP 网站(因此 Startup.OAuthBearerOptions 不可用)的情况下解密令牌的方法。感谢您的博客,我已经阅读了相当多的文章,它们非常有帮助。 - Skippy
OAuthAuthorizationServerOptions.AccessTokenFormat 似乎使用 Protect 方法编码和/或加密令牌,但框架在尝试“解封”令牌时似乎没有使用 Unprotect 方法。在 AuthenticationServer 中是否有一些未记录的钩子可供实现或标志?@HaoKung,您对此有任何见解吗? - Dave Alperovich
Taiseer,您在这个主题上有出色的帖子。但是您只展示了如何签署JWT以保护其免受篡改,能否请您指导如何按照ASP.Net MVC 5中的JSON Web Encryption(JWE)规范加密JWT? - Naveed Ahmed
我基于你的教程提了一个问题,能否请您检查一下并给予一些见解:https://stackoverflow.com/questions/47151680/how-access-token-is-validated-for-accessing-protected-resources-in-token-based-m - Learning-Overthinker-Confused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接