小编给大家分享一下。净核心3.0使用Jwt保护api的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<>强摘要:强>
本文演示如何向有效用户提供Jwt,以及如何在webapi中使用该令牌通过JwtBearerMiddleware中间件对用户进行身份认证。
<>强认证和授权区别? 强>
首先我们要弄清楚认证(身份验证)和授权(授权)的区别,以免混淆了。认证是确认的过程中你是谁,而授权围绕是你被允许做什么,即权限。显然,在确认允许用户做什么之前,你需要知道他们是谁,因此,在需要授权时,还必须以某种方式对用户进行身份验证。
<强>什么是Jwt ? 强>
根据维基百科的定义,JSON WEB标记(Jwt),是一种基于JSON的,用于在网络上声明某种主张的令牌(令牌).JWT通常由三部分组成:头信息(头),消息体(负载)和签名(签名)。
头信息指定了该Jwt使用的签名算法:
header =, & # 39; {“alg":“HS256",“typ":“JWT"} & # 39;
HS256表示使用了HMAC-SHA256来生成签名。
消息体包含了Jwt的意图:
payload =, & # 39; {“loggedInAs":“admin",“iat": 1422779638} & # 39;//iat表示令牌生成的时间
未签名的令牌由base64url编码的头信息和消息体拼接而成(使用“!”分隔),签名则通过私有关键的计算而成:
key =, & # 39; secretkey& # 39;, 时间=unsignedToken encodeBase64(头),+,& # 39;强生# 39;,+,encodeBase64(载荷), signature =, HMAC-SHA256(关键,unsignedToken)
最后在未签名的令牌尾部拼接上base64url编码的签名(同样使用“!”分隔)就是JWT了:
token =, encodeBase64(头),+,& # 39;强生# 39;,+,encodeBase64(载荷),+,& # 39;强生# 39;,+,encodeBase64(签名) #,令牌看起来像这样:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9。gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
JWT常常被用作保护服务端的资源(资源),客户端通常将JWT通过HTTP的授权头发送给服务端,服务端使用自己保存的关键计算,验证签名以判断该JWT是否可信:
授权:,Bearer eyJhbGci *……& lt; snip>…* yu5CSpyHI
<>强准备工作强>
使用vs2019创建webapi项目,并且安装nuget包
Microsoft.AspNetCore.Authentication。JwtBearer
<强>启动类强>
ConfigureServices添加认证服务
services.AddAuthentication (options =比; ,,{ ,,,options.DefaultAuthenticateScheme =, JwtBearerDefaults.AuthenticationScheme; ,,,options.DefaultChallengeScheme =, JwtBearerDefaults.AuthenticationScheme; ,,,options.DefaultScheme =, JwtBearerDefaults.AuthenticationScheme; ,,}).AddJwtBearer (options =比; ,,{ ,,,options.SaveToken =,真的; ,,,options.RequireHttpsMetadata =,假; ,,,options.TokenValidationParameters =, new TokenValidationParameters () ,,,{ ,,,,ValidateIssuer =,真的, ,,,,ValidateAudience =,真的, ,,,,ValidAudience =,“https://www.cnblogs.com/chengtian" ,,,,ValidIssuer =,“https://www.cnblogs.com/chengtian" ,,,,IssuerSigningKey =, new SymmetricSecurityKey (Encoding.UTF8.GetBytes (“SecureKeySecureKeySecureKeySecureKeySecureKeySecureKey")) ,,,}; ,,});
配置配置认证中间件
, app.UseAuthentication();//认证中间件,
<强>创建一个标记强>
添加一个登录模型命名为根据
public class 根据 ,{ public 才能string Username {组,得到,,,} public 才能string Password {组,得到,,,} 以前,}>添加一个认证控制器命名为AuthenticateController
[路线(“api/(控制器)“)) ,public class AuthenticateController :控制器 ,{ (HttpPost)才能 ,,(路线(“login")) public 才能;IActionResult 登录([FromBody] LoginInput 输入) {才能 ,,//从数据库验证用户名:密码, ,,//验证通过,否则,返回未经授权 ,,//创建索赔 ,,var authClaims =,新的[],{ ,,,new 索赔(JwtRegisteredClaimNames.Sub input.Username), ,,,new 索赔(JwtRegisteredClaimNames.Jti, Guid.NewGuid () .ToString ()) ,,}; ,,IdentityModelEventSource.ShowPII =,真的; ,,//签名秘钥,可以放到json文件中 ,,var authSigningKey =, new SymmetricSecurityKey (Encoding.UTF8.GetBytes (“SecureKeySecureKeySecureKeySecureKeySecureKeySecureKey")); ,,var token =, new JwtSecurityToken ( null null null null null null null null null null null null null null null null null null3.0 . net核心使用Jwt保护api的方法