.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 ...
随机推荐
- 【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测
YOLO-World是一个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接.该平台以YOLO(You Only Look Once)算法为核心,实现了对视频中物体的 ...
- fastposter v2.8.2 发布 电商海报生成器
fastposter v2.8.2 发布 电商海报生成器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...
- grads 同时读取多个ctl文件方法
1.不同的文件进行不同的设置:'set dfile 2' 2.读取不同文件的变量:qv.2 实例如下:'reinit''open e:\tskt.CTL''open e:\uwnd.CTL''open ...
- 推荐几款卓越的 .NET 开源搜索组件
前言 在当今日益数据化的世界中,信息的检索和搜索功能对于各种应用来说变得至关重要. 无论是电子商务网站.企业资源规划系统.还是内容管理系统,高效的搜索功能都是提升用户体验.促进业务发展的关键. 因此, ...
- AIRIOT智慧变电站管理解决方案
随着社会电气化进程的加速,电力需求与日俱增,变电站作为电网的关键节点,其稳定性和智能化管理水平直接关系到整个电力系统的高效运作.传统变电站管理平台难以适应现代电力系统复杂管理需求,存在如下痛点: 数据 ...
- CSS——3D转换
- Linux系统编程(十)线程池
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h& ...
- 在kubernetes里使用AppArmor限制容器对资源的访问
目录 一.系统环境 二.前言 三.AppArmor简介 四.AppArmor和SELinux的区别 五.使用AppArmor限制nginx程序访问目录 5.1 安装nginx 5.2 修改nginx的 ...
- js 检测文本是否溢出
自定义指令的方式 手写实现 /** * 检测文本是否溢出 * 参考 https://github.com/ElemeFE/element/blob/dev/packages/table/src/tab ...
- LeetCode 685. Redundant Connection II 冗余连接 II (C++/Java)
题目: In this problem, a rooted tree is a directed graph such that, there is exactly one node (the roo ...