.net core 5 新建webapi实现JWT登录验证

官网教程:教程:使用 ASP.NET Core 创建 Web API | Microsoft Docs

1:安装对应版本或更高版本的dotnet

下载链接:.NET 下载(Linux、macOS 和 Windows)

 2:dotnet new webapi -o 项目名称 --no-https

新建api模板

3:添加相应的Nuget包(提示版本不兼容在末尾+ -v 5.0)

dotnet add package Microsoft.EntityFrameworkCore.InMemory

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design

dotnet add package Microsoft.EntityFrameworkCore.Design

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

dotnet tool install -g dotnet-aspnet-codegenerator

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

4:dotnet aspnet-codegenerator controller -name 控制器名称 -async -api -m 实体类 -dc 数据库上下文 -outDir Controllers

生成控制器模板

5:新建Models文件夹,添加实体类和数据库上下文

 6:注册数据库上下文,配置数据库链接

Startup.cs注册数据库上下文

 appsettings.json配置数据库链接字符串

 7:编写JWT帮助类

using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;

namespace QiCultureApi.JWT
{
    public class JwtHelper
    {
        private readonly IConfiguration Configuration;

        public JwtHelper(IConfiguration configuration)
        {
            this.Configuration = configuration;
        }
        public string GenerateToken(List<Claim> claims)
        {
            //秘钥,就是标头,这里用Hmacsha256算法,需要256bit的密钥
            var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["JWT:Secret"])), SecurityAlgorithms.HmacSha256);
            //Claim,JwtRegisteredClaimNames中预定义了好多种默认的参数名,也可以像下面的Guid一样自己定义键名.
            //ClaimTypes也预定义了好多类型如role、email、name。Role用于赋予权限,不同的角色可以访问不同的接口
            //相当于有效载荷
            List<Claim> baseClaims = new List<Claim>{
                new Claim(JwtRegisteredClaimNames.Iss,Configuration["JWT:Issuer"]),
                new Claim(JwtRegisteredClaimNames.Aud,Configuration["JWT:Audience"]),
                new Claim("Guid",Guid.NewGuid().ToString("D")),
             };
            claims = claims.Union<Claim>(baseClaims).ToList<Claim>();//合并Claim,删除重复项目

            SecurityToken securityToken = new JwtSecurityToken(
                signingCredentials: securityKey,
                expires: DateTime.Now.AddDays(1),//过期时间
                claims: claims
            );
            //生成jwt令牌
            return "Bearer "+ new JwtSecurityTokenHandler().WriteToken(securityToken);
        }
    }
}

8:新建adminController控制器,编写登录逻辑

配置JWT验证参数

//Token验证配置
			//认证参数
			services.AddAuthentication("Bearer")
				.AddJwtBearer(o =>
				{
					o.TokenValidationParameters = new TokenValidationParameters
					{
						ValidateIssuerSigningKey = true,//是否验证签名
						IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["JWT:Secret"])),//解密的密钥
						ValidateIssuer = true,//是否验证发行人,就是验证载荷中的Iss是否对应ValidIssuer参数
						ValidIssuer = Configuration["JWT:Issuer"],//发行人
						ValidateAudience = true,//是否验证订阅人,就是验证载荷中的Aud是否对应ValidAudience参数
						ValidAudience = Configuration["JWT:Audience"],//订阅人
						ValidateLifetime = true,//是否验证过期时间
						ClockSkew = TimeSpan.Zero,//缓冲过期时间,也就是说,即使我们配置了过期时间,这里也要考虑进去,过期时间+缓冲,默认好像是7分钟,你可以直接设置为0
						RequireExpirationTime = true,
					};
				});

开启授权认证

app.UseAuthentication();一定要写在前面

 9:编写一个需要验证登录权限为admin的接口

F5或者dotnet run 运行

 可以看到返回401未登录

 通过登录接口返回的token再去请求

 返回成功

 GitHub:Hongwenkeji/.net-core-5-webapi (github.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值