zoukankan      html  css  js  c++  java
  • jwt 在.net core 2.0的使用

    jwt个人觉得更适合作共享session的传递格式,本身保密性不好,容易泄露重要信息,他的格式为头.一些用户的自定义声明.前两者的加密(公私对称密钥形式)

    需要引用nuget:

    System.IdentityModel.Tokens.Jwt

    服务端:

    [AllowAnonymous]
            [Route("GetToken")]
            [HttpPost]
            public IActionResult GetToken([FromBody]UserInfo user)
            {
                //if (!ModelState.IsValid) return BadRequest("Token failed to generate");
                //var userIdentified = _context.Users.FirstOrDefault(u => u.Username == user.Username);
                //if (userIdentified == null)
                //{
                //    return Unauthorized();
                //}
                //user = userIdentified;
    
                //Add Claims
                //一些用户的声明
                var claims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.UniqueName, "data"),
                    new Claim(JwtRegisteredClaimNames.Sub, "data"),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                };
                //加密需要的key
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("rlyaKithdrYVl6Z80ODU350md")); //Secret
                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                //完整的token
                var token = new JwtSecurityToken("http://localhost:8000",
                    "http://localhost:8001",
                    claims,
                    notBefore: DateTime.Now,    //从指定时候开始算起
                    expires: DateTime.Now.AddMinutes(1),   //从制定时候结束,这一段时间为jwt的过期时间,据说是这样的,但是只是一般声明的话,真的可以起作用吗,本人亲测过应该是可以的,但是还是觉得不是每次都好用
                    signingCredentials: creds);
                
                return Ok(new
                {
                    access_token = new JwtSecurityTokenHandler().WriteToken(token),
                    expires_in = DateTime.Now.AddMinutes(30),
                    token_type = "bearer"//bearer票据类型的token
                });
            }

    postman调用,得到基于base64编码的token:

    l客户端可以通过继承ActionFilterAttribute类去获取头部信息,然后判断里面的内容是否是自己需要的:

       var ret = filterContext.HttpContext.Request.Headers["Authorization"].FirstOrDefault();

    使用这个获取了token后,再根据.号分割出三部分,对前两部分分别进行base64的解码,即可获取服务端的用户内容

    解码方法可以参考:

     private string CreateToken(string message, string secret)
            {
                secret = secret ?? "";
                var encoding = new System.Text.ASCIIEncoding();
                byte[] keyByte = encoding.GetBytes(secret);
                byte[] messageBytes = encoding.GetBytes(message);
                using (var hmacsha256 = new HMACSHA256(keyByte))
                {
                    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                    return Convert.ToBase64String(hashmessage);
                }
            }

    经本人测试,似乎这样的解码方式和原本的base64编码之前的内容有一些差异,比如+-等符号的原本符号都是_代替,这个还希望有更多的朋友来指出这里的缺点,感激不尽

  • 相关阅读:
    PRCR-1065 Failed to stop resource ora.asm 处理
    在Oracle Linux上使用DTrace的相关指导
    Oracle Listener日志位置及压缩转移
    oracle数据库解析json格式
    surge for mac出测试版本了
    Oracle 12C RAC的optimizer_adaptive_features造成数据插入超时
    Oracle执行语句跟踪(2)——使用10046事件实现语句追踪
    在Linux上使用web2py_uwsgi_nginx搭建web服务器
    Windows server上rsync的安装和使用
    Hook原理--逆向开发
  • 原文地址:https://www.cnblogs.com/llcdbk/p/9131133.html
Copyright © 2011-2022 走看看