【ASP.NET Core学习】使用JWT认证授权
概述
认证授权是很多系统的基本功能 , 在以前PC的时代 , 通常是基于cookies-session这样的方式实现认证授权 , 在那个时候通常系统的用户量都不会很大, 所以这种方式也一直很好运行, 随着现在都软件用户量越来越大, 系统架构也从以前垂直扩展(增加服务器性能) -> 水平扩展(增加服务器数量)
cookies-session 工作方式
客户端提交用户信息 -> 服务器识别用户 -> 服务端保存用户信息 -> 返回session-id客户端 -> 客户端保存session-id -> 每次请求cookies带上session-id
这种方式也不是不能水平扩展 , 例如 , session复制/第三方保存session(数据库 , Redis)
名词解析
认证 : 识别用户是否合法
授权: 赋予用户权限 (能访问哪些资源)
鉴权: 鉴定权限是否合法
Jwt优势与劣势
优势
- 无状态
token 存储身份验证所有信息 , 服务端不需要保存用户身份验证信息, 减少服务端压力 , 服务端更容易水平扩展, 由于无状态, 又会导致它最大缺点 , 很难注销
- 支持跨域访问
Cookie是不允许垮域访问的,token支持
- 跨语言
基于标准化的 JSON Web Token (JWT) , 不依赖特定某一个语言 , 例如生成对Token可以对多个语言使用(Net , Java , PHP ...)
劣势
- Token有效性问题
后台很难注销已经发布的Token , 通常需要借助第三方储存(数据库/缓存) 实现注销, 这样就会失去JWT最大的优势
- 占带宽
Token长度(取决存放内容) 比session_id大 , 每次请求多消耗带宽 , token只存必要信息 , 避免token过长
- 需要实现续签
cookies - session 通常是框架已经实现续签功能, 每次访问把过期时间更新, JWT需要自己实现, 参考OAuth2刷新Token机制实现刷新Token
- 消耗更多CPU
每次请求需要对内容解密和验证签名这两步操作,典型用时间换空间
只能根据自身使用场景决定使用哪一种身份验证方案 , 没有一种方案是通用的,完美的
AspNetCore集成Jwt认证
- 添加包
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
- 添加配置
"JwtOptions": {
"Issuer": "https://localhost:5001",
"Audience": "https://localhost:5001",
"SecurityKey": "1G3l0yYGbOINId3A*ioEi4iyxR7$SPzm"
}
Jwt Bearer 扩展(选项)
ConfigureServices
services.AddJwtBearer(options =>
{
options.Issuer = Configuration.GetValue<string>("JwtOptions:Issuer");
options.Audience = Configuration.GetValue<string>("JwtOptions:Audience");
options.SecurityKey = Configuration.GetValue<string>("JwtOptions:SecurityKey");
});
- Configure
app.UseAuthentication();
app.UseAuthorization();
- add AuthorizeController
//define claim
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Email, $"{username}@github.com"),
new Claim(ClaimTypes.Role, username == "WilsonPan" ? "Admin" : "Reader"),
new Claim(ClaimTypes.Hash, JwtHashHelper.GetHashString($"{username}:{password}:{System.DateTime.Now.Ticks}")),
};
//define JwtSecurityToken
var token = new JwtSecurityToken(
issuer: _jwtOptions.Issuer,
audience: _jwtOptions.Audience,
claims: claims,
expires: System.DateTime.Now.AddMinutes(5),
signingCredentials: _jwtOptions.SigningCredentials
);
// generate token
var result = new JwtSecurityTokenHandler().WriteToken(token);
- Contrller/Action 添加认证授权
[ApiController]
[Authorize]
[Route("[controller]")]
public class ApiController : ControllerBase
{
...
}
[HttpPost]
[Authorize(Roles = "Admin")]
public IActionResult Post()
{
return Ok();
}
转发请标明出处:https://www.cnblogs.com/WilsonPan/p/13495936.html
示例代码
【ASP.NET Core学习】使用JWT认证授权的更多相关文章
- 如何简单的在 ASP.NET Core 中集成 JWT 认证?
前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- asp.net core 2.0的认证和授权
在asp.net core中,微软提供了基于认证(Authentication)和授权(Authorization)的方式,来实现权限管理的,本篇博文,介绍基于固定角色的权限管理和自定义角色权限管理, ...
- 【转载】asp.net core 2.0的认证和授权
在asp.net core中,微软提供了基于认证(Authentication)和授权(Authorization)的方式,来实现权限管理的,本篇博文,介绍基于固定角色的权限管理和自定义角色权限管理, ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- Dotnet core使用JWT认证授权最佳实践(二)
最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 第一部分:Dotnet core使用JWT认证授权最佳实践(一) ...
- ASP.NET Core集成现有系统认证
我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块.那么解决用户认证的问题,成为我们的第一个拦路 ...
- 【ASP.NET Core】运行原理(4):授权
本系列将分析ASP.NET Core运行原理 [ASP.NET Core]运行原理(1):创建WebHost [ASP.NET Core]运行原理(2):启动WebHost [ASP.NET Core ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
随机推荐
- Git别名和配置文件
目录 备注: 配置别名 配置文件 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文. 配置别名 如果,如果这么神器的Git版本控制系统,可以简 ...
- web自动化 -- HTMLreport(一)测试报告自定义测试用例名,重写ddt
一.需求痛点 1.HTMLreport测试报告的用例名不明确 2.希望可以自定义HTMLreport测试报告的用例名 3.痛点截图 二.解决办法 1.原因分析 HTMLreport测试报告中的用例名是 ...
- 扫描PDF417崩溃的原因找到:手机摄像头分辨率低
换孩子姥姥华为手机解决了. 能扫pdf417码了
- Java复习总结(二)Java SE 面试题
Java SE基础知识 目录 Java SE 1. 请你谈谈Java中是如何支持正则表达式操作的? 2. 请你简单描述一下正则表达式及其用途. 3. 请你比较一下Java和JavaSciprt? 4. ...
- SpringBoot-JPA删除不成功,只执行了查询语句
今天使用JPA自定义了一个删除方法deleteByUserIdAndCommentId发现并没有删除掉对应的数据,只执行了查询语句 Hibernate: select good0_.id as id1 ...
- 让内层浮动的Div将外层Div撑开 -----清浮动
清浮动的好处写多了都能体会到,解决高度塌陷, 一般情况下是要清除浮动的,不然会影响下面标签的排版. <div class="parent" style="width ...
- 两数相加(B站看视频总结)
''' 两数相加: 给出两个 非空 的链表用来表示两个非负的整数 各自的位数是按照逆序的方式存储的 每一个节点只能保存 一位数 示例: 输入:(2->4->3) + (5->6-&g ...
- 定义 WSGI 接口
# WSGI服务器调用 def application(environ,start_response): start_response('200 OK',[('Content-Type','text/ ...
- 把项目从码云上clone到IntelliJ IDEA
前期工作:安装并已配置好git,并且IDEA已经配置好git了 操作如下: 1) 在IDEA启动页面选择Get from Version Control 2) 打开码云上想要clon ...
- IEnumerable<T>转DataTable,为空怎么办?
public static class DataConvertor { public static DataTable ToDataTable<T>(IEnumerable<T> ...