导读:本期聚焦于小伙伴创作的《C#怎么实现JWT身份认证 C#如何在ASP.NET Core中集成JWT实现登录Token鉴权》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么实现JWT身份认证 C#如何在ASP.NET Core中集成JWT实现登录Token鉴权》有用,将其分享出去将是对创作者最好的鼓励。

JWT即JSON Web Token,是一种轻量级的身份认证方案,在ASP.NET Core项目中可以通过集成JWT相关组件实现无状态的登录Token鉴权,避免传统Session方案带来的服务器存储压力。整个实现过程主要分为依赖安装、服务配置、Token生成、中间件启用、接口鉴权几个核心步骤。

一、安装必要的NuGet包

首先需要在ASP.NET Core项目中安装JWT相关的依赖包,打开NuGet包管理器,搜索并安装以下两个包:

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • System.IdentityModel.Tokens.Jwt

如果是使用命令行安装,可以执行以下命令:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

二、配置JWT服务

接下来需要在项目的Program.cs文件中配置JWT相关的服务,设置密钥、发行者、接收者、过期时间等参数。

1. 添加配置项

先在appsettings.json中添加JWT的配置信息:

{
  "JwtSettings": {
    "SecretKey": "ThisIsASecureSecretKeyForJwtDemo123456",
    "Issuer": "JwtDemoIssuer",
    "Audience": "JwtDemoAudience",
    "ExpiryMinutes": 30
  }
}

2. 注册JWT服务

Program.cs中读取配置并注册JWT认证服务:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 读取JWT配置
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];
var issuer = jwtSettings["Issuer"];
var audience = jwtSettings["Audience"];
var expiryMinutes = int.Parse(jwtSettings["ExpiryMinutes"]);

// 注册JWT认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // 验证密钥
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
        // 验证发行者
        ValidateIssuer = true,
        ValidIssuer = issuer,
        // 验证接收者
        ValidateAudience = true,
        ValidAudience = audience,
        // 验证过期时间
        ValidateLifetime = true,
        // 过期时间偏移量,设置为0避免时钟偏差问题
        ClockSkew = TimeSpan.Zero
    };
});

builder.Services.AddControllers();

var app = builder.Build();

三、生成JWT Token

登录接口验证用户账号密码通过后,需要生成JWT Token返回给客户端,以下是生成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)
    {
        // 这里模拟账号密码验证,实际项目中需要查询数据库验证
        if (request.Username != "admin" || request.Password != "123456")
        {
            return BadRequest("账号或密码错误");
        }

        // 读取JWT配置
        var jwtSettings = _configuration.GetSection("JwtSettings");
        var secretKey = jwtSettings["SecretKey"];
        var issuer = jwtSettings["Issuer"];
        var audience = jwtSettings["Audience"];
        var expiryMinutes = int.Parse(jwtSettings["ExpiryMinutes"]);

        // 定义Token包含的声明信息
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, request.Username),
            new Claim(ClaimTypes.Role, "Admin"),
            new Claim("UserId", "1001")
        };

        // 创建密钥和签名凭证
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        // 生成Token
        var token = new JwtSecurityToken(
            issuer: issuer,
            audience: audience,
            claims: claims,
            expires: DateTime.Now.AddMinutes(expiryMinutes),
            signingCredentials: creds
        );

        // 返回Token字符串
        return Ok(new
        {
            Token = new JwtSecurityTokenHandler().WriteToken(token),
            Expiry = expiryMinutes
        });
    }
}

// 登录请求参数类
public class LoginRequest
{
    public string Username { get; set; }
    public string Password { get; set; }
}

四、启用认证中间件

服务注册完成后,需要在Program.cs中启用认证和授权中间件,注意中间件的顺序,必须放在UseAuthorization之前,UseRouting之后:

// 启用路由
app.UseRouting();

// 启用认证中间件
app.UseAuthentication();
// 启用授权中间件
app.UseAuthorization();

app.MapControllers();

app.Run();

五、接口添加鉴权特性

需要在需要鉴权的接口或者控制器上添加[Authorize]特性,没有携带有效Token的请求会被拦截返回401状态码:

[ApiController]
[Route("api/[controller]")]
[Authorize] // 整个控制器下的接口都需要鉴权
public class UserController : ControllerBase
{
    [HttpGet("info")]
    public IActionResult GetUserInfo()
    {
        // 从Token中读取用户信息
        var username = User.Identity.Name;
        var userId = User.FindFirst("UserId")?.Value;
        var role = User.FindFirst(ClaimTypes.Role)?.Value;

        return Ok(new
        {
            Username = username,
            UserId = userId,
            Role = role
        });
    }

    [HttpGet("public")]
    [AllowAnonymous] // 该接口允许匿名访问,不需要Token
    public IActionResult PublicApi()
    {
        return Ok("这是一个公开接口");
    }
}

六、注意事项

  • SecretKey的长度不能太短,建议至少32位,避免被暴力破解
  • 生产环境中不要将密钥等敏感信息硬编码在代码里,建议使用环境变量或者配置中心存储
  • Token过期后需要客户端重新调用登录接口获取新Token,也可以实现刷新Token机制延长登录状态
  • 如果接口需要区分不同角色的权限,可以在[Authorize]特性中指定角色,例如[Authorize(Roles = "Admin")]
JWT是无状态Token,一旦签发在过期前无法主动销毁,因此不要将敏感信息放在Token的声明中,避免信息泄露。

C#JWT身份认证ASP.NET_CoreToken鉴权修改时间:2026-07-07 17:45:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。