007. ASP.NET WEB API配置JWT令牌身份认证

ASP.NET Web API 中实现 JWT(JSON Web Token)认证是一个非常标准且安全的选择。以下是实现该功能的步骤指南:

一. 安装必要的 NuGet 包

你需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。

html 复制代码
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

二. 配置 Program.cs

1.在 Program.cs 中配置 JWT 认证服务,以便让系统能够解析和验证 Token。

使用时,需要设置密码,密码大于32位

cs 复制代码
 public static void Main(string[] args)
 {
     var builder = WebApplication.CreateBuilder(args);

    
     
     //改动1. 添加JWT令牌身份认证服务
     builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
         .AddJwtBearer(options =>
         {
             options.TokenValidationParameters = new TokenValidationParameters
             {
                 ValidateIssuer = true,
                 ValidateAudience = true,
                 ValidateLifetime = true,
                 ValidateIssuerSigningKey = true,
                 ValidIssuer = "yourdomain.com", // 实际使用时替换为云服务器主页
                 ValidAudience = "yourdomain.com",
                 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的jwt密码,大于32位"))
             };
         });

使用jwt身份认证中间件

cs 复制代码
 var app = builder.Build();


 app.UseAuthentication(); // 2. 启用jwt认证和授权中间件,,在MapControllers();前调用
 app.UseAuthorization();  // 2. 启用jwt认证和授权中间件,在MapControllers();前调用

2.配置跨域

由于你的服务器会被外部浏览器访问,请务必处理以下两点:

cs 复制代码
//配置跨域
builder.Services.AddCors(options => {
    options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});

app.UseCors("AllowAll");// 启用跨域,,,在 app.MapControllers() 之前添加

3.配置好后完整的主程序代码

使用时需要设置密码

cs 复制代码
using Microsoft.AspNetCore.Authentication.JwtBearer;//引用空间
using Microsoft.IdentityModel.Tokens;//引用空间
using System.Text;//引用空间


namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

           
            
            //改动1. 添加JWT令牌身份认证服务
            builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = "yourdomain.com", // 你的域名
                        ValidAudience = "yourdomain.com",
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("cjp06630663@1234567899876543211990112906131376044019000000000000000000000000000000000000000000000000000000000"))
                    };
                });




            //改动2.跨域配置
            builder.Services.AddCors(options => {
                options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
            });


            builder.Services.AddControllers();
            builder.Services.AddOpenApi();

            var app = builder.Build();

           
            app.UseAuthentication(); // 2. 启用jwt认证和授权中间件,,在MapControllers();前调用
            app.UseAuthorization();  // 2. 启用jwt认证和授权中间件,在MapControllers();前调用

            app.UseCors("AllowAll");//启用跨域,,在MapControllers();前调用

            if (app.Environment.IsDevelopment())
            {
                app.MapOpenApi();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

三.创建用户对象类LoginRequest.cs

每一个用户都可以看成一个对象,包含用户名和密码,多个用户管理其实就是通过 list<类>来管理一个个用户对象

cs 复制代码
namespace WebApplication1
{
    public class LoginRequest
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }
}

四. 创建登录控制器 (生成 Token)

新建一个登录验证控制器类,这是个简单功能的验证,验证登录名和密码成功后并返回一个生成的 JWT令牌。用户拿着这个Token令牌就可以去访问加密的api

cs 复制代码
using Microsoft.AspNetCore.Identity.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace WebApplication1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        /// <summary>
        /// 登录验证,传入一个用户类对象,如果用户名和密码正确,则返回一个JWT令牌
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpPost("login")]
        public IActionResult Login([FromBody] LoginRequest request)
        {
            // 验证用户逻辑...
            if (request.Username == "admin" && request.Password == "123456")
            {
                var token = GenerateJwtToken(request.Username);// 给这个用户生成JWT令牌
                return Ok(new { token });
            }
            return Unauthorized();// 如果用户名或密码不正确,返回未授权状态
        }


        //生成令牌
        private string GenerateJwtToken(string username)
        {
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("主程序设置的密码,不少于32位"));
            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(
                issuer: "yourdomain.com",
                audience: "yourdomain.com",
                claims: new[] { new Claim(ClaimTypes.Name, username) },
                expires: DateTime.Now.AddHours(2),
                signingCredentials: credentials);

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

    }
}

4. 需要JWT令牌才能访问的加密 API 接口

一是在需要验证的 Controller 或 Action 上添加 [Authorize] 特性。加上这标签后,服务器会自动将这个api设置为需要jwt令牌才能访问的api

cs 复制代码
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace WebApplication1.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class esp32 : ControllerBase
    {
        // GET: api/<esp32>
        [Authorize]
        [HttpGet("data")]
        public IActionResult GetData()
        {
            return Ok("这是受保护的数据");
        }

     
    }
}

五.外部调用方法(http)

外部调用使用jwt加密的服务器api基本逻辑如下:

测试 JWT 验证功能,最快、最专业的方法是使用 PostmanInsomnia。这些工具可以让你无需编写任何代码,直接模拟 HTTP 请求。

以下是使用 Postman 进行快速测试的步骤:

1. 第一步:访问登录验证api 获取 Token

首先,你需要调用你的登录接口,获取服务器返回的 JWT 字符串。

http://localhost:5191/api/auth/loginhttp://localhost:5191/api/auth/login访问方式: POST

报文Body 用json格式上传服务器用户对象类的属性用户名和密码

如果用户名和密码正确,服务器就会给生成返回一个Token令牌给我们,有了这个Token,我们就可以去访问加密的服务器api了

2. 第二步:访问JWT加密服务器接口

在响应中找到 token 字段,将其复制下来。复制双引号内的内容

访问jwt令牌加密的服务器api

cs 复制代码
[Route("api/[controller]")]
[ApiController]
public class esp32 : ControllerBase
{
    // GET: api/<esp32>
    [Authorize]
    [HttpGet("data")]
    public IActionResult GetData()
    {
        return Ok("这是受保护的数据");
    }

 
}

这支api指定了data报文模式,所以我们需要用data路由才能get到

http://localhost:5191/api/esp32/datahttp://localhost:5191/api/esp32/data

本文的头Headers需要写入Token令牌信息

  • Headers :
    • Key: Authorization
    • Value: Bearer <粘贴你的token> (注意:Bearer 后面有一个空格)

这是用Postman这款软件能快速写入报文头这些信息,实际开发使用中要自己去封装报文,让网络请求报文Headers带有Token密匙

如果密匙和身份一致,成功拿到服务器加密API的数据

相关推荐
程序员mine1 小时前
Web服务密码存储安全详解:从哈希到密钥派生的演进
前端·后端
weixin_307779131 小时前
从工具到协作者:AI在后端研发中的流程重构与组织赋能
人工智能·后端·python·算法·自动化
fliter1 小时前
Rust 如何用 Josh 管理跨仓库代码共享
后端
li-xun2 小时前
我给自己的 Django 博客做了一个在线工具箱:从图片压缩到正则测试,尽量都在浏览器本地处理
后端·python·django
码不停蹄的玄黓2 小时前
SpringBoot 实现拦截器
java·spring boot·后端
IT_陈寒2 小时前
Java的ArrayList扩容把我坑惨了,原来是这样搞的
前端·人工智能·后端
我登哥MVP2 小时前
SpringCloud 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
JackSparrow4142 小时前
彻底理解Java NIO(三)Java实现 I/O多路复用+Reactor模式及开源框架代码解读
java·c语言·开发语言·后端·nio·reactor模式
zavoryn2 小时前
Jackson 序列化踩坑:LocalDateTime、Long 精度丢失和 boolean isXxx 字段
java·开发语言·后端