JWT认证简单介绍
关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构。
JWT主要由三部分组成,如下:
HEADER.PAYLOAD.SIGNATURE
HEADER
包含token的元数据,主要是加密算法,和签名的类型,如下面的信息,说明了
加密的对象类型是JWT,加密算法是HMAC SHA-256
{"alg":"HS256","typ":"JWT"}
然后需要通过BASE64编码后存入token中
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
主要包含一些声明信息(claim),这些声明是key-value对的数据结构。
通常如用户名,角色等信息,过期日期等,因为是未加密的,所以不建议存放敏感信息。
{"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name":"admin","exp":1578645536,"iss":"webapi.cn","aud":"WebApi"}
也需要通过BASE64编码后存入token中
eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJleHAiOjE1Nzg2NDU1MzYsImlzcyI6IndlYmFwaS5jbiIsImF1ZCI6IldlYkFwaSJ9
Signature
jwt要符合jws(Json Web Signature)的标准生成一个最终的签名。把编码后的Header和Payload信息加在一起,然后使用一个强加密算法,如 HmacSHA256,进行加密。HS256(BASE64(Header).Base64(Payload),secret)
2_akEH40LR2QWekgjm8Tt3lesSbKtDethmJMo_3jpF4
最后生成的token如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJleHAiOjE1Nzg2NDU1MzYsImlzcyI6IndlYmFwaS5jbiIsImF1ZCI6IldlYkFwaSJ9.2_akEH40LR2QWekgjm8Tt3lesSbKtDethmJMo_3jpF4
开发环境
框架:asp.net 3.1
IDE:VS2019
ASP.NET 3.1 Webapi中使用JWT认证
命令行中执行执行以下命令,创建webapix项目:
dotnet new webapi -n Webapi -o WebApi
特别注意的时,3.x默认是没有jwt的Microsoft.AspNetCore.Authentication.JwtBearer库的,所以需要手动添加NuGet Package,切换到项目所在目录,执行 .net cli命令
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer --version 3.1.0
创建一个简单的POCO类,用来存储签发或者验证jwt时用到的信息
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Webapi.Models { public class TokenManagement { [JsonProperty("secret")] public string Secret { get; set; } [JsonProperty("issuer")] public string Issuer { get; set; } [JsonProperty("audience")] public string Audience { get; set; } [JsonProperty("accessExpiration")] public int AccessExpiration { get; set; } [JsonProperty("refreshExpiration")] public int RefreshExpiration { get; set; } } }
然后在 appsettings.Development.json
增加jwt使用到的配置信息(如果是生成环境在 appsettings.json
添加即可)
"tokenManagement": { "secret": "123456", "issuer": "webapi.cn", "audience": "WebApi", "accessExpiration": 30, "refreshExpiration": 60 }