首页 > 其他分享 >.Net中使用JWT

.Net中使用JWT

时间:2023-02-19 10:33:05浏览次数:40  
标签:string 使用 JWT claims var new Net

.Net中使用JWT

一、JWT数据结构

实际的 JWT 大概就像下面这样。

截图

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

Header(头部包含算法信息)
Payload(负载包含实际传递信息)
Signature(对前面两部分的签名)

写成一行,就是下面这样

截图

二、怎么生成JWT

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;

//payload部分
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("zidingyi", "自定义"));
claims.Add(new Claim(ClaimTypes.NameIdentifier, "11111"));
claims.Add(new Claim(ClaimTypes.Name, "zebary"));
claims.Add(new Claim(ClaimTypes.Role, "admin"));
claims.Add(new Claim(ClaimTypes.Role, "user"));

//服务器私钥不能太短
string key = "dkdls()dlfj%sldfj#sdlfnbmlkepkkqaopxd@9094";
//超时时间
DateTime expire = DateTime.Now.AddHours(1);

//编码
byte[] secBytes = Encoding.UTF8.GetBytes(key);
var secKey = new SymmetricSecurityKey(secBytes);
var credentials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);
var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expire, signingCredentials: credentials);
string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);

注意JWT中payload是明文保存的,不要把不能被客户端知道的信息放到JWT中

我们可以做个测试,对编码之后的jwt不用私钥直接解码

//不使用私钥,直接解码
string[] segments = jwt.Split('.');
string head = JwtDecode(segments[0]);
string payload = JwtDecode(segments[1]);
Console.WriteLine($"head:{head}");
Console.WriteLine($"payload:{payload}");

string JwtDecode(string s)
{
    s = s.Replace('-', '+').Replace('_', '/');
    switch (s.Length % 4)
    {
        case 2:
            s += "==";
            break;
        case 3:
            s += "=";
            break;
    }

    var bytes = Convert.FromBase64String(s);
    return Encoding.UTF8.GetString(bytes);
}

截图

使用私钥验证是否篡改

//使用私钥验证签名是否篡改
string seckey = "dkdls()dlfj%sldfj#sdlfnbmlkepkkqaopxd@9094";
JwtSecurityTokenHandler tokenHandler = new();
TokenValidationParameters valParams = new();
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(seckey));
valParams.IssuerSigningKey = securityKey;
valParams.ValidateIssuer = false;
valParams.ValidateAudience = false;

//验证是否篡改,如果篡改会报异常
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwt,valParams,out SecurityToken secToken);
foreach(var claim in claimsPrincipal.Claims)
{
    Console.WriteLine($"{claim.Type}={claim.Value}");
}

截图

以上代码在.Net 6 和.Net Framework 4.6中运行过其他没有试过

标签:string,使用,JWT,claims,var,new,Net
From: https://www.cnblogs.com/zebrafish/p/17134306.html

相关文章

  • 什么是JWT
    什么是JWTJWT(jsonwebtoken)要说JWT是什么,先谈谈没有JWT的时候是怎么进行身份验证的呢?通常会用到session客户端登陆服务器填写用户名密码服务器验证身份保存一个se......
  • Visual Studio 集成了.NET 升级助手插件
    .NET团队2023年2月16日在官方博客上发布了名为“.NETUpgradeAssistant”的全新VisualStudio扩展,帮助开发人员升级.NET应用程序。这意味着程序员可以不通过命令行工具......
  • Django Rest Frame work 如何使用serializers序列化函数新手教程
    DjangoRestFramework如何使用serializers序列化   DjangoRestFramework提供了serializers模块,用于序列化和反序列化模型实例以及原生数据类型......
  • Django Rest Frame work 如何使用serializers序列化
    DjangoRestFramework如何使用serializers序列化   DjangoRestFramework提供了serializers模块,用于序列化和反序列化模型实例以及Python原生数......
  • How can I secure a .NET application?
    HowcanIsecurea.NETapplication?Thereareseveralwaystosecurea.NETapplication,someofwhichinclude:Authenticationandauthorization:Implementi......
  • What is the difference between session and application state in ASP.NET?
    WhatisthedifferencebetweensessionandapplicationstateinASP.NET?InASP.NET,SessionstateandApplicationstatearetwodifferentwaystostoredatat......
  • What is the role of Global.asax in ASP.NET?
    WhatistheroleofGlobal.asaxinASP.NET?TheGlobal.asaxfileinASP.NETisusedtohandleapplication-leveleventsandsetapplication-levelvariablesand......
  • How can I implement caching in ASP.NET?
    HowcanIimplementcachinginASP.NET?Cachingisatechniqueusedtotemporarilystorefrequentlyaccesseddatainmemoryorondiskinordertoimproveappl......
  • Kubernetes(七)
    一、日志收集案例-容器内置日志收集容器内置日志收集架构应用程序以tomcat为例,实现方法如下:1.1构建镜像1.1.1准备基础tomcat镜像tomcat基础镜像构建参考:5.1.2tom......
  • 如何使用 Dapper 中的异步方法
    Dapper是一个容易上手,轻量级,灵活高效,开源的迷你ORM,由StackOverflow团队的SamSaffron出品,你可以利用Dapper简化数据访问并且支持高性能,还有一点,Dapper提供......