老样子打开vs创建一个.Net Core项目,我使用的是.Net Core Web API(每一个控制器都会自带一个API特性[Route("api/[controller]")]这个就是你接口的访问路径)
接下来进入正题:
首先了解它能做什么?
通过jwt我们可以生成Token返回给前端,前端请求时在请求头加入Token来进行身份认证,jwt还可以做到分角色认证,可以限制不同角色访问接口方法,基本的使用场景就是这样。非常好用!!
对于新手来说也很友好,因为配置十分简单。如果你使用使用的是Core2.1那更加简单因为自带jwt 的NuGet包。
实现分为以下几步:
第一步:在可以在appssettings.json中添加jwt所需的参数,并根据参数结构创建一个实体类JwtSettings。
public class JwtSettings
{
/// <summary>
/// 过期时间
/// </summary>
public static string ClockSkew { get; set; }
/// <summary>
/// 接收者
/// </summary>
public static string ValidAudience { get; set; }
/// <summary>
/// 发布者
/// </summary>
public static string ValidIssuer { get; set; }
/// <summary>
/// 密钥
/// </summary>
public static string IssuerSigningKey { get; set; }
/// <summary>
/// 刷新时间
/// </summary>
public static string Expires { get; set; }
}
第二步:在Startup.cs中的ConfigureServices注册jwt服务和Configure中加入中间件。
在ConfigureServices中加入下面的代码,要注意的是接收者ValidAudience 可以不指定到生成Token的方法中再指定可以做到多角色。
#region jwt配置
//jwt
Configuration.Bind("JwtSettings", new JwtSettings());//读取配置文件赋值JwtSettings
//配置jwt
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(optins =>
{
optins.RequireHttpsMetadata = false;//是否https
optins.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidIssuer = JwtSettings.ValidIssuer,//发布者
ValidateAudience = true,
ValidAudience = JwtSettings.ValidAudience,//接收者(可以不设置,在生成Token时再指定)
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtSettings.IssuerSigningKey)),//密钥
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,//时间
};
});
//end
#endregion
然后在Configure中加入代码:
//jwt
app.UseAuthentication();
//end
做完上面的工作我们就可以愉快的在控制器中使用啦!
第三步:如何使用??这里简单做了一个登录的例子。
Controller层代码
#region 生成用户Token
/// <summary>
/// 生成token
/// </summary>
/// <param name="jsonStr">用户实体json</param>
/// <param name="minutes">Token过期时间</param>
/// <returns></returns>
public string CreatToken(string jsonStr, int minutes)
{
var claim = new Claim[]
{
new Claim("user",jsonStr),//用户信息,可以选择部分用户信息存入,方便根据前端请求Token获取对应信息(json格式)
new Claim(ClaimTypes.Role,"user")//角色
};
//密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtSettings.IssuerSigningKey));
//证书签名
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//生成token
var token = new JwtSecurityToken(JwtSettings.ValidIssuer//发布者
, JwtSettings.ValidAudience//接收者
, claim //用户信息角色信息
, DateTime.Now//当前创建时间
, DateTime.Now.AddMinutes(minutes)//过期时间
, creds//证书签名
);
string tokenStr = new JwtSecurityTokenHandler().WriteToken(token);//写入token
return tokenStr;//返回
}
#endregion
BLL业务逻辑层代码
登录的时候访问api/UserLogin/GetToken就可获得Token了。
获取Token后如下面这个接口加上[Authorize(Roles = "user")]代表请求该接口就需要请求头中包含Token并且接收者角色是user的Token。
如果请求头中包含Token则正常返回数据
注意在前端在传回Token时前面要加上Bearer (与token中间是有空格的)
,否则显示内容如下图所示报401错误,因为Headers请求头中没有包含Token。
以上就是对jwt使用总结,供大家参考。
最后插播工具,推荐大家使用SwaggerUI,可以说webapi开发常用。
在nuget包管理中安装Swashbuckle.AspNetCore
然后直接贴代码,在Startup.cs 中分别给ConfigureServices和Configure加入下面的代码
//注册Swagger生成器
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1",//版本
Title = ".netCoreJwt认证",//标题
Description = "111212",
});
var basePath = AppContext.BaseDirectory;
var commentsFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(basePath, commentsFileName);
options.IncludeXmlComments(xmlPath, true);
});
//end
Configure
//swagger
app.UseSwagger();
app.UseSwaggerUI(action =>
{
action.ShowExtensions();
action.SwaggerEndpoint("/swagger/v1/swagger.json", "12121111");
});
//end
然后右键启动项——》属性(如下图设置)
运行项目后它会显示项目的所有api,并且可以进行接口测试。
以上为个人学习总结,有什么不准确请在评论区相互交流。