.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 ...
随机推荐
- 03.redis 事务
课程学习地址: https://www.bilibili.com/video/BV1S54y1R7SB?p=23 中间手册地址: http://www.redis.cn/ Redis事务本质:一组命令 ...
- python教程5:函数编程
函数编程 特性: 1.减少重复代码 2.让程序变的可扩展 3.使程序变得易维护 定义: 默认参数 要求:默认参数放在其他参数右侧 指定参数(调用的时候) 正常情况下,给函数传参数要按顺序,如果不想按 ...
- Table 实现固定行和固定列
需要用到的2个属性 table-layout : fixed position : sticky table-layout table-layout属性有两种特定值: auto(预设值)-表格的总宽度 ...
- C语言(较深入原理):%s通过字符串首元素地址输出,用指针数组来作示例
首先,我们输出一个字符串都知道是用%s来输出,但是我们并没有多想是通过什么方式来输出的. 今天我在看指针数组的时候发现了一个问题,按就是定义一个字符类型的指针数组, /*字符串的输出本身就需要他的地址 ...
- IPv6 — 路由方式
目录 文章目录 目录 前文列表 IPv6 的路由 前文列表 <IPv6 - 网际协议第 6 版> <IPv6 - 地址格式与寻址模式> <IPv6 - 协议头> & ...
- 用 C 语言开发一门编程语言 — 交互式解释器
目录 文章目录 目录 前言 环境 编译型 vs 解释型 实现交互式解释器 使用 GNU Readline 函数库 前言 通过开发一门类 Lisp 的编程语言来理解编程语言的设计思想,本实践来自著名的& ...
- [NOIP2000 提高组] 单词接龙
传送锚点:https://www.luogu.com.cn/problem/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以 ...
- MyBatis延迟加载策略详解
延迟加载就是在需要用到数据的时候才进行加载,不需要用到数据的时候就不加载数据.延迟加载也称为懒加载. 优点:在使用关联对象时,才从数据库中查询关联数据,大大降低数据库不必要开销. 缺点:因为只有当需要 ...
- RabbitMQ系列(五) RabbitMQ的文件和目录位置
概述 每个RabbitMQ节点使用一些文件和目录,用于加载配置.存储数据 / 元数据 / 日志文件等等.这些文件和目录的位置是可以自定义的. 本指南涵盖: 1)如何自定义RabbitMQ节点所使用的各 ...
- GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?
GPT-4o 是 OpenAI 最新推出的大模型,有它的独特之处.那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢?今天我们就来聊聊这个问题. 目前来看,主要是下面几个差异. 响应速度 G ...