好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#中如何配置与应用JWT功能

C#中如何配置与应用JWT功能

1. 安装必要的 NuGet 包,确保项目中安装了以下包:

bash

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

Install-Package System.IdentityModel.Tokens.Jwt

2. 配置 JWT 参数

在 appsettings.json 中添加 JWT 配置:

json

{

  "JwtSettings": {

    "SecretKey": "your-256-bit-secret-key-here", // 至少32字符的密钥

    "Issuer": "your-issuer",                     // 签发者(如服务名称)

    "Audience": "your-audience",                 // 接收者(如客户端应用)

    "ExpireMinutes": 60                          // Token 有效期(分钟)

  }

}

3. 配置 JWT 服务

在 Program.cs 或 Startup.cs 中配置认证服务:

using Microsoft.AspNetCore.Authentication.JwtBearer;

using Microsoft.IdentityModel.Tokens;

using System.Text;

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["JwtSettings:Issuer"],

        ValidAudience = builder.Configuration["JwtSettings:Audience"],

        IssuerSigningKey = new SymmetricSecurityKey(

            Encoding.UTF8.GetBytes(builder.Configuration["JwtSettings:SecretKey"])

        )

    };

});

// 添加授权服务(可选,根据需要配置策略)

builder.Services.AddAuthorization();

var app = builder.Build();

// 启用认证和授权中间件

app.UseAuthentication();

app.UseAuthorization();

app.Run();

4. 生成 JWT Token

创建一个 AuthController 处理登录和 Token 生成:

using Microsoft.AspNetCore.Mvc;

using Microsoft.IdentityModel.Tokens;

using System.IdentityModel.Tokens.Jwt;

using System.Security.Claims;

using System.Text;

[ApiController]

[Route("api/[controller]")]

public class AuthController : ControllerBase

{

    private readonly IConfiguration _configuration;

    public AuthController(IConfiguration configuration)

    {

        _configuration = configuration;

    }

    [HttpPost("login")]

    public IActionResult Login([FromBody] LoginRequest request)

    {

        // 1. 验证用户凭证(示例逻辑,需替换为实际验证逻辑)

        if (request.Username != "admin" || request.Password != "admin123")

        {

            return Unauthorized("用户名或密码错误");

        }

        // 2. 生成 JWT Token

        var claims = new[]

        {

            new Claim(ClaimTypes.Name, request.Username),

            new Claim(ClaimTypes.Role, "Admin") // 添加角色声明

        };

        var key = new SymmetricSecurityKey(

            Encoding.UTF8.GetBytes(_configuration["JwtSettings:SecretKey"])

        );

        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(

            issuer: _configuration["JwtSettings:Issuer"],

            audience: _configuration["JwtSettings:Audience"],

            claims: claims,

            expires: DateTime.Now.AddMinutes(

                Convert.ToDouble(_configuration["JwtSettings:ExpireMinutes"])

            ),

            signingCredentials: credentials

        );

        var tokenString = new JwtSecurityTokenHandler().WriteToken(token);

        return Ok(new { Token = tokenString });

    }

}

public class LoginRequest

{

    public string Username { get; set; }

    public string Password { get; set; }

}

5. 保护 API 端点

使用 [Authorize] 标记需要认证的 Controller 或 Action:

[ApiController]

[Route("api/[controller]")]

[Authorize] // 整个 Controller 需要认证

public class ProtectedController : ControllerBase

{

    [HttpGet("data")]

    public IActionResult GetData()

    {

        // 获取当前用户信息(来自 Token 的 Claims)

        var username = User.Identity.Name;

        var role = User.FindFirst(ClaimTypes.Role)?.Value;

        return Ok(new { Message = $"你好 {username},你的角色是 {role}" });

    }

    [HttpGet("admin-only")]

    [Authorize(Roles = "Admin")] // 仅允许角色为 Admin 的用户访问

    public IActionResult AdminOnly()

    {

        return Ok("管理员专属内容");

    }

}

6. 测试 JWT 功能

(1) 登录获取 Token

http

POST /api/auth/login

Content-Type: application/json

{

  "username": "admin",

  "password": "admin123"

}

响应:

{

  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

}

(2) 访问受保护的 API

在请求头中添加 Authorization:

http

GET /api/protected/data

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

关键点说明

密钥安全

生产环境中应使用强密钥(如 256 位随机字符串)。

避免硬编码密钥,推荐通过环境变量或密钥管理服务注入。

Token 有效期

根据安全需求设置合理的 ExpireMinutes(通常 15~60 分钟)。

签名算法

示例中使用 HMAC-SHA256(对称加密),适合单服务场景。

分布式系统可改用非对称加密(如 RSA-SHA256)。

Claims 设计

包含必要用户信息(如 UserId、Role),避免泄露敏感数据。

常见问题处理

Q1: Token 验证失败

检查 SecretKey、Issuer、Audience 是否一致。

确保请求头中的 Token 格式正确(Bearer {token})。

Q2: 跨域问题(CORS)

在 Program.cs 中配置 CORS:

builder.Services.AddCors(options =>

{

    options.AddPolicy("AllowAll", builder =>

    {

        builder.AllowAnyOrigin()

               .AllowAnyMethod()

               .AllowAnyHeader();

    });

});

app.UseCors("AllowAll");

Q3: 刷新 Token

实现 Refresh Token 机制,通过新的接口生成新 Token。

通过以上步骤,即可在 C# 应用中完整实现 JWT 的配置与应用。


查看更多关于C#中如何配置与应用JWT功能的详细内容...

  阅读:28次