0

0

.NET Web API如何实现JWT用户认证_JWT认证实现完整流程

月夜之吻

月夜之吻

发布时间:2025-11-04 13:33:02

|

192人浏览过

|

来源于php中文网

原创

首先配置JWT认证服务并添加必要包,然后在Program.cs中设置认证授权中间件,接着通过AuthController实现用户登录并生成令牌,再使用[Authorize]特性保护API接口,最后前端携带Bearer令牌调用受保护接口完成身份验证。

.net web api如何实现jwt用户认证_jwt认证实现完整流程

在 .NET Web API 中实现 JWT(JSON Web Token)用户认证,是一种安全且高效的身份验证方式。它允许客户端在登录后获得一个令牌,后续请求只需携带该令牌即可完成身份识别,无需反复登录。以下是完整的实现流程,涵盖从用户登录到受保护接口访问的全过程。

1. 安装必要包并配置 JWT 服务

在项目中启用 JWT 认证,首先要安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。

可通过 NuGet 包管理器或命令行安装:
  • Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

然后在 Program.cs 中配置 JWT 认证服务:

var builder = WebApplication.CreateBuilder(args);

// 添加认证服务
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();

var app = builder.Build();

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

同时,在 appsettings.json 中添加 JWT 配置:

{
  "Jwt": {
    "Key": "your-super-secret-key-that-is-long-enough",
    "Issuer": "https://localhost:5001",
    "Audience": "https://localhost:5001"
  }
}

2. 创建用户模型与登录接口

定义一个简单的用户模型用于模拟登录:

public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Role { get; set; }
}

创建一个登录控制器,生成 JWT 令牌:

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public AuthController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] User loginUser)
    {
        // 模拟验证用户(实际应查询数据库)
        var user = AuthenticateUser(loginUser.Username, loginUser.Password);
        if (user == null)
            return Unauthorized();

        var token = GenerateJwtToken(user);
        return Ok(new { Token = token });
    }

    private User AuthenticateUser(string username, string password)
    {
        // 示例用户,实际应使用密码哈希和数据库验证
        if (username == "admin" && password == "password")
        {
            return new User { Username = "admin", Role = "Admin" };
        }
        return null;
    }

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

        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.Username),
            new Claim(ClaimTypes.Role, user.Role),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };

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

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

3. 创建受保护的 API 接口

使用 [Authorize] 特性保护需要认证的接口:

万彩商图
万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

下载
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new
        {
            Message = "This is a secure endpoint.",
            User = User.Identity.Name,
            Role = User.FindFirst(ClaimTypes.Role)?.Value
        });
    }

    [HttpGet("admin")]
    [Authorize(Roles = "Admin")]
    public IActionResult GetAdmin()
    {
        return Ok(new { Message = "Hello Admin!" });
    }
}

此时,只有携带有效 JWT 的请求才能访问这些接口。

4. 前端调用与测试流程

前端首先调用登录接口获取 token:

// POST /api/auth/login
{
  "username": "admin",
  "password": "password"
}

成功后得到返回的 token:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.x..."
}

后续请求在 Header 中携带 token:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.x...

调用受保护接口时,.NET 自动验证 token 并设置 User 主体信息。

基本上就这些。整个流程包括:配置 JWT 认证、生成 token、保护接口、前端传参。不复杂但容易忽略细节,比如密钥长度、时间有效性、中间件顺序等。只要按步骤实现,就能构建一个安全可靠的认证系统。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

175

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

102

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

400

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

305

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

67

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6025

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

777

2023.09.14

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

运维自动化平台项目
运维自动化平台项目

共57课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号