新闻中心

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

2025-11-15
浏览次数:
返回列表
在 .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);
}

}

将服务注册到依赖注入:

Reachout.ai Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai
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用户认证的详细内容,更多请关注其它相关文章!


# 是一个  # 株洲网站建设招商电话  # 龙华网站关键词优化公司  # 种草营销推广行业佼佼者  # 天津靠谱的网站制作推广  # 周杰伦个人网站建设  # 湖北枣阳汉城网站推广  # 黔南网站优化如何收费  # seo___微博  # 淘宝seo书籍  # 新乡原阳网站推广  # 管理器  # 解决问题  # 中文网  # 相关文章  # 序列化  # word  # 如何将  # 创建一个  # 如何实现  # 令牌  # elif  # red  # .net  # c#  # microsoft  # ai  # mac  # app  # go  # json  # js 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: C#使用XPath查询节点时出错? 常见语法错误与调试技巧  内存检查:在VS Code中调试C++时的内存视图  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  word中如何让数字纵向排列_Word数字纵向排列方法  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  谷歌google账号注册详细步骤 谷歌账号注册官方教程  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  解决深度学习模型训练初期异常高损失与完美验证准确率问题  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  Tabulator表格日期时间排序问题及自定义解决方案  React Router v6 教程:构建认证保护的私有路由与重定向策略  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  windows10怎么关闭系统提示音_windows10彻底静音设置方法  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  163邮箱登录密码 163邮箱忘记密码找回  抖音网页版快捷访问 抖音网页版网页版入口操作教程  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Angular Material 垂直步进器:实现底部到顶部排序的教程  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  最新韩小圈网页版登录入口_官网在线观看官方链接  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  在哪找SublimeJ远程工具_SFTP插件配置教程  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  动漫花园资源网使用步骤_动漫花园资源网下载流程  如何提高微信支付的安全性_微信支付安全防护与设置建议  如何在Promise链中优雅地中断后续then执行  C++如何比较两个字符串_C++ string compare函数与操作符对比  将HTML动态表格多行数据保存到Google Sheet的教程  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  《主播少女的秘密账号迷宫》首支宣传片  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  outlook中文官网入口地址 outlook官方中文版直达首页链接  mc.js官网登录入口 mc.js官方登录入口最新版  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  J*a递归快速排序中静态变量导致数据累积问题的解决方案  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  Go语言中高效处理x-www-form-urlencoded表单数据 

搜索