Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中验证和解码asp.net Web Api创建的JWT_Javascript_Asp.net Web Api2_Jwt - Fatal编程技术网

如何在JavaScript中验证和解码asp.net Web Api创建的JWT

如何在JavaScript中验证和解码asp.net Web Api创建的JWT,javascript,asp.net-web-api2,jwt,Javascript,Asp.net Web Api2,Jwt,我一直在关注如何在asp.net Web API应用程序中创建JWT授权 在我的例子中,身份验证服务器将是保存资源的同一个服务器(即所有资源都在一个asp.net Web API应用程序中完成),因此我可以看到,在路由身份验证和授权方面,共享JWT编码中使用的“机密”不是问题 但是,我将有一个移动应用程序(使用Ionic框架),我希望能够验证和解码JWT,以便启用/禁用UI的不同部分。所以我需要用JavaScript来实现这一点 因此,我不希望应用程序能够访问这个用于编码JWT的“秘密”字符串

我一直在关注如何在asp.net Web API应用程序中创建JWT授权

在我的例子中,身份验证服务器将是保存资源的同一个服务器(即所有资源都在一个asp.net Web API应用程序中完成),因此我可以看到,在路由身份验证和授权方面,共享JWT编码中使用的“机密”不是问题

但是,我将有一个移动应用程序(使用Ionic框架),我希望能够验证和解码JWT,以便启用/禁用UI的不同部分。所以我需要用JavaScript来实现这一点

因此,我不希望应用程序能够访问这个用于编码JWT的“秘密”字符串

我的问题是

  • 我如何在不需要这个“秘密”密钥的情况下验证和解码JWT

  • 阅读其他帖子,也许验证是不可能的,但解码是可能的。在这种情况下,可能会出现不正确的UI启用,但最终web API调用将失败,因为这也可以进行验证。这样做对吗

  • 有没有另一种方法可以创建JWT,其中我们有私钥和公钥,这样JavaScript就可以有公钥并使用它进行验证


  • 提前感谢您的帮助

    您可以使用基于非对称加密的RS256等签名算法。这意味着签名令牌需要访问私钥,私钥可以安全地存储在服务器端,验证只需要访问公钥

    JSON Web令牌(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对进行签名

    (来源:;重点是我的)

    正如您所提到的,您对运行在用户设备上的客户端应用程序所做的决策应该仅从用户体验的角度进行,并且所有授权决策仍然应该在服务器端再次进行

    最好的类比是Javascript表单验证,它可以在浏览器上完成,以向用户提供即时反馈,但仍然需要在服务器端完成相同或更大的验证,因为攻击者可以轻松绕过客户端验证


    此外,您还应考虑:

    • 如果客户机应用程序和资源服务器之间的关系非常紧密,那么客户机应用程序对令牌的这种解释是可以接受的,尽管该令牌打算在API中使用。根据您的描述,系统的所有部分都在您的控制之下,因此这看起来很好
    • 与基于您提到的共享机密的HS256相比,使用RSA256会带来相关的性能成本。如果这是一个问题,您甚至可以问自己是否真的需要验证令牌客户端;如果你做的所有决定都是纯粹的装饰性的,为什么还要费心验证呢。前提是,试图提供假令牌的人只会看到由于服务器端拒绝令牌而在访问时立即失败的选项或链接

    为什么要在客户端js中对其进行验证?作为对答案的评论,也许客户端验证有点过头了。只要解码就可以得到声明。谢谢你的深入回答。这一切都有道理。读到这篇文章,我想也许没有客户端验证,只是解码,看起来可以按照解释完成,因此可以使用更便宜的验证服务器端,因为这将在每个请求中完成。