<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.5" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
除了这几个包,如果有哪个报错,大家直接引入对应的就行,版本一般对应Net版本就行
应该还有这个:System.IdentityModel.Tokens.Jwt和System.IdentityModel.Tokens.Jwt
按照步骤无脑复制粘贴就行
第一步:配置appsetting.json文件:
内容随便写就行
"JWTTokenOptions": {
"Audience": "你想写啥写啥",
"Issuer": "你想写啥写啥,
"SecurityKey": "50位左右乱序字符,不要太多也不要太少,你的秘钥"
}
第二步:定义一个jwtoption类,一般在Model中创建
public class JWTTokenOptions
{
public string Audience
{
get;
set;
}
public string SecurityKey
{
get;
set;
}
public string Issuer
{
get;
set;
}
}
第三步:定义一个jwtservice类,直接复制我的就行,都是模版,我也记不住
注意:JwtService构造函数参数一点不要写成JwtTokenOption而是IOptionMonitor<JwtTokenOption>这样才可以依赖注入,否则你需要自己配置依赖注入。一句话复制我的就可以了
namespace Service
{
public class CustomHSJWTService: ICustomJWTService
{
private readonly JWTTokenOptions _JWTTokenOptions;
public CustomHSJWTService(IOptionsMonitor<JWTTokenOptions> jwtTokenOptions)//通过依赖注入
{
_JWTTokenOptions = jwtTokenOptions.CurrentValue;
}
public string GetToken(UserRes user)
{
//jwt的第二段
#region 有效载荷,大家可以自己写,爱写多少写多少;尽量避免敏感信息
var claims = new[]
{
new Claim("Id",user.Id.ToString()),
new Claim("NickName",user.NickName),
new Claim("Name",user.Name),
new Claim("UserType",user.UserType.ToString()),
// new Claim(JwtRegisteredClaimNames.Sub,"xxxx")
// new Claim(ClaimTypes.Actor,"xxxxx"),
};
#endregion
//需要加密:需要加密key:
//Nuget引入:Microsoft.IdentityModel.Tokens
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_JWTTokenOptions.SecurityKey));//秘钥转化为字节
SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//Nuget引入:System.IdentityModel.Tokens.Jwt
JwtSecurityToken token = new JwtSecurityToken(
issuer: _JWTTokenOptions.Issuer,
audience: _JWTTokenOptions.Audience,
claims: claims,
expires: DateTime.Now.AddMinutes(10),//10分钟有效期
signingCredentials: creds);
// var tokenDescriptor = new SecurityTokenDescriptor{}
// new JwtSecurityTokenHandler().CreateToken();
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
}
}
这个是思路,大家不用管
总结思路
claim ||-> var identity = new ClaimsIdentity(claims, "jwt");
秘钥得到字节对称加密
生成验证规则
1.创建描述
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = identity,
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = signingCredentials
};
// 创建 token 处理器
var tokenHandler = new JwtSecurityTokenHandler();
// 创建 token
var token = tokenHandler.CreateToken(tokenDescriptor);
// 写出 token 到字符串
var tokenString = tokenHandler.WriteToken(token);
2方案(推荐)
new JwtSecurityToken
var tokenString = tokenHandler.WriteToken(token);
第四步:
builder配置注册jwt
//第一步,注册JWT依赖注入
builder.Services.Configure<JWTTokenOptions>(builder.Configuration.GetSection("JWTTokenOptions"));
#region JWT校验
//第二步,增加鉴权逻辑
JWTTokenOptions tokenOptions = new JWTTokenOptions();
builder.Configuration.Bind("JWTTokenOptions", tokenOptions);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)//Scheme
.AddJwtBearer(options => //这里是配置的鉴权的逻辑
{
options.TokenValidationParameters = new TokenValidationParameters
{
//JWT有一些默认的属性,就是给鉴权时就可以筛选了
ValidateIssuer = true,//是否验证Issuer
ValidateAudience = true,//是否验证Audience
ValidateLifetime = true,//是否验证失效时间
ValidateIssuerSigningKey = true,//是否验证SecurityKey
ValidAudience = tokenOptions.Audience,//
ValidIssuer = tokenOptions.Issuer,//Issuer,这两项和前面签发jwt的设置一致
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.SecurityKey))//拿到SecurityKey
};
});
#endregion
第五步:在program中粘贴如下代码:
// app.UseHttpsRedirection();
app.UseCors("CorsPolicy");
//鉴权授权
app.UseAuthentication();
app.UseAuthorization();
在你想要验证的控制类上粘贴 [Authorize] ,这样你的这个Controller类内的接口都会需要jwt验证
补充跨域:(和配置jwt没关系),配置一个“corspolicy”策略
//添加跨域策略
builder.Services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders("X-Pagination"));
});
运行成功结果如图: