翼度科技»论坛 编程开发 .net 查看内容

JWT身份验证:.NET Core后台与Vue.js前端实现详解

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
 
概述:JSON Web Token(JWT)是一种用于安全传输信息的标准。主要用于身份验证和信息传递,通过头部、载荷和签名构成。在.NET Core中,可通过
Microsoft.AspNetCore.Authentication.JwtBearer实现后台服务,提供生成、刷新和验证Token的接口。前端使用Vue.js结合axios发送请求,通过拦截器实现自动刷新Token,确保安全可靠的身份验证和信息传递。
什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间传输信息的轻量级、自包含的标准。JWT由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。它通常被用于身份验证和信息传递。

  • 头部(Header):声明类型和使用的签名算法。
  1. { "alg": "HS256", "typ": "JWT" }
复制代码

  • 载荷(Payload):包含声明(claims),是关于实体(通常是用户)和其他数据的声明。
  1. { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
复制代码

  • 签名(Signature):使用密钥对头部和载荷进行签名,以确保数据的完整性和来源验证。
JWT 主要用途

JWT主要用于在网络应用中安全地传递声明。常见用途包括身份认证和信息交换。生成的JWT可以被验证,信任,并且不易被篡改。
JWT 的原理

JWT的原理基于对称或非对称加密。生成JWT时,使用密钥对头部和载荷进行签名。验证时,接收到的JWT通过相同的过程重新计算签名,并与接收到的签名进行比较。由于签名使用密钥生成,只有拥有密钥的一方才能生成有效的签名。
JWT 应用场景


  • 身份认证:用户登录后,服务器生成JWT,并在每个后续请求中携带JWT,以验证用户身份。
  • 信息传递:JWT可以包含任意信息,用于在不同系统之间安全传递信息,如用户权限、配置信息等。
JWT 有哪几种传输方式


  • HTTP Header:JWT通常放在HTTP请求的Authorization头部中,使用Bearer方案,例如:Authorization: Bearer your_token_here。
  • URL 参数:可以将JWT作为URL的查询参数传递。
  • POST 请求体:可以将JWT放在POST请求体中进行传递。
在 .NET Core 中使用 JWT

后台服务实现


  • 安装 NuGet 包
  1. dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
复制代码

  • 配置 JWT 服务
  1. services.AddAuthentication(options =>
  2. {
  3.     options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  4.     options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  5. }).AddJwtBearer(options =>
  6. {
  7.     options.TokenValidationParameters = new TokenValidationParameters
  8.     {
  9.         ValidateIssuer = false,
  10.         ValidateAudience = false,
  11.         ValidateLifetime = true,
  12.         ValidateIssuerSigningKey = true,
  13.         IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
  14.     };
  15. });
复制代码

  • 添加授权中间件
  1. app.UseAuthentication();
复制代码

  • 生成 Token 接口
  1. [ApiController]
  2. [Route("api/auth")]
  3. public class AuthController : ControllerBase
  4. {
  5.     private readonly JwtService _jwtService;
  6.     public AuthController(JwtService jwtService)
  7.     {
  8.         _jwtService = jwtService;
  9.     }
  10.     [HttpPost("login")]
  11.     public IActionResult Login([FromBody] LoginRequest request)
  12.     {
  13.         // 验证用户名和密码,生成 ClaimsIdentity
  14.         ClaimsIdentity identity = ...
  15.         // 生成 JWT
  16.         string token = _jwtService.GenerateToken(identity);
  17.         return Ok(new { Token = token });
  18.     }
  19. }
复制代码

  • 刷新 Token 接口
  1. [Authorize]
  2. [HttpPost("refresh")]
  3. public IActionResult RefreshToken()
  4. {
  5.     // 从当前用户的 Claims 中获取信息,生成新的 Token
  6.     ClaimsIdentity identity = ...
  7.     string newToken = _jwtService.GenerateToken(identity);
  8.     return Ok(new { Token = newToken });
  9. }
复制代码

  • 验证 Token 接口
  1. [Authorize]
  2. [HttpGet("protected")]
  3. public IActionResult ProtectedResource()
  4. {
  5.     // 受保护的资源
  6.     return Ok(new { Message = "This is a protected resource." });
  7. }
复制代码
前端 VUE 实现


  • 安装 axios
  1. npm install axios
复制代码

  • 在 Vue 组件中使用 JWT
  1. import axios from 'axios';
  2. // 每次请求前检查 Token 是否过期,如果过期则刷新
  3. axios.interceptors.request.use(async (config) => {
  4.     const token = localStorage.getItem('jwtToken');
  5.     if (token) {
  6.         // 检查 Token 是否过期
  7.         const decodedToken = parseJwt(token);
  8.         const currentTimestamp = Math.floor(Date.now() / 1000);
  9.         if (decodedToken.exp < currentTimestamp) {
  10.             // Token 过期,刷新 Token
  11.             await refreshToken();
  12.         }
  13.         config.headers.Authorization = `Bearer ${token}`;
  14.     }
  15.     return config;
  16. });
  17. // 刷新 Token
  18. async function refreshToken() {
  19.     const token = localStorage.getItem('jwtToken');
  20.     const response = await axios.post('api/auth/refresh', null, { headers: { Authorization: `Bearer ${token}` } });
  21.     const newToken = response.data.Token;
  22.     localStorage.setItem('jwtToken', newToken);
  23. }
  24. // 发送包含 JWT 的请求
  25. async function sendRequest() {
  26.     try {
  27.         const response = await axios.get('api/auth/protected');
  28.         console.log(response.data);
  29.     } catch (error) {
  30.         console.error('Request failed:', error);
  31.     }
  32. }
  33. // 解析 JWT
  34. function parseJwt(token) {
  35.     const base64Url = token.split('.')[1];
  36.     const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  37.     const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
  38.         return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  39.     }).join(''));
  40.     return JSON.parse(jsonPayload);
  41. }
复制代码
以上是一个简单的示例,实际应用中需要考虑更多的安全性和错误处理。确保在生产环境中使用 HTTPS 以保障数据传输的安全性。
 



来源:https://www.cnblogs.com/hanbing81868164/p/18049586
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具