.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 ...
随机推荐
- RocketMQ 事件驱动:云时代的事件驱动有啥不同?
前言: 从初代开源消息队列崛起,到 PC 互联网.移动互联网爆发式发展,再到如今 IoT.云计算.云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头. 目前,消息中间件在国内许多行业 ...
- 好玩的vue组件
https://gitee.com/zheng_yongtao/jyeontu-component-warehouse 推荐这个大佬,很厉害悬浮按钮 评论组件 词云 瀑布流照片容器 视频动态封面 3D ...
- 基于FPGA的电子琴设计(按键和蜂鸣器)----第一版
欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版. 功能说明: 外部输入七个按键,分别对应音符的"1.2. ...
- Python:用Pandas输出格式化HTML并高亮
输出格式化的HTML 我们已知一个DataFrame记录了模型Model1.Model2在3个Epoch优化中的精度变化情况: frame = pd.DataFrame({"Model1&q ...
- 使用jsbarcode生成条形码
安装 yarn add jsbarcode 使用 // HTMLElement 承载条形码的元素 svg/canvas // text 显示在条形码下方的文字 // option 条形码的配置项 具体 ...
- RoslynPad的简单使用
虽说Visual Studio被我们戏称宇宙最强IDE,但是平常随手写段C#代码进行验证或者语法校验,属于牛刀小试了,显然轻量级C#编辑器更适合这种场景,目前较为流行的则是一代神器 LINQPad,但 ...
- minio-搭建个人云存储服务
相信风靡全球的亚马逊 AWS S3 的存储云服务大家已经耳熟能详了,如何自己搭建一个私有的S3存储云服务呢?Minio 提供对象存储服务,兼容了 AWS S3 存储协议,用于非结构化的数据存.非结构化 ...
- Deepin15.11+WIN10 双系统安装过程与遇到的问题(一)
一.deepin安装流程 1.下载 下载深度系统最新版本官网https://www.deepin.org/zh/download/下载深度系统专用U盘启动盘制作工具https://www.deepin ...
- 创建 Vue3 项目
前提条件 安装 Nodejs 下载:https://nodejs.org/en/download/prebuilt-installer 切换 npm 源 npm config set registry ...
- C语言打印数字前补0
1.要求说明 例如有个数据为a = 0x10,要求打印输出为0x000010. 2.实现 1 #include <stdio.h> 2 3 4 int main() 5 { 6 int a ...