3.0 . net核心使用Jwt保护api的方法

  介绍

小编给大家分享一下。净核心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

。网络核心3.0使用Jwt保护api的方法

<强>启动类

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   null

3.0 . net核心使用Jwt保护api的方法