面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. .NET
  3. 正文

ASP.NET Core 生成签名安全的 JWT Token

2023年1月13日 222点热度 2人点赞 0条评论
内容纲要

大多数情况下,大家使用的生成 JWT Token 代码是这样的:

            // 定义用户信息
            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, userName)
            };

            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenOption.SecurityKey));
            JwtSecurityToken token = new JwtSecurityToken(
                issuer: userName,
                audience: "http://192.168.6.6:666",
                claims: claims,
                notBefore: DateTime.Now,
                expires: DateTime.Now.AddDays(1),
                signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
            );

但是这样生成的 Token 属于不安全的 Token,没有被签名。

file

为了让 Token 更加安全,可以这样:

            // 定义用户信息
            var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, userName)
            };

            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenOption.SecurityKey));

            SecurityToken securityToken = new JwtSecurityTokenHandler().CreateToken(new SecurityTokenDescriptor
            {
                Claims = claims.ToDictionary(x => x.Type, x => (object)x.Value),
                Issuer = "http://192.168.6.6:666",
                Audience = userName,
                NotBefore = DateTime.Now,
                Expires = DateTime.Now.AddDays(100),
                SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
            });
            var indf = securityToken.ToString();
            var jwtToken = new JwtSecurityTokenHandler().WriteToken(securityToken);

            return jwtToken;

file

另外检查 Token 的代码可以这样写:

            if (string.IsNullOrWhiteSpace(token)) return false;
            if (!token.StartsWith("Bearer ")) return false;
            var newToken = token[7..];

            var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();

            if (!jwtSecurityTokenHandler.CanReadToken(newToken)) return false;

            var checkResult = await jwtSecurityTokenHandler.ValidateTokenAsync(newToken, new TokenValidationParameters()
            {
                RequireExpirationTime = true,
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenOption.SecurityKey)),
            });

            if (!checkResult.IsValid) return false;

            var jwt = jwtSecurityTokenHandler.ReadJwtToken(newToken);
            IEnumerable<Claim> claims = jwt.Claims;
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: asp core jwt net token
最后更新:2023年1月13日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号