ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获

  1. 了解认证和授权的作用
  2. 了解在ASP.NET Core中实现身份认证的技术都有哪些
  3. 学习基于JWT认证并学会颁发和验证JWT令牌

一、重要的前置概念

在一个系统中,不是所有的功能和资源都能够被自由地访问,比如你存在银行系统里面的资金,不可能给我去提取,对吧。这就需要系统对用户进行一些访问的控制,从而使系统更加地安全。
Authentication(认证)和Authorization(授权)都是用于访问控制的概念,目的是确保只有合法用户可以访问系统资源。

  • Authentication(认证)是指验证用户身份的过程。通过认证,系统能够确认用户是真实的,准确地知道用户是谁。常见的认证方式包括用户名和密码、指纹识别、身份证验证等。认证成功后,用户才能被认为是合法用户,可以继续访问系统资源。

  • Authorization(授权)是指确定用户是否有权限访问特定资源的过程。认证成功后,系统需要根据用户的角色、权限等信息来判断用户是否有权访问某个资源。授权机制可以基于用户角色或权限级别进行,例如管理员拥有更高的权限,能够访问更多的资源,而普通用户只能访问受限资源。授权也可以是细粒度的,例如给用户赋予特定的操作权限,如读取、写入、删除等。

在ASP.NET Core中,可以使用以下技术实现身份认证(包括但不限于):

  1. Cookie身份认证:使用ASP.NET Core的认证中间件,将用户的认证信息存储在cookie中。可以使用AddAuthenticationAddCookie方法配置Cookie身份认证。

  2. JWT(JSON Web Token)身份认证:使用JWT作为认证令牌,将用户的认证信息加密并传输给客户端。可以使用AddJwtBearer方法配置JWT身份认证。

  3. OAuth身份认证:使用OAuth协议进行身份认证,允许用户使用第三方身份提供者进行登录。可以使用AddAuthenticationAddOAuth方法配置OAuth身份认证。

  4. OpenID Connect身份认证:基于OAuth协议的扩展,提供了更加丰富的身份认证功能。可以使用AddAuthenticationAddOpenIdConnect方法配置OpenID Connect身份认证。

  5. Session认证:ASP.NET Core中可以使用AddSession方法来配置会话认证。在使用会话认证时,服务器会为每个用户创建一个会话对象,并分配一个唯一的会话ID。服务器会将该会话ID存储在用户的浏览器cookie中,并在后续的请求中使用该会话ID来验证用户的身份。

以上技术可以根据具体的需求和场景进行选择和配置,也可以组合使用来实现更加复杂的身份认证方案。

二、JWT是什么?

JWT:JSON Web Token (JSON网络令牌)里面存的是JSON格式的数据,有三部分组成,以.号做分割, 头部.荷载.防伪签名, 经过一定的加密算法来生成。

作用:颁发给登录的用户,用户拿着这个令牌作为身份的凭证,来访问后续的授权资源。

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

2.1 JWT的组成结构

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header – 头部
  • Payload -荷载
  • Signature -签名

例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJMb2dpbk5hbWUiOiJhZG1pbiIsIlN1cGVyQWRtaW4iOiJ0cnVlIiwibmJmIjoxNjM5NTQ4MDYyLCJleHAiOjE2Mzk1NDgyNDIsImlzcyI6IldYRiIsImF1ZCI6IkV2ZXJ5VGVzdE9uZSJ9.rfMYR5h26sv3j-WrjVgqB0K05fr9M4wFgCx4leZnqg8

可以到jwt.io官网上将以上JWT字符串进行调试,解析出原始的JSON数据。
在这里插入图片描述

2.2 JWT加密组装的过程

JWT令牌=Base64编码的header.Base64编码的payload.Base64编码的signature;
而signature又是通过HS256这种算法将Base64编码的header.Base64编码的payload的字符串进行加密所得。请看下面的演示代码:

//头部
header = {
   
   "alg": "HS256", "typ": "JWT"}
//荷载
payload = {
   
   "sub": "1234567890", "name": "John Doe", "iat": 1516239022}
//生成签名
key = "secretkey123qwe!@#" //密钥可以自己设置
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)  
signature = HMAC-SH
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

采石之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值