.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失效? 我们下一章继续。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现OAuth2.0服务端,需要遵循OAuth2.0协议,实现授权服务器和资源服务器之间的交互。以下是基本的步骤: 1.创建一个ASP.NET Core Web API项目。 2.安装IdentityServer4和Microsoft.AspNetCore.Authentication.JwtBearer NuGet包。 3.在Startup.cs中配置IdentityServer,并添加JwtBearer认证。 4.创建客户端和API资源,并将它们添加到IdentityServer中。 5.实现OAuth2.0授权终结点,例如授权码授权、密码授权、客户端凭证授权等。 6.实现API资源的保护,验证JWT令牌并确保访问令牌有效。 7.测试OAuth2.0授权和保护API资源。 下面是一个简单的示例,演示如何实现OAuth2.0服务端,包括JWT: 1. 在Startup.cs中配置IdentityServer和JwtBearer认证。示例代码如下: ```csharp public void ConfigureServices(IServiceCollection services) { //添加IdentityServer服务 services.AddIdentityServer() .AddInMemoryClients(Config.Clients) .AddInMemoryApiResources(Config.Apis) .AddDeveloperSigningCredential(); //添加JwtBearer认证 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "http://localhost:5000"; //IdentityServer地址 options.RequireHttpsMetadata = false; //HTTPS设置为false,方便测试 options.Audience = "api1"; //API资源名称 }); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseIdentityServer(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } ``` 2. 创建客户端和API资源。示例代码如下: ```csharp public static class Config { public static IEnumerable<Client> Clients => new List<Client> { new Client { ClientId = "client1", ClientSecrets = { new Secret("secret1".Sha256()) }, AllowedGrantTypes = GrantTypes.ClientCredentials, AllowedScopes = { "api1" } } }; public static IEnumerable<ApiResource> Apis => new List<ApiResource> { new ApiResource("api1", "My API") }; } ``` 3. 实现授权终结点。示例代码如下: ```csharp [HttpPost] [Route("/connect/token")] public async Task<IActionResult> Token([FromBody] TokenRequest request) { if (request.GrantType == "password") { var user = _userService.ValidateCredentials(request.UserName, request.Password); if (user != null) { var accessToken = await _tokenService.CreateAccessTokenAsync(user); return Ok(new { access_token = accessToken, token_type = "Bearer", expires_in = (int)_tokenService.Options.Expiration.TotalSeconds }); } } return BadRequest(new { error = "unsupported_grant_type" }); } ``` 4. 实现API资源的保护。示例代码如下: ```csharp [Authorize] [HttpGet] [Route("test")] public IActionResult Test() { return Ok(new { message = "Hello, World!" }); } ``` 以上是一个基本的OAuth2.0服务端实现,包括JWT。你可以根据自己的需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值