.NET Web API如何实现JWT用户认证

月夜之吻
发布: 2025-11-15 12:41:03
原创
134人浏览过
在 .NET Web API 中实现 JWT 认证需先安装必要包,再配置 JWT 参数,接着创建令牌生成服务,然后在 Program.cs 中添加认证中间件,最后通过 [Authorize] 保护接口并返回 Token。

.net web api如何实现jwt用户认证

在 .NET Web API 中实现 JWT(JSON Web Token)用户认证,主要涉及生成令牌、配置认证中间件以及保护 API 资源。下面是一个简洁实用的实现流程。

1. 安装必要包

确保项目中安装了以下 NuGet 包:

  • Microsoft.AspNetCore.Authentication.JwtBearer:用于配置 JWT 认证方案
  • System.IdentityModel.Tokens.Jwt:用于生成和处理 JWT
  • Microsoft.IdentityModel.Tokens:提供加密支持

可通过 NuGet 包管理器或命令行安装:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
登录后复制

2. 配置 JWT 设置

appsettings.json 中添加 JWT 相关配置:

{
  "JwtSettings": {
    "Key": "your-very-secret-key-that-is-at-least-32-characters-long",
    "Issuer": "your-api-site.com",
    "Audience": "your-client-site.com",
    "TokenExpirationInMinutes": 60
  }
}
登录后复制

创建一个对应的 C# 类来读取这些设置:

public class JwtSettings
{
    public string Key { get; set; }
    public string Issuer { get; set; }
    public string Audience { get; set; }
    public int TokenExpirationInMinutes { get; set; }
}
登录后复制

Program.cs 中注册该配置:

builder.Configuration.GetSection("JwtSettings").Bind(new JwtSettings());
builder.Services.Configure<JwtSettings>(builder.Configuration.GetSection("JwtSettings"));
登录后复制

3. 生成 JWT 令牌

创建一个服务用于生成令牌,例如:

public class TokenService
{
    private readonly JwtSettings _jwtSettings;
<pre class='brush:php;toolbar:false;'>public TokenService(IOptions<JwtSettings> jwtSettings)
{
    _jwtSettings = jwtSettings.Value;
}

public string GenerateToken(string userId, string role)
{
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Key));
    var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

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

    var token = new JwtSecurityToken(
        issuer: _jwtSettings.Issuer,
        audience: _jwtSettings.Audience,
        claims: claims,
        expires: DateTime.Now.AddMinutes(_jwtSettings.TokenExpirationInMinutes),
        signingCredentials: credentials
    );

    return new JwtSecurityTokenHandler().WriteToken(token);
}
登录后复制

}

将服务注册到依赖注入:

知我AI·PC客户端
知我AI·PC客户端

离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

知我AI·PC客户端 0
查看详情 知我AI·PC客户端
builder.Services.AddScoped<TokenService>();
登录后复制

4. 配置 JWT 认证中间件

Program.cs 中启用 JWT Bearer 认证:

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:Key"]))
    };
});
<p>// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();
登录后复制

5. 创建登录接口返回 Token

示例登录控制器:

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly TokenService _tokenService;
<pre class='brush:php;toolbar:false;'>public AuthController(TokenService tokenService)
{
    _tokenService = tokenService;
}

[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
    // 这里应验证用户名密码(可对接数据库或 Identity)
    if (model.Username == "admin" && model.Password == "password")
    {
        var token = _tokenService.GenerateToken("1", "Admin");
        return Ok(new { Token = token });
    }

    return Unauthorized();
}
登录后复制

}

6. 保护 API 接口

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

[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 });
    }
<pre class='brush:php;toolbar:false;'>[HttpGet("admin")]
[Authorize(Roles = "Admin")]
public IActionResult AdminOnly()
{
    return Ok(new { Message = "Only admins can see this." });
}
登录后复制

}

客户端在请求时需在 Header 中携带 Token:

Authorization: Bearer <your-jwt-token>
登录后复制

基本上就这些。只要配置正确,.NET 的 JWT 支持非常稳定且易于扩展。注意密钥安全、过期时间合理设置,并结合 HTTPS 使用。

以上就是.NET Web API如何实现JWT用户认证的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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