.net5实现 JWT (利用Furion白嫖),含Fiddle教程
1 开始 , 首先这里要感谢以下两位大佬的资料。
- 1.1
百小僧
Furion开源框架提供的技术支持。 https://gitee.com/monksoul/Furion, 有兴趣的同学可以start. - 1.2
QiXiao_柒小(東)
的文章 https://www.cnblogs.com/7tiny/archive/2019/06/13/11012035.html 有兴趣的同学可以评论。 - 1.3 项目地址:https://gitee.com/zero530/fur-jwtdemo
2 创建项目,利用Furion 脚手架,轻松创建项目
- 2.1 文档参考
- 2.2 创建成功
3 打开项目,run起来,可以看到swagger已经启动了
4 右键Controller文件夹,添加Controller - ValuesController
- 4.1 代码, 请留意要继承
ControllerBase
public class ValuesController : ControllerBase
{
[Route("api/value1")]
public string Value1()
{
return "this is value1";
}
[Route("api/value2")]
public string Value2()
{
return "this is value 2 with auth!";
}
}
- 4.2 运行结果
5 我们做点手脚,加个权限进去,再访问,发现权限已经启用, 方法value2()
已经报错
- 5.1 代码
[Authorize]
[Route("api/value2")]
public string Value2()
{
return "this is value 2 with auth!";
}
- 5.2 结果 , 打开神一样的Fiddle,发现value1()是200, value2()是401(UnAuthorized)
- value1
- value2
6 我们新建一个授权方法,开始手撸代码
- 6.1 创建AuthController
- 6.2 将下面的代码填入方法, 我这里不做过多的原理解释,也不重复造轮子了, 网上有太多的资料。
假设有账号和密码的参数就给于授权
当前真实环境中不可能如此。
[AllowAnonymous]
[Route("api/auth")]
[HttpGet]
public string Auth(string userName, string pwd)
{
string output = string.Empty;
if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))
{
// 生成 token
var jwtSettings = App.GetOptions<JWTSettingsOptions>();
var datetimeOffset = new DateTimeOffset(DateTime.Now);
if (jwtSettings.ExpiredTime != null)
output = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey,
new Dictionary<string, object>()
{
{"UserId", userName}, // 存储Id
//{"IsAdmin", true}, // 管理员登录
{JwtRegisteredClaimNames.Iat, datetimeOffset.ToUnixTimeSeconds()},
{JwtRegisteredClaimNames.Nbf, datetimeOffset.ToUnixTimeSeconds()},
{
JwtRegisteredClaimNames.Exp,
new DateTimeOffset(
DateTime.Now.AddSeconds(
jwtSettings.ExpiredTime.Value * 60 * 60 * 24 * 30))
.ToUnixTimeSeconds()
},
{JwtRegisteredClaimNames.Iss, jwtSettings.ValidIssuer},
{JwtRegisteredClaimNames.Aud, jwtSettings.ValidAudience}
});
//// 设置 Swagger 刷新自动授权
//if (_httpContextAccessor.HttpContext != null)
// _httpContextAccessor.HttpContext.Response.Headers["access-token"] = output.AccessToken;
}
return output;
}
-
6.3 查看结果 ,fiddle查看,双击左边的url, 就会得到生成好的token
-
生成
-
双击查看token
-
7 我们手动将token放到请求的header,模拟客户端的请求
-
7.1 复制那段生成好的token, 可以切换到textview中, 请注意在token前面加上
Authorization: Bearer
User-Agent: Fiddler
Host: localhost:44342
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJjYWkiLCJpYXQiOjE2MDgwNDY3MjQsIm5iZiI6MTYwODA0NjcyNCwiZXhwIjoxNjU5ODg2NzI0LCJpc3MiOiJkb3RuZXRjaGluYSIsImF1ZCI6InBvd2VyYnkgRnVyaW9uIn0.xNxexPeDUniDCnBwrIjbV62ZFnVdma91Ut7rtx4-t7Q
-
7.2 结果如下图
-
双击
-
8 延伸, 当超时后如何刷新token? 还有如何强制token失效? 我们下一章继续。