# FurJWTDemo **Repository Path**: zero530/fur-jwtdemo ## Basic Information - **Project Name**: FurJWTDemo - **Description**: No description available - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 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 文档参考 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/230045_c15467db_1722306.png "屏幕截图.png") - 2.2 创建成功 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/230322_b818aecc_1722306.png "屏幕截图.png") ### 3 打开项目,run起来,可以看到swagger已经启动了 ![swa](https://images.gitee.com/uploads/images/2020/1215/230757_a4c634e1_1722306.png "屏幕截图.png") ### 4 右键Controller文件夹,添加Controller - ValuesController - 4.1 代码, 请留意要继承 `ControllerBase` ```csharp 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 运行结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/231230_2d3f05fc_1722306.png "屏幕截图.png") ### 5 我们做点手脚,加个权限进去,再访问,发现权限已经启用, 方法`value2()`已经报错 - 5.1 代码 ```csharp [Authorize] [Route("api/value2")] public string Value2() { return "this is value 2 with auth!"; } ``` - 5.2 结果 , 打开神一样的Fiddle,发现value1()是200, value2()是401(UnAuthorized) - value1 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/231937_4d97455d_1722306.png "屏幕截图.png") - value2 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/232120_51e14d28_1722306.png "屏幕截图.png") ### 6 我们新建一个授权方法,开始手撸代码 - 6.1 创建AuthController ![输入图片说明](https://images.gitee.com/uploads/images/2020/1214/223003_b5054c2e_1722306.png "屏幕截图.png") - 6.2 将下面的代码填入方法, 我这里不做过多的原理解释,也不重复造轮子了, 网上有太多的资料。 `假设有账号和密码的参数就给于授权` 当前真实环境中不可能如此。 ```c# [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(); var datetimeOffset = new DateTimeOffset(DateTime.Now); if (jwtSettings.ExpiredTime != null) output = JWTEncryption.Encrypt(jwtSettings.IssuerSigningKey, new Dictionary() { {"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 - 生成 ![re](https://images.gitee.com/uploads/images/2020/1215/232638_a755cf6a_1722306.png "屏幕截图.png") - 双击查看token ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/232737_48418c0a_1722306.png "屏幕截图.png") - 7 我们手动将token放到请求的header,模拟客户端的请求 - 7.1 复制那段生成好的token, 可以切换到textview中, 请注意在token前面加上 `Authorization: Bearer ` ```bash User-Agent: Fiddler Host: localhost:44342 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiJjYWkiLCJpYXQiOjE2MDgwNDY3MjQsIm5iZiI6MTYwODA0NjcyNCwiZXhwIjoxNjU5ODg2NzI0LCJpc3MiOiJkb3RuZXRjaGluYSIsImF1ZCI6InBvd2VyYnkgRnVyaW9uIn0.xNxexPeDUniDCnBwrIjbV62ZFnVdma91Ut7rtx4-t7Q ``` - 7.2 结果如下图 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/234159_285a4688_1722306.png "屏幕截图.png") - 双击 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1215/234307_89b35eb5_1722306.png "屏幕截图.png") - 8 延伸, 当超时后如何刷新token? 还有如何强制token失效? 我们下一章继续。