【问题标题】:How to unencrypt Web API 2 JWT tokens?如何解密 Web API 2 JWT 令牌?
【发布时间】:2015-01-02 04:41:51
【问题描述】:

我正在尝试使用 Web API 2 提供的 OAuth 不记名令牌,但我不知道如何解密它们或取出数据。

我真正想做的是为我从 Web API 获得的令牌找到或编写一个与此 Google 工具 https://developers.google.com/wallet/digital/docs/jwtdecoder 等效的工具。 Google 工具允许您粘贴代表 JWT 令牌的文本字符串,然后将其拆分并取消编码其中的 JSON。

在 Visual Studio 2013 中,如果您选择新建 ASP.NET 项目,然后选择带有单个用户帐户的 Web API 模板,您将获得一个包含令牌端点的示例项目。如果您启动项目,您可以向内置网络服务器上的 /token POST 请求“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 编码的。没关系,我可以设置机器密钥 OK,但是如果我知道创建令牌的机器密钥,我该如何解密呢?

【问题讨论】:

    标签: c# asp.net asp.net-web-api oauth visual-studio-2013


    【解决方案1】:

    您对令牌的生成是正确的。此令牌是一个加密或签名字符串,包含已登录用户的所有声明和票证属性的反序列化版本。如果在 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 解码器之类的在线工具对其进行解密;那么我建议你在这里阅读我关于JSON Web Token in ASP.NET Web API 2 using Owin的博客文章

    【讨论】:

    • 这几乎是我想要的,它帮助我解决了我正在做的事情。我真正想要的是一种无需进入 ASP 网站即可解密令牌的方法(因此 Startup.OAuthBearerOptions 不可用)。感谢您的博客,我已经阅读了很多文章,它们对我很有帮助。
    • OAuthAuthorizationServerOptions.AccessTokenFormat 似乎确实使用Protect 方法来编码和/或加密您的令牌,但框架在尝试“解包”令牌时似乎没有使用Unprotect 方法. AuthenticationServer 中是否有一些未记录的钩子可以为此实现或标记? @HaoKung,你对此有什么见解吗?
    • Taiseer,你在这个主题上有很好的帖子。但是您只展示了如何签署 JWT 以防止其被篡改,您能否指导如何按照 ASP.Net MVC 5 中的 JSON Web Encryption (JWE) 规范对 JWT 进行加密?
    • 我根据您的教程提出了 1 个问题。请您查看并提供一些见解:stackoverflow.com/questions/47151680/…
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2017-04-16
    • 2019-05-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2017-06-11
    • 2017-01-09
    相关资源
    最近更新 更多