.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已经启动了

swa

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 结果 , 打开神一样的Fiddler,发现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 查看结果 ,fiddler查看,双击左边的url, 就会得到生成好的token
  • 生成
    re
  • 双击查看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失效? 我们下一章继续。

猜你喜欢

转载自blog.csdn.net/WuLex/article/details/119525040