首页 > 其他分享 >深入解析:JWT Bearer 认证在 .NET Core 中的应用

深入解析:JWT Bearer 认证在 .NET Core 中的应用

时间:2024-11-01 13:33:04浏览次数:6  
标签:Core Bearer JWT 认证 using var new

在现代 Web 应用中,安全认证是确保用户数据和系统安全的重要一环。JSON Web Token (JWT) 是一种流行的认证方式,它可以在客户端和服务端之间安全地传递信息。本文将详细介绍 JWT Bearer 认证的概念、工作原理、在 .NET Core 中的实现步骤,以及最佳实践。

一、什么是 JWT?

JSON Web Token (JWT) 是一个开放标准(RFC 7519),用于以安全的方式在网络应用环境中传递声明信息。JWT 的基本结构由三个部分组成:

  1. 头部 (Header):通常包含令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256)。

  2. 负载 (Payload):包含要传递的数据,称为声明 (Claims),可以是关于用户的信息或其他元数据。

  3. 签名 (Signature):通过将编码后的头部和负载与一个密钥结合,使用指定的算法生成的签名,用于验证令牌的真实性。

JWT 的结构示例如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

二、JWT Bearer 认证的工作原理

在 JWT Bearer 认证中,用户通过提供凭据(如用户名和密码)进行身份验证。以下是基本的工作流程:

  1. 用户登录:用户发送登录请求,附带用户名和密码。

  2. 生成 JWT:服务器验证凭据后生成 JWT,并将其返回给用户。

  3. 使用 JWT:用户在后续的 API 请求中,将 JWT 作为 Bearer Token 发送。

  4. 验证 JWT:服务器接收到请求后,验证 JWT 的有效性。如果有效,则允许访问相应的资源。

JWT 的优势在于它是自包含的,包含了所有用户所需的信息,无需在服务器上存储会话状态。

三、在 .NET Core 中实现 JWT Bearer 认证

1. 安装所需 NuGet 包

在您的 .NET Core 项目中安装 JWT Bearer 认证所需的 NuGet 包:

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

2. 配置 JWT 认证服务

Program.cs 文件中配置 JWT Bearer 认证。以下是完整示例:

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

var builder = WebApplication.CreateBuilder(args);

// 读取 JWT 配置
var jwtSection = builder.Configuration.GetSection("JwtSettings");
var key = jwtSection.GetValue<string>("Key");
var issuer = jwtSection.GetValue<string>("Issuer");
var audience = jwtSection.GetValue<string>("Audience");

// 配置 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 = issuer,
       ValidAudience = audience,
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
  };
});

builder.Services.AddControllers();

var app = builder.Build();

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

app.MapControllers(); // 映射控制器

app.Run();

3. 在 appsettings.json 中配置 JWT 设置

appsettings.json 中添加 JWT 的配置:

{
 "JwtSettings": {
   "Key": "dsggdgewt3452345sbvsdgsdfsvxGHLKGFFJHLL",  // 生成 JWT 所用的密钥
   "Issuer": "mywebapiTest",         // JWT 的颁发者
   "Audience": "mywebapiTest"       // JWT 的接收者
},
 "AllowedHosts": "*"
}

4. 生成 JWT

在用户成功登录后生成 JWT。可以创建一个控制器处理登录请求:

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

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

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

      [HttpPost("login")]
       public IActionResult Login([FromBody] LoginModel login)
      {
           // 验证用户身份(示例中使用简单的硬编码,实际应调用数据库验证)
           if (login.Username == "test" && login.Password == "password")
          {
               var claims = new[]
              {
                   new Claim(ClaimTypes.Name, login.Username)
              };

               var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSettings:Key"]));
               var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

               var token = new JwtSecurityToken(
                   issuer: _configuration["JwtSettings:Issuer"],
                   audience: _configuration["JwtSettings:Audience"],
                   claims: claims,
                   expires: DateTime.Now.AddMinutes(30), // 设置过期时间
                   signingCredentials: creds);

               return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
          }

           return Unauthorized(); // 认证失败
      }
  }

   public class LoginModel
  {
       public string Username { get; set; }
       public string Password { get; set; }
  }
}

5. 保护 API 端点

可以通过 [Authorize] 特性保护需要身份验证的 API 端点:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace MyApp.Controllers
{
  [ApiController]
  [Route("[controller]")]
   public class WeatherForecastController : ControllerBase
  {
      [Authorize] // 保护此 API
      [HttpGet]
       public IActionResult Get()
      {
           return Ok(new { Weather = "Sunny" });
      }
  }
}

四、测试 JWT Bearer 认证

  1. 登录:发送 POST 请求到 /api/auth/login,使用 JSON 格式的用户名和密码进行身份验证。成功后将返回一个 JWT。

    示例请求体:

    {
       "username": "test",
       "password": "password"
    }
  2. 访问受保护的 API:在请求头中添加 Authorization 字段,格式为 Bearer {token}

    示例请求:

    GET /weatherforecast HTTP/1.1
    Authorization: Bearer {your_token}

五、最佳实践

  1. 密钥管理:确保 JWT 的密钥安全,不要将其硬编码在代码中。可以使用环境变量或密钥管理服务。

  2. 过期时间:合理设置 JWT 的过期时间,以防长期有效的令牌被滥用。

  3. 黑名单机制:在用户注销或更改密码时,考虑实现黑名单机制,以便失效旧的 JWT。

  4. HTTPS:始终通过 HTTPS 传输 JWT,防止中间人攻击。

六、总结

JWT Bearer 认证为 .NET Core 应用程序提供了一种简单、安全的身份验证方式。通过本教程,您可以了解如何在 .NET Core 中实现 JWT 认证,从基本配置到实际应用,掌握 JWT 的使用。这种认证机制不仅提高了安全性,还增强了 API 的灵活性和可扩展性。希望您在项目中能够顺利实现 JWT Bearer 认证,提升应用的安全性与用户体验。

 

jwt解析:https://jwt.io/



标签:Core,Bearer,JWT,认证,using,var,new
From: https://www.cnblogs.com/forges/p/18519716

相关文章

  • 历史性突破:独立开发 .net core 在线客服系统累计处理聊天消息 48 万余条!
    业余时间用.netcore写了一个在线客服系统。我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享。后来我索性就发了一个100%私有化版直接给大家下载,方便大家自己部署。同时,为了方便暂时不想自己私有化部署的朋友使用,我免费搭......
  • 界面控件DevExpress JS & ASP.NET Core v24.1亮点 - 支持Angular 18
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore或Vue,DevExtreme包含全面的高性能和响应式UI小部件集合,可在传统Web和下一代移动应用程序中......
  • .Net C# 基于EFCore的DBFirst和CodeFirst
    DBFirst和CodeFirst1概念介绍1.1DBFirst(数据库优先)含义:这种模式是先创建数据库架构,包括表、视图、存储过程等数据库对象。然后通过实体框架(EntityFramework)等工具,根据已有的数据库结构来生成对应的实体类和数据访问代码。应用场景:当已经存在一个成熟的数据库,例如从旧......
  • UOS下配置.net core环境
    1.下载sdkhttps://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/sdk-8.0.403-linux-x64-binaries2.解压并拷贝到目标目录mkdir-p$HOME/dotnet&&tarzxfdotnet-sdk-8.0.403-linux-x64.tar.gz-C$HOME/dotnet3.安装geditsudoaptinstallgedit4.配置/etc/pro......
  • PVE 安装 Ubuntu Core
    一、下载UbuntuCore固件,并上传至PVE镜像存储区二、创建虚拟机1、新建虚拟机,名称填“ubuntu-core”, 2、操作系统选择不使用任何介质3、系统默认 4、磁盘选SATA总线,分配64G存储空间,其余选项默认 5、CPU分配单核双线程即可 6、内存分配2G......
  • PbootCMS提示:Undefined constant "core\basic\ISURL"
    要解决Undefinedconstant"core\basic\ISURL"的问题,可以在/core/basic/Url.php文件中定义ISURL常量。在文件顶部添加以下代码:define('ISURL',false);//或者根据需要设置为true完整代码如下:1<?php2/**3*@copyright(C)2016-2099HnaoyunInc.4*......
  • 记录springboot 3.3.5 版本整合 swagger +spring security + jwt
    springboot版本security版本wagger版本jwt版本redis版本pom文件如下引入redis是为了存储token<version>3.3.5</version><!--security--><dependency><groupId>org.springframework.boot</groupId><arti......
  • 管中窥豹----.NET Core到.NET 8 托管堆的变迁
    https://www.cnblogs.com/lmy5215006/p/18515971 在研究.NETString底层结构时,我所观察到的情况与《.NETCore底层入门》,《.NET内存管理宝典》书中描述不符。故多研究了一下。发现.NET托管堆的结构也是越来越多,越来越高性能。 //示例代码internalclassProgram{......
  • 推荐一个 ASP.NET Core 的轻量级插件框架
    前言本文将介绍一个专为ASP.NETCore设计的轻量级插件框架——PluginCore,该框架不仅能够简化插件的开发与集成,还能大幅提高开发效率。另外,还将简要介绍相关的前端技术和SDK支持,帮助我们快速上手。项目介绍PluginCore是一个轻量级插件框架,通过最小化的配置简化插件的集成与管理......
  • dotnet core微服务框架Jimu ~ 会员授权微服务
    提供授权服务,用户使用会员的用户名和密码获取token,带着token访问受保护的接口,如浏览和发布新闻。有2个公开的api:token:获取token;GetCurrentMemberInfo:获取当前token的会员信息;有1个不公开的方法:GetMemberInfo:根据会员用户名和密码,获取会员信息,该方法供......