1.引入相关程序包JwtBearer注意版本:
2.配置文件appsettings.json写相关配置参数(也可不写,写在程序里面,数据库读取也是一样的)
, //JWT加密
"JWTToken": {
"SecretKey": "jsaduwqe6asdjewejdue7dfmsdfu0sdfmwmsd8wfsd6", //密钥
"Issuer": "ZYP", //发行者
"Audience": "simple", //拥护者
//"ExpireMinutes": 240 //过期时间
}
3.在Program配置相关服务。
#region JWT
//获取配置文件
var configuration = builder.Configuration;
string Issuer = configuration["JWTToken:Issuer"];
string Audience = configuration["JWTToken:Audience"];
string SecretKey = configuration["JWTToken:SecretKey"];
//注入jwt
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
//过期时间容错值,解决服务器端时间不同步问题(秒)
//允许服务器时间偏移量30秒,即我们配置的过期时间加上这个允许偏移的时间值,才是真正过期的时间(过期时间 + 偏移值)你也可以设置为0,ClockSkew = TimeSpan.Zero
ClockSkew = TimeSpan.FromSeconds(30),
//要求Token的Claims中必须包含Expires
RequireExpirationTime = true,
//是否在令牌期间验证签发者
ValidateIssuer = true,
//发行人Issuer
ValidIssuer = Issuer,
//是否验证接收者
ValidateAudience = true,
//是否验证失效时间
ValidateLifetime = true,
//是否验证签名SecurityKey
ValidateIssuerSigningKey = true,
//接收者
ValidAudience = Audience,
//密钥SecurityKey
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey)),
};
});
//注入JwtHelper
builder.Services.AddSingleton(new JwtHelper(configuration));
#endregion
//注入Swagger,注入这个才能在调试接口时输入token
builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference=new OpenApiReference{Id="Bearer",Type=ReferenceType.SecurityScheme},
},
Array.Empty<string>()
}
});
options.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
{
Description = "请输入文字'Bearer '后面跟空格和token格式 Bearer {token}",
Name = "Authorization",
In = Microsoft.OpenApi.Models.ParameterLocation.Header,
Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey
});
});
//配置跨域
builder.Services.AddCors(policy =>
{
policy.AddPolicy("CorsPolicy", opt => opt
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.WithExposedHeaders("X-Pagination"));
});
//调用中间件:UseAuthentication(认证),
//必须在所有需要身份认证的中间件前调用,比如 UseAuthorization(授权)。
app.UseAuthentication();
//调用中间件:UseAuthorization(授权)。
app.UseAuthorization();
4.相关配置结束后,我们得生成Token,这时我们创建一个专门生成Token的类里面有两个生成Token的方法,想用哪个用哪个。该类在Program里有引用。
/// <summary>
/// Token生成类
/// </summary>
public class JwtHelper
{
/// <summary>
/// 配置文件信息
/// </summary>
private readonly IConfiguration _configuration;
public JwtHelper(IConfiguration configuration)
{
_configuration = configuration;
}
/// <summary>
/// 创建一个使用控制器方法授权的Token
/// </summary>
/// <returns></returns>
public string CreatePermissionToken(string UserName, string RoleName, string AppId, Claim[] claims)
{
// 1. 定义需要使用到的Claims
if (claims == null)
{
claims = new[]
{