当前位置 主页 > 网站技术 > 代码类 >

    ASP.Net Core3.0中使用JWT认证的实现

    栏目:代码类 时间:2020-01-13 12:07

    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
      }