C# 语言 如何使用 JWT 认证

C#阿木 发布于 5 天前 6 次阅读


C中使用JWT进行认证的详细指南

JSON Web Tokens(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。JWT通常用于身份验证和授权,因为它可以在没有中心服务器的情况下在客户端和服务器之间传递。在C中,使用JWT进行认证是一个常见的需求,本文将详细介绍如何在C中使用JWT进行身份验证。

JWT简介

JWT由三部分组成:

1. 头部(Header):描述JWT的元数据,包括签名算法等。
2. 载荷(Payload):包含实际的数据,如用户ID、角色等。
3. 签名(Signature):使用密钥对头部和载荷进行签名,确保JWT的完整性和真实性。

准备工作

在开始之前,确保你的开发环境中已经安装了.NET Core SDK。以下示例代码将使用.NET Core 3.1。

步骤1:创建JWT工具类

我们需要创建一个工具类来生成和验证JWT。

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

public static class JwtTokenHelper
{
private static readonly string _key = "YourSecretKey";
private static readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key));

public static string GenerateToken(Claim[] claims)
{
var token = new JwtSecurityToken(
signingCredentials: new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256),
claims: claims,
expires: DateTime.Now.AddMinutes(15)
);

return new JwtSecurityTokenHandler().WriteToken(token);
}

public static bool ValidateToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(_key);
try
{
tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ClockSkew = TimeSpan.Zero
}, out SecurityToken validatedToken);
return true;
}
catch
{
return false;
}
}
}

步骤2:创建用户模型

定义一个用户模型,用于存储用户信息。

csharp
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Role { get; set; }
}

步骤3:创建认证控制器

创建一个控制器,用于处理用户登录和生成JWT。

csharp
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
[HttpPost("login")]
public IActionResult Login([FromBody] User user)
{
if (user.Username == "admin" && user.Role == "admin")
{
var claims = new[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Role, user.Role)
};

var token = JwtTokenHelper.GenerateToken(claims);
return Ok(new { Token = token });
}

return Unauthorized();
}
}

步骤4:使用JWT进行认证

在需要保护的路由上添加`[Authorize]`属性。

csharp
[Authorize]
[HttpGet("secure")]
public IActionResult Secure()
{
return Ok("This is a secure endpoint.");
}

步骤5:验证JWT

在客户端,使用生成的JWT进行认证。

csharp
public IActionResult VerifyToken(string token)
{
if (JwtTokenHelper.ValidateToken(token))
{
return Ok("Token is valid.");
}

return BadRequest("Invalid token.");
}

总结

本文详细介绍了如何在C中使用JWT进行身份验证。通过创建JWT工具类、用户模型、认证控制器和验证JWT,你可以轻松地实现一个基于JWT的认证系统。在实际项目中,你可能需要根据具体需求调整密钥、过期时间等参数。希望本文能帮助你更好地理解JWT在C中的应用。