C# WEB API实现token

C# Web API 实现 Token 认证(JWT)

1. 核心概念
  • JWT (JSON Web Token):轻量级的认证协议,包含三部分:
    • Header(算法和类型)
    • Payload(用户数据)
    • Signature(防篡改签名)
  • 流程
    1. 用户登录获取 Token
    2. API 请求携带 Token
    3. 服务器验证 Token
2. 实现步骤
步骤 1:安装 NuGet 包
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Install-Package System.IdentityModel.Tokens.Jwt
步骤 2:配置 JWT 服务(Program.cs)
var builder = WebApplication.CreateBuilder(args);

// 添加 JWT 配置
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidAudience = builder.Configuration["Jwt:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };
});

builder.Services.AddAuthorization();
步骤 3:添加 appsettings.json 配置
{
  "Jwt": {
    "Key": "your_256_bit_secret_key_here",
    "Issuer": "yourdomain.com",
    "Audience": "yourapplication",
    "ExpireMinutes": 30
  }
}
步骤 4:创建登录控制器生成 Token
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _config;

    public AuthController(IConfiguration config)
    {
        _config = config;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel login)
    {
        // 实际项目需验证数据库
        if (login.Username == "admin" && login.Password == "password")
        {
            var token = GenerateJwtToken(login.Username);
            return Ok(new { token });
        }
        return Unauthorized();
    }

    private string GenerateJwtToken(string username)
    {
        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
        var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(ClaimTypes.Role, "Admin") // 添加角色声明
        };

        var token = new JwtSecurityToken(
            issuer: _config["Jwt:Issuer"],
            audience: _config["Jwt:Audience"],
            claims: claims,
            expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpireMinutes"])),
            signingCredentials: credentials
        );

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

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}
步骤 5:保护 API 端点
[Authorize] // 添加认证要求
[ApiController]
[Route("api/[controller]")]
public class ProtectedController : ControllerBase
{
    [HttpGet("data")]
    public IActionResult GetData()
    {
        // 获取当前用户信息
        var username = User.Identity.Name;
        var role = User.FindFirst(ClaimTypes.Role)?.Value;
        
        return Ok(new { message = $"你好 {username}, 你的角色是 {role}" });
    }
}
3. 测试流程
  1. 获取 Token

    POST /api/auth/login
    Content-Type: application/json
    
    {
      "username": "admin",
      "password": "password"
    }
    

    响应:

    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
    }
    
  2. 访问受保护 API

    GET /api/protected/data
    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    
4. 安全增强建议
  1. 使用 HTTPS 加密传输
  2. Token 设置合理有效期(如 15-30 分钟)
  3. 实现 Token 刷新机制
  4. 敏感操作要求二次认证
  5. 定期轮换签名密钥

注意:实际项目中需替换硬编码的用户验证逻辑为数据库查询,并添加密码哈希处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值