官网教程:教程:使用 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再去请求
返回成功