JWT令牌如何使用示例逐步生成和认证

时间:2019-04-02 09:30:16

标签: c# model-view-controller

如何使用JWT令牌生成和认证用户。使用使用C#MVC的示例。

1 个答案:

答案 0 :(得分:0)

什么是JSON Web令牌?

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

尽管可以对JWT进行加密以提供各方之间的保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当使用公钥/私钥对对令牌进行签名时,签名还可以证明只有持有私钥的一方才是对它进行签名的一方。

何时应使用JSON Web令牌?

在某些情况下,JSON Web令牌很有用:

授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今的一种广泛使用JWT的功能,因为它的开销很小并且可以轻松地在不同域中使用。

信息交换: JSON Web令牌是在各方之间安全地传输信息的一种好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效载荷计算的,因此您还可以验证内容是否未被篡改。

什么是JSON Web令牌结构? JSON Web令牌以紧凑的形式由三部分组成,这些部分由点(。)分隔,分别是:

  • 标题
  • 有效载荷
  • 签名

因此,JWT通常如下所示。

xxxxx.yyyyy.zzzzz

让我们分解不同的部分。

标题 标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。

例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

然后,此JSON被 Base64Url 编码以形成JWT的第一部分。

有效载荷

令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。索赔有三种类型:注册,公开和私人索赔。

已注册的声明:这些是一组预定义的声明,不是强制性的,但建议使用,以提供一组有用的可互操作的声明。其中一些是: iss (发布者), exp (到期时间), sub (主题), aud (受众群体)和others

Notice that the claim names are only three characters long as JWT is meant to be compact.

公共声明:使用JWT的人可以随意定义这些声明。但是为避免冲突,应在IANA JSON Web Token Registry中定义它们,或将其定义为包含抗冲突名称空间的URI。

私人声明:这些自定义声明是为了在同意使用它们的各方之间共享信息而创建的,既不是注册声明也不是公共声明。

有效负载示例可能是:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然后对有效负载进行 Base64Url 编码,以形成JSON Web令牌的第二部分。

Do note that for signed tokens this information, though protected against tampering, is readable by anyone. Do not put secret information in the payload or header elements of a JWT unless it is encrypted.

签名

要创建签名部分,您必须获取编码的标头,编码的有效载荷,机密,标头中指定的算法,并对其进行签名。

例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

签名用于验证消息在此过程中是否未被更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实人。 / p>

全部组合

输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。

下面显示了一个JWT,它已对先前的标头和有效负载进行了编码,并用一个秘密进行了签名。编码的JWT

enter image description here

如果您想使用JWT并将这些概念付诸实践,可以使用jwt.io Debugger来解码,验证和生成JWT。

enter image description here

JWT.io调试器

JSON Web令牌如何工作?

在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。由于令牌是凭据,因此必须格外小心以防止安全问题。通常,令牌的保留时间不应超过要求的时间。

每当用户想要访问受保护的路由或资源时,用户代理都应使用 Bearer 模式,通常在 Authorization 标头中发送JWT。标头的内容应如下所示:

Authorization: Bearer <token>

在某些情况下,这可以是无状态授权机制。服务器的受保护路由将在 Authorization 标头中检查有效的JWT,如果存在该JWT,则将允许用户访问受保护的资源。如果JWT包含必要的数据,则可以减少查询数据库中某些操作的需求,尽管并非总是如此。

如果令牌是通过 Authorization 标头发送的,则跨域资源共享(CORS)不会成为问题,因为它不使用cookie。

下图显示了如何获取JWT并将其用于访问API或资源:

enter image description here

  1. 应用程序或客户端请求授权给 授权服务器。这是通过不同的方式之一执行的 授权流程。例如,符合典型的OpenID Connect Web应用程序将使用以下命令通过/ oauth / authorize端点 授权代码流。
  2. 授予授权后,授权服务器返回 该应用程序的访问令牌。
  3. 应用程序使用访问令牌访问受保护的资源 (如API)。

请注意,使用签名的令牌,令牌中包含的所有信息都会向用户或其他方公开,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。

我们为什么要使用JSON Web令牌?

让我们讨论 JSON Web令牌(JWT)简单Web令牌(SWT)安全断言标记语言令牌(SAML)相比的好处

由于JSON不如XML冗长,因此在编码时,它的大小也较小,从而使JWT比SAML更为紧凑。这使JWT成为在HTML和HTTP环境中传递的不错选择。

在安全方面,只能使用HMAC算法由共享机密对SWT进行对称签名。但是,JWT和SAML令牌可以使用X.509证书形式的公用/专用密钥对进行签名。与签名JSON的简单性相比,使用XML数字签名对XML进行签名而不引入模糊的安全漏洞是非常困难的。

JSON解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML没有自然的文档到对象映射。与SAML断言相比,这使得使用JWT更加容易。

关于用法,JWT在Internet范围内使用。这突显了在多个平台(尤其是移动平台)上客户端对JSON Web令牌进行处理的简便性。

enter image description here

比较编码的JWT和SAML的长度比较编码的JWT和SAML的长度

如果您想了解有关JSON Web令牌的更多信息,甚至开始使用它们在自己的应用程序中执行身份验证,请浏览到Auth0上的JSON Web Token landing page