.NET 6.0 Web API项目中实现基于Token的身份验证

        本文以一个完整的示例,展示如何在.NET 6.0 Web API项目中实现基于Token的身份验证。这个例子包括了如何创建和验证JWT Token,以及如何在控制器中使用这些Token。

步骤 1: 创建Web API项目

首先,用Visual Studio 2022创建一个基于.NET6.0的 Web API项目。

步骤 2: 安装必要的NuGet包

安装Microsoft.AspNetCore.Authentication.JwtBearer包。

步骤 3: 配置身份验证服务

Program.cs中配置身份验证服务:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;var builder = WebApplication.CreateBuilder(args);// 添加身份验证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = builder.Configuration["Jwt:Issuer"],ValidAudience = builder.Configuration["Jwt:Audience"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))};});// 添加授权服务
builder.Services.AddAuthorization();var app = builder.Build();// 使用身份验证和授权中间件
app.UseAuthentication();
app.UseAuthorization();// 其他配置和路由设置app.MapControllers();
app.Run();

步骤 4: 配置JWT设置

appsettings.json中配置JWT的相关设置:

{"Jwt": {"Issuer": "YourIssuer","Audience": "YourAudience","Key": "YourVerySecretKey"}
}

步骤 5: 创建Token生成控制器

创建一个控制器来生成Token:

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{private readonly IConfiguration _configuration;public AuthController(IConfiguration configuration){_configuration = configuration;}[HttpPost("login")]public IActionResult Login([FromBody] LoginModel model){// 假设这里有一个验证逻辑,验证用户名和密码if (model.Username == "test" && model.Password == "password"){var tokenDescriptor = new SecurityTokenDescriptor{Subject = new ClaimsIdentity(new Claim[]{new Claim(ClaimTypes.Name, model.Username)}),Expires = DateTime.UtcNow.AddMinutes(5),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256Signature),Issuer = _configuration["Jwt:Issuer"],Audience = _configuration["Jwt:Audience"]};var tokenHandler = new JwtSecurityTokenHandler();var token = tokenHandler.CreateToken(tokenDescriptor);return Ok(new { token = tokenHandler.WriteToken(token) });}else{return Unauthorized();}}
}public class LoginModel
{public string Username { get; set; }public string Password { get; set; }
}

步骤 6: 创建受保护的控制器

创建一个控制器,只有持有有效Token的用户才能访问:

[ApiController]
[Route("[controller]")]
public class SecretController : ControllerBase
{[Authorize][HttpGet]public IActionResult Get(){return Ok("This is a secret message.");}
}

步骤 7: 调用API

要调用API,首先需要获取Token。可以使用Postman或类似的工具发送一个POST请求到/Auth/login,并提供用户名和密码。然后,使用返回的Token在Authorization头部中发送一个GET请求到/Secret

POST /Auth/login HTTP/1.1
Host: localhost:5000
Content-Type: application/json{"Username": "test","Password": "password"
}
GET /Secret HTTP/1.1
Host: localhost:5000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGVzdCIsImV4cCI6MTYxODI3MzYwNSwiaXNzIjoiWW91ciJJc3N1ZXIiLCJhdWQiOiJZb3VyQXV0aGVudGljYXRpb24ifQ.6_3QXxZ3VzZvjZ7RnV5NQz-7y_93fY0Y7Y6jV7-XzQ

确保在实际应用中实现安全的用户验证逻辑,并且不要在代码中硬编码敏感信息。此外,根据你的具体需求,可能还需要实现用户注册、Token刷新等功能

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

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

相关文章

PointCloudLib-滤波模块(Filtering)-使用体素网格过滤器对点云进行降采样

在本教程中,我们将学习如何缩减采样——即减少数量 点 – 使用体素化格网方法的点云数据集。 我们将要介绍的类在输入上创建一个 3D 体素网格(将体素网格视为空间中的一组微小 3D 框) 点云数据。然后,在每个体素(即 3D 框)中,所有点都存在 将用它们的质心近似(即下采样…

java spring boot 单/多文件上传/下载

文章目录 使用版本文件上传服务端客户端(前端)方式一方式二 文件下载服务端客户端(前端) 代码仓库地址 使用版本 后端 spring-boot 3.3.0jdk17 前端 vue “^3.3.11”vite “^5.0.8”axios “^1.7.2” 文件上传 上传文件比较…

从零到一学FFmpeg:av_packet_rescale_ts 函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用实例 前言 av_packet_rescale_ts是FFmpeg库中的一个函数,用于重新缩放或转换媒体流中的时间戳(timestamp),以适配不同的时间基(timebase)。 在处理多媒体数…

Spark离线开发指南(详细版)

文章目录 1--Spark—core**2.1--RDD的创建**2.1.1--并行化创建2.1.2--获取分区数2.1.3--读取文件创建RDDtextFilewholeTextFile 2.2--RDD算子2.2.1--算子概念2.2.2--Transformation算子mapflatMapreduceByKeymapValuesgroupByfilterdistinctunionjoinintersectionglomgroupByKe…

【遇到的问题】集群上查看gpu的使用情况

流程: 查看bme_cpu所有节点的详细情况scontrol show node bme_gpu[12-23] 下面这个看起来分配出去较少 查看bme_cpu空闲节点sinfo -p bme_gpu -o "%n %G %C %m %e NVIDIAA10080GBPCIe 卡 gpu 13看起来最少 在命令中选择这个节点 #!/bin/bash #SBATCH -J rati…

别再盲目生产了!精益KPI管理让你事半功倍!

在竞争日益激烈的制造业领域,如何提升生产效率、降低成本、确保产品质量,是每个企业都需要面对的重要课题。而研华科技作为工业自动化领域的领军企业,凭借其独特的精益生产KPI分析与管理平台,为企业提供了一套行之有效的解决方案。…

OpenAI突然宣布停止向中国提供API服务!

标题 🌟 OpenAI突然宣布停止向中国提供API服务! 🌟摘要 📜引言 📢正文 📝1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 📂常见问题解答(QA)❓…

Java-HashMap和ConcurrentHashMap的区别

Java-HashMap和ConcurrentHashMap的区别 一、关键区别1.数据结构2.线程安全3.性能4.扩容机制 二、源码简析1.并发控制机制2.数据结构转换:链表转红黑树3.扩容机制触发hashMap和concurentHashMap扩容机制的条件 三、putIfAbsent方法computeIfAbsent方法区别 ​ 在 J…

Linux(简单概述)

目录 第一章 初识Linux 第四章 文件管理与常用命令 1.文件基础知识 2.文件显示命令 3.文件内容查询 4. 文件和目录基本操作 5. 文件复制、移动、删除 7. 链接 8. 文件访问权限 9. 文件查找命令 10. 压缩和解压缩 第五章用户与用户组 第六章软件包管理RPM和YUM数据库…

CesiumJS【Basic】- #011天气特效

文章目录 天气特效1 目标2 实现2.1 Weather.ts2.2 main.ts天气特效 1 目标 用着色器实现 - 白天 - 多云 - 雾 - 雨 - 雪 2 实现 在Cesium version 1.118.1中,默认是gles 3.0的语法,以前的gl_FragColor、varying和texture2D无法继续使用 2.1 Weather.ts import * as Ces…

面试-synchronized(java5以前唯一)和ReentrantLock的区别

1.ReentrantLock(再入锁): (1).在java.util.concurrent.locks包 (2).和CountDownLatch,FutureTask,Semaphore一样基于AQS实现。 AQS:AbstractQueuedSynchronizer 队列同步器。Java并发用来构建锁或其他同步主键的基础框架,是j.u.c…

【金】04Y? 人脸识别系统 | 前端PyQT

参考-教程bilibil视频:树莓派进阶玩法 | 人脸识别项目教程 界面参考:基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)_python管理系统深度学习-CSDN博客 1、 树莓派小项目:人脸识别&#xff…

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解 Jackson 是一个功能强大的 JSON 处理库,广泛应用于 Java 项目中。它提供了丰富的功能和灵活的配置选项,可以轻松地在 Java 对象和 JSON 数据之间进行转换。本文将详细介绍 Jackson 的核心概念、基本用法、高级配置及…

常用的 js 代码片段

常用的 js 代码片段 1. 不使用临时变量交换两个变量2. 浅克隆对象3. 合并对象3. 过滤数组中的假值5. NodeList 转换为数组6. 数组去重7. 两数组的交集8. 两数组的差集9. 两数组的并集10. 数组求和11. 对象数组指定属性求和12. 对象的计算属性13. 检查联网状态14. URL 的查询参数…

如何使用命令提示符查询电脑相关序列号等信息的操作方法

如何使用命令提示符查询硬盘的序列号? 如果出于保修或其他目的,你想知道硬盘驱动器的序列号,你不想使用第三方应用程序,或者如果你更喜欢命令行方法,则可以使用带有命令提示符的命令来显示硬盘驱动器的序列号。 1. 按…

渗透测试之内核安全系列课程:Rootkit技术初探(六)

今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…

用python写出银行管理系统

1 问题 怎么利用已学的python知识简单写出一个银行管理系统,且编写出开户、查询、取款、存款、转账和管理员登录等功能。 2 方法 使用def定义函数、while循环函数、if函数和import函数并带上一些简单的逻辑思维便可以轻松解决这个看似困难实则简单的程序。 # 1.开…

BAT 利用BAT替换SQL文件中的参数成为可执行SQL文件

1. BAT文件 将下面的代码保存成“01_ExeSqlCre.bat”文件。 echo off SETLOCAL ENABLEDELAYEDEXPANSIONIF EXIST %~dp0\10_Program_Exec.sql (DEL /Q %~dp0\10_Program_Exec.sql )CHCP 65001 FOR /F "EOL. TOKENS* DELIMS" %%a IN (dir /a /b *.sql) DO (FOR /F &q…

ACIS中如何求点在FACE参数域内的坐标

1. 点在 FACE 上 如果点在FACE上,可以采用surface的直接接口:surface::param、surface::test_point和surface::test_point_tol。 virtual SPApar_pos surface::param ( const SPAposition & pos, const SPApar_pos & param_guess SpaAcis::…

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程,名叫网络安全与防火墙,学时40,编号为“0118”,主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表,其结构与student表大致一样.…