Asp.NET Core WebApi 创建带鉴权机制的Api

构建一个包含 JWT(JSON Web Token)鉴权的 Web API 是一种常见的做法,用于保护 API 端点并验证用户身份。以下是一个基于 ASP.NET Core 的完整示例,展示如何实现 JWT 鉴权。


1. 创建 ASP.NET Core Web API 项目

使用 .NET CLI 或 Visual Studio 创建一个新的 Web API 项目:

dotnet new webapi -n JwtAuthApi
cd JwtAuthApi

2. 安装必要的 NuGet 包

确保安装了以下包(通常默认已包含):

  • Microsoft.AspNetCore.Authentication.JwtBearer
  • Microsoft.IdentityModel.Tokens
  • System.IdentityModel.Tokens.Jwt

如果未安装,可以运行以下命令:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

3. 配置 JWT 鉴权

(1) 修改 appsettings.json

appsettings.json 中添加 JWT 配置:

{"Jwt": {"Key": "YourSecretKeyForJwtAuthentication", // 用于签名的密钥"Issuer": "YourIssuer",                    // 发行者"Audience": "YourAudience"                 // 受众},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}
(2) 配置服务 (Program.cs)

Program.cs 中配置 JWT 鉴权服务:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;var builder = WebApplication.CreateBuilder(args);// 添加 JWT 鉴权
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]);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 = jwtSettings["Issuer"],ValidAudience = jwtSettings["Audience"],IssuerSigningKey = new SymmetricSecurityKey(key)};
});builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();// 使用鉴权中间件
app.UseAuthentication();
app.UseAuthorization();app.MapControllers();app.Run();

4. 创建用户登录和生成 JWT 的逻辑

(1) 创建模型类

创建一个简单的用户模型和返回的响应模型:

public class UserModel
{public string Username { get; set; }public string Password { get; set; }
}public class AuthResponse
{public string Token { get; set; }public DateTime Expiration { get; set; }
}
(2) 创建生成 JWT 的方法

Controllers/AuthController.cs 中实现登录和生成 JWT 的逻辑:

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{private readonly IConfiguration _configuration;public AuthController(IConfiguration configuration){_configuration = configuration;}[HttpPost("login")]public IActionResult Login([FromBody] UserModel user){// 模拟用户验证(实际应从数据库中验证)if (user.Username == "admin" && user.Password == "password"){var token = GenerateJwtToken(user.Username);return Ok(new AuthResponse{Token = token,Expiration = DateTime.UtcNow.AddMinutes(30) // 设置过期时间});}return Unauthorized(new { message = "Invalid username or password" });}private string GenerateJwtToken(string username){var jwtSettings = _configuration.GetSection("Jwt");var key = Encoding.ASCII.GetBytes(jwtSettings["Key"]);var tokenDescriptor = new SecurityTokenDescriptor{Subject = new ClaimsIdentity(new[]{new Claim(ClaimTypes.Name, username),new Claim(ClaimTypes.Role, "Admin") // 示例角色}),Expires = DateTime.UtcNow.AddMinutes(30), // 设置过期时间Issuer = jwtSettings["Issuer"],Audience = jwtSettings["Audience"],SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),SecurityAlgorithms.HmacSha256Signature)};var tokenHandler = new JwtSecurityTokenHandler();var securityToken = tokenHandler.CreateToken(tokenDescriptor);return tokenHandler.WriteToken(securityToken);}
}

5. 创建受保护的 API 端点

(1) 创建一个受保护的控制器

Controllers/SecureController.cs 中创建一个需要 JWT 鉴权的端点:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;[ApiController]
[Route("api/[controller]")]
[Authorize] // 要求鉴权
public class SecureController : ControllerBase
{[HttpGet]public IActionResult Get(){var username = User.Identity.Name;return Ok(new { message = $"Hello, {username}! This is a secure endpoint." });}
}

6. 测试 API

(1) 登录获取 JWT

发送 POST 请求到 /api/auth/login,请求体如下:

{"username": "admin","password": "password"
}

响应会返回一个 JWT Token。

(2) 访问受保护的端点

将获取到的 Token 添加到请求头中,格式为:

Authorization: Bearer <JWT_TOKEN>

然后访问 /api/secure,你将看到受保护的响应。


总结

通过以上步骤,我们实现了一个包含 JWT 鉴权的 Web API。这个示例展示了如何生成 JWT、验证 JWT,以及如何保护 API 端点。你可以根据实际需求扩展功能,例如从数据库验证用户、支持角色权限等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 发送钉钉消息

这里不介绍 Jenkins 的安装&#xff0c;可以网上找到很多安装教程&#xff0c;重点介绍如何集成钉钉消息。 需要提前准备钉钉机器人的 webhook 地址。&#xff08;网上找下&#xff0c;很多教程&#xff09; 下面开始配置钉钉机器人&#xff0c;登录 Jenkins&#xff0c;下载 …

CentOS中离线安装DockerCompos并用其部署Rabbitmq(使用离线导入导出docker镜像方式)

场景 DockerDockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBootVue流水线项目过程详解、踩坑记录(附镜像资源、离线包资源下载)&#xff1a; DockerDockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBootVue流水线项目过程详解、踩坑记录(附镜像资源、离…

stm32week11

stm32学习 八.stm32基础 2.stm32内核和芯片 F1系统架构&#xff1a;4个主动单元和4个被动单元 AHB是内核高性能总线&#xff0c;APB是外围总线 总线矩阵将总线和各个主动被动单元连到一起 ICode总线直接连接Flash接口&#xff0c;不需要经过总线矩阵 AHB&#xff1a;72MHz&am…

贪心算法:部分背包问题深度解析

简介&#xff1a; 该Java代码基于贪心算法实现了分数背包问题的求解&#xff0c;核心通过单位价值降序排序和分阶段装入策略实现最优解。首先对Product数组执行双重循环冒泡排序&#xff0c;按wm(价值/重量比)从高到低重新排列物品&#xff1b;随后分两阶段装入&#xff1a;循环…

13. Langchain异步处理:提升应用性能的关键技巧

引言&#xff1a;从"顺序等待"到"并行加速" 2025年某电商平台引入LangChain异步处理后&#xff0c;大促期间订单处理能力提升5倍&#xff0c;系统响应延迟降低70%。本文将基于LangChain的异步架构&#xff0c;详解如何通过并行执行流式处理&#xff0c;让…

ros2-rviz2控制unity仿真的6关节机械臂,探索从仿真到实际应用的过程

文章目录 前言&#xff08;Introduction&#xff09;搭建开发环境&#xff08;Setup Development Environment&#xff09;在window中安装Unity&#xff08;Install Unity in window&#xff09;创建Docker容器&#xff0c;并安装相关软件&#xff08;Create Docker containers…

计算机组成原理笔记(十四)——3.4指令类型

一台计算机的指令系统可以有上百条指令&#xff0c;这些指令按其功能可以分成几种类型&#xff0c;下面分别介绍。 3.4.1数据传送类指令 一、核心概念与功能定位 数据传送类指令是计算机指令系统中最基础的指令类型&#xff0c;负责在 寄存器、主存、I/O设备 之间高效复制数…

各开源协议一览

在 GitHub 上&#xff0c;开源项目通常会使用一些常见的开源协议来定义项目的使用、修改和分发规则。以下是目前 GitHub 上最常见的几种开源协议及其差异和示例说明&#xff1a; TL;DR 协议宽松程度是否强制开源专利保护适用场景MIT最宽松否无希望代码被广泛使用Apache 2.0宽松…

51c自动驾驶~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/13793157 #汇聚感知、定位、规划控制的自动驾驶系统 自动驾驶技术在应用到车辆上之后可以通过提高吞吐量来缓解道路拥堵&#xff0c;通过消除人为错误来提高道路安全性&#xff0c;并减轻驾驶员的驾驶负担&#xff0c;从…

小程序开发指南

小程序开发指南 目录 1. 小程序开发概述 1.1 什么是小程序1.2 小程序的优势1.3 小程序的发展历程 2. 开发准备工作 2.1 选择开发平台2.2 开发环境搭建2.3 开发模式选择 3. 小程序开发流程 3.1 项目规划3.2 界面设计3.3 代码开发3.4 基本开发示例3.5 数据存储3.6 网络请求3.7 …

Day15:关于MySQL的编程技术——基础知识

前言&#xff1a;先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE db_programming; USE db_programming;-- 创建员工表&#xff08;包含各种数据类型&#xff09; CREATE TABLE employees (emp_id INT PRIMARY KEY AUTO…

批处理脚本bat丨遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作 (一键拉很多文件的代码)

文章目录 前言一、操作方式二、文件展示三、分析代码结构四、代码五、需要注意的潜在问题六、改进后的代码七、改进说明八、感谢 前言 由于之前git服务部署在本地服务器&#xff0c;处于代码安全角度考虑。领导让我将所有的项目代码手动物理备份一份并且发给他。 这种傻傻的操…

【C++】C与C++、C++内存空间、堆与栈

C嘎嘎嘎嘎嘎~ C与C的区别与联系 C内存空间 int global_var; // 未初始化全局变量&#xff0c;BSS段 const char* str "Hello"; // 字符串常量text段 in数据段void func() {static int static_var; // 未初始化的静态变量&#xff0c;数据段int local_var; …

舵机:机器人领域的“关节革命者”

机器人的技术&#xff0c;每一个细微的进步都可能引领一场行业变革。而在这场变革中&#xff0c;舵机作为机器人关节的核心部件&#xff0c;正悄然上演着一场革命性的应用风暴。从简单的关节运动到复杂的姿态控制&#xff0c;舵机以其卓越的性能和无限的可能&#xff0c;重新定…

微前端的不断探索之路—— qiankun 实战与思考!

全文目录&#xff1a; 开篇语&#x1f4dd; 前言&#x1f6e0;️ 微前端是什么&#xff1f;为什么需要它&#xff1f;&#x1f4a1; 先从“前端痛点”说起&#x1f9d0; 微前端的优势 &#x1f939;‍♀️ qiankun 简介与核心概念&#x1f31f; 为什么选择 qiankun&#xff1f;…

拆解加密黑盒

在Web安全与数据爬取领域&#xff0c;JavaScript加密黑盒的逆向工程是核心技术之一。本文基于行业通用方法论与实战案例&#xff0c;提炼出一套标准化的五步逆向流程&#xff0c;涵盖目标定位、代码提取、逻辑分析、算法复现到自动化集成的全链路解决方案&#xff0c;帮助开发者…

IntelliJ IDEA 中安装和使用通义灵码 AI 编程助手教程

随着人工智能技术的发展&#xff0c;AI 编程助手逐渐成为提升开发效率的强大工具。通义灵码是阿里云推出的一款 AI 编程助手&#xff0c;它能够帮助开发者实现智能代码补全、代码解释、生成单元测试等功能&#xff0c;极大地提升了编程效率和代码质量。 IntelliJ IDEA 是一款广…

Redis 特性和应用场景

1. Redis特性 1&#xff09;In-memory data structures Redis 在内存中存储数据&#xff0c;key 是 String&#xff0c; value 可以是 hash, list, set, sorted set, stream ... MySQL主要是通过 “表” 的方式来存储组织数据的 “关系型数据库” Redis主要是通过 “键值对”…

每天五分钟深度学习:非线性激活函数的导数

本文重点 本文探讨了神经网络中几种常见非线性激活函数(Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、Softmax)的导数特性。通过对各激活函数导数的数学推导与实际应用分析,揭示了不同激活函数在梯度传播、收敛速度及模型表达能力方面的差异。研究发现,ReLU及其变体在计算效率与…

redis哨兵机制 和集群有什么区别:

主从&#xff1a; 包括一个master节点 和多个slave节点&#xff1a; master节点负责数据的读写&#xff0c;slave节点负责数据的读取&#xff0c;master节点收到数据变更&#xff0c;会同步到slave节点 去实现数据的同步。通过这样一个架构可以去实现redis的一个读写分离。提升…