.Net Core WebApi 使用 JWT 验证身份
.h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px }
一、注册身份验证服务
StartUp.ConfigureServices()
//策略授权
services.AddAuthorization(options =>
{
options.AddPolicy("Admin", po => po.RequireRole("Admin"));
options.AddPolicy("Client", policy => policy.RequireRole("Client"));
options.AddPolicy("Systems", policy => policy.RequireRole("Admin", "System", "Client"));
}); //JWT 身份验证
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey)),
ValidateAudience = true,
ValidAudience = setting.Audience,
ValidateIssuer = true,
ValidIssuer = setting.Issuer,
ClockSkew = TimeSpan.Zero,
ValidateLifetime = true,
RequireExpirationTime = true
};
options.Events = new JwtBearerEvents
{
OnChallenge = context =>
{
//跳过所有默认的逻辑
context.HandleResponse();
var result = new
{
status = 401,
msg = "无效的Token",
err = "无效的Token"
};
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Response.ContentType = "application/json";
context.Response.WriteAsync(JsonConvert.SerializeObject(result));
return Task.CompletedTask;
}
};
});
二、添加认证中间件(官方定义)
StartUp.Configure()
//这里注意 一定要在 UseMvc前面,顺序不可改变
app.UseAuthentication();
app.UseMvc();
三、设置Controller访问权限
将需要身份验证才可访问的 API 增加验证 [Authorize] ,如果允许匿名访问 ,添加 [AllowAnonymous]
[Route("api/[controller]")]
//[ApiExplorerSettings(IgnoreApi = true)]//awagger忽略当前Api
//[Authorize(Roles = "Admin")] //只允许 用户 Role 是 Admin 可以访问
//[Authorize] //任何登陆的用户都可以访问
[Authorize(Policy = "Admin")] //对应 services.AddAuthorization 定义的策略名
public class EmployeeController1 : Controller
{
/// <summary>
/// 获取所有员工
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ResultData<IList<Employee>>> Get()
{
var data = await Task.Run(() => GetSourceEmployees());
var result = new ResultData<IList<Employee>>
{
Code = (int)ResultCodeEnum.SUCCESS,
Msg = "成功",
Data = data
};
return result;
}
/// <summary>
/// 根据Id 获取员工
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[AllowAnonymous] //允许匿名访问
public async Task<ResultData<Employee>> Get(int id)
{
var result = new ResultData<Employee>
{
Code = (int)ResultCodeEnum.SUCCESS,
Msg = "成功",
};
var employees = await Task.Run(() => GetSourceEmployees());
var data = employees.FirstOrDefault(l => l.Id == id);
if (data != null)
{
result.Code = (int)ResultCodeEnum.DATA_NULL;
result.Msg = "找不到所需数据";
}
else
{
result.Code = (int)ResultCodeEnum.SUCCESS;
result.Msg = "成功";
result.Data = data;
}
return result;
}
[NonAction]
private IList<Employee> GetSourceEmployees()
{
IList<Employee> employees = new List<Employee>();
employees.Add(new Employee
{
Address = "北京市朝阳公园",
Gender = 1,
Id = 1,
Mobile = "16578976589",
Name = "张三"
});
employees.Add(new Employee
{
Address = "批量添加",
Gender = 2,
Id = 2,
Mobile = "16897623407",
Name = "测试员工-001"
});
return employees;
}
}
四、创建Token
[Route("api/[controller]")]
[ApiController]
public class TokenController : ControllerBase
{
JwtSettings setting;//Token 配置信息
IMerchantRepository _merchantRepository;
//IOptions<JwtSettings> 是在 appsetting.json 的配置项
//需要提前在 StartUp.ConfigureServices注册
public TokenController(IOptions<JwtSettings> jwtSettings, IMerchantRepository merchantRepository)
{
setting = jwtSettings.Value;
_merchantRepository = merchantRepository;
}
[HttpGet]
public async Task<IActionResult> Get(string appid, string appsecret)
{
try
{
var merchants = await _merchantRepository.LoadAll();
var merchant = merchants.FirstOrDefault(l => l.AppId == appid && l.AppSecret == appsecret);
if (merchant == null)
{
return new JsonResult(new
{
status = 400,
msg = "无效的用户",
token = string.Empty
}); ;
}
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, merchant.Name));
var roles = merchant.Roles.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < roles.Length; i++)
{
//添加用户的角色
claims.Add(new Claim(ClaimTypes.Role, roles[i]));
}
//SecretKey 必须>= 16位
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//设置 token 生成元素
var token = new JwtSecurityToken(
issuer: setting.Issuer,
audience: setting.Audience,
claims: claims,
notBefore: DateTime.Now,
expires: DateTime.Now.AddSeconds(100),
signingCredentials: creds);
var result = new JwtSecurityTokenHandler().WriteToken(token);
return new JsonResult(new
{
status = 200,
msg = "成功",
token = result
});
}
catch (Exception ex)
{
return new JsonResult(new
{
status = 500,
msg = "服务器开小差了",
err = ex.Message
});
}
}
}
五、测试
1、直接访问 /api/values,出现以下提示

2、访问 /api/values/1 可正常访问

3、请求 /api/token,然后添加到 /api/values 的 Headers 再次访问


.Net Core WebApi 使用 JWT 验证身份的更多相关文章
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- .NET Framework 中对webapi进行jwt验证
最近在项目中对webapi进行了jwt验证,做一个记录 有关于jwt生成和验证token的操作全部记录在jwthelper.cs文件中: /// <summary> /// 授权JWT类 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- .Net Core官方的 JWT 授权验证
什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...
- webapi中使用token验证(JWT验证)
本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...
- .net core webapi jwt 更为清爽的认证
原文:.net core webapi jwt 更为清爽的认证 我的方式非主流,控制却可以更加灵活,喜欢的朋友,不妨花一点时间学习一下 jwt认证分为两部分,第一部分是加密解密,第二部分是灵活的应用于 ...
- .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
.net core webapi jwt 更为清爽的认证 后续:续期以及设置Token过期 续期: 续期的操作是在中间件中进行的,续期本身包括了前一个Token的过期加发放新的Token,所以在说续 ...
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- 如何在启用JWT Token授权的.NET Core WebApi项目中下载文件
背景 前几天,做项目的时候遇到一个文件下载的问题.当前系统是一个前后端分离的项目,前端是一个AngularJs项目, 后端是一个.NET Core WebApi项目.后端的Api项目使用了Jwt To ...
- 使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证
使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证 目前WEB 前后端分离的开发模式比较流行,之前做过的几个小项目也都是前后分离的模式,后端使用asp.net weba ...
随机推荐
- MinDoc 编译安装(linux环境)
目录 MinDoc 简介 项目地址: 下面以 Linux 系统为例: Gomod方式安装 下载项目代码到本地 写入依赖 下载依赖 创建数据库 配置数据库 编译main.go 提升文件权限 初使化数据库 ...
- 【项目学习】Timeswap:第一个完全去中心化的基于 AMM 的货币市场协议
总览 Timeswap 是世界上第一个完全去中心化的基于 AMM 的货币市场协议,无需预言机或清算人即可工作. Timeswap 采用 3 变量来维持 AMM 的运作.它通过允许用户决定他们的风险状况 ...
- pageoffice 6 实现数据区域填充(插入文本、图片、word、excel等)
在实际的Word文档开发中,经常需要自动填充数据到Word模板中,以生成动态的Word文档. 例如: 1.我们可以根据数据库表中已保存的个人信息,设计好一个简历模板docx文件,然后通过代码将这些个人 ...
- PhiData 一款开发AI搜索、agents智能体和工作流应用的AI框架
引言 在人工智能领域,构建一个能够理解并响应用户需求的智能助手是一项挑战性的任务.PhiData作为一个开源框架,为开发者提供了构建具有长期记忆.丰富知识和强大工具的AI助手的可能性.本文将介绍Phi ...
- CCL 2024 Task7 双任务冠军
近期参加NLP领域CCL2024评测,现将赛题背景和实现方法分享,推理文本纠错领域的发展. 1.背景信息 随着教育的发展和网络的普及,作文评价的规模越来越大,人工评改作文的成本和效率成为一大难题.为了 ...
- 表单设计——《HTML5 CSS3从入门到精通》
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# winfrom 局域网版多人成语接龙(二)
功能基本上是完成了,要两个人完才好玩,目前 倒计时,每组游戏玩家数量这些控制变量,都是写死再代码里的,等以后想改的时候再改,这个项目核心的功能算是实现了,但还可以扩展,比如记录一下用户的游戏数据,答对 ...
- 什么是Token?为什么大模型要计算Token数
本文分享自华为云社区<[技术分享]什么是Token?为什么GPT基于Token定价>,作者:开天aPaaS小助手Tracy. 在使用LLM大模型时,我们经常会遇到一个关键词,叫:Token ...
- nginx002: NGINX的环境变量,基本命令参数,目录关系及gzip优化
NGINX的环境变量,基本命令参数,目录关系及gzip优化 添加环境变量 nginx命令执行方式 nginx [选项] [参数] 通过编译安装的nginx 默认是没有环境变量的,如何设置环境变量,让n ...
- fabric compose文件解读(peer篇)
peer是fabric中的基础单元,主要负责背书,验证交易合法性,保存区块链数据,查询数据.peer与orderer配合完成区块链的全部功能,orderer可以比作是管理员,peer属于是干货的员工, ...