这篇文章将为大家详细讲解有关JWT认证授权怎么在ASP。净核心项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>名词解析强>
认证:识别用户是否合法
授权:赋予用户权限(能访问哪些资源)
鉴权:鉴定权限是否合法
<强> Jwt优势与劣势强>
优势
1,无状态
牌存储身份验证所有信息,服务端不需要保存用户身份验证信息,减少服务端压力,服务端更容易水平扩展,由于无状态,又会导致它最大缺点,很难注销
2支持跨域访问
饼干是不允许垮域访问的,象征性的支持
3、跨语言
基于标准化的JSON Web标记(Jwt),不依赖特定某一个语言,例如生成的令牌可以对多种语言使用(净、Java、PHP…)
劣势
1,象征性的有效性问题
后台很难注销已经发布的令牌,通常需要借助第三方储存(数据库/缓存)实现注销,这样就会失去Jwt最大的优势
2,占带宽
牌长度(取决存放内容)比session_id大,每次请求多消耗带宽,令牌只存必要信息,避免标记过长
3,需要实现续签
饼干——会话通常是框架已经实现续签功能,每次访问把过期时间更新,Jwt需要自己实现,参考OAuth3刷新令牌机制实现刷新令牌
4,消耗更多CPU
每次请求需要对内容解密和验证签名这两步操作,典型用时间换空间
只能根据自身使用场景决定使用哪一种身份验证方案,没有一种方案是通用的,完美的
<强>。净核心集成JWT认证授权服务强>
1,认证服务API:认证用户,并发布标记
1,引入nuget包,System.IdentityModel.Tokens.Jwt
2,创建生成令牌的服务,建议使用面向接口和实现编程,方便服务注入容器ServicesCollection(涉及DI和奥委会概念)
3,创建接口
namespace JWTS.Services { public 才能;interface  IJWTService {才能 ,,,///,& lt; summary> ,,,///,根据验证通过后的用户以及角色生成令牌,以达到角色控制的作用 ,,,///,& lt;/summary> ,,,///,& lt; param name=皍serName"祝辞& lt;/param> ,,,///,& lt; param name=皉ole"祝辞& lt;/param> ,,,///,& lt; returns> & lt;/returns> ,,,string GetToken (string 用户名,string 作用); ,,} }
4,在appsettings。配置中添加生成牌需要的信息,并映射成对象
“TokenParameter":, { “Issuer"才能:,“William",,//这个JWT的签发主体(发行者) “Audience"才能:,“William",,//这个JWT的接收对象 “SecurityKey"才能:,“askalsnlkndhasnaslkasmadka" ,} ,public class  TokenParameter ,,{ ,,,,public string  Issuer {组,得到,,,} ,,,,public string  Audience {组,得到,,,} ,,,,public string  SecurityKey {组,得到,,,} ,,}
5,实现接口,注入配置,获取TokenParameter对象
using Microsoft.Extensions.Configuration; using 系统; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using 包含; using Microsoft.IdentityModel.Tokens; namespace JWTS.Services { public 才能class JWTService : IJWTService {才能 ,,,private readonly TokenParameter _tokenParameter; public JWTService (IConfiguration 配置) ,,,,{ ,,,,,时间=_tokenParameter configuration.GetSection (“TokenParameter") .Get(); ,,,,}///,& lt; summary> ,,,///,JWT由三部分组成(头,有效载荷、签名) ,,,///{头}。{载荷}{签名}。 ,,,///,& lt;/summary> ,,,///,& lt; param name=皍serName"祝辞& lt;/param> ,,,///,& lt; param name=皉ole"祝辞& lt;/param> ,,,///,& lt; returns> & lt;/returns> ,,,public string GetToken (string 用户名,string 角色) ,,,{ ,,,,,声称[],claims =,新的[] ,,,,,{ ,,,,,,,new 索赔(ClaimTypes.Name,,用户名), ,,,,,,,new 索赔(“NickName",“Richard"), ,,,,,,,new 索赔(“Role"、角色)//传递其他信息 ,,,,,}; ,,,,,SymmetricSecurityKey key =, new SymmetricSecurityKey (Encoding.UTF8.GetBytes (_tokenParameter.SecurityKey)); ,,,,,SigningCredentials creds =, new SigningCredentials(钥匙,,SecurityAlgorithms.HmacSha256); ,,,,,/* * ,,,,,,*,Claims (载荷) ,,,,,,,Claims 部分包含了一些跟这个,token 有关的重要信息只JWT 标准规定了一些字段、下面节选一些字段: ,,,,,,,JWT会被加密,但是这部分内容任何人都可以读取,所以不要存放机密信息 ,,,,,,,国际空间站:,,issuer of 从而令牌,token 是给谁的 null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null JWT认证授权怎么在ASP。网络核心项目中使用