1. JWT概述

  JSON Web Token(JWT)是目前流行的跨域身份验证解决方案。

  JWT的官网地址:https://jwt.io

  JWT的实现方式是将用户信息存储在客户端,服务端不进行保存。每次请求都把令牌带上以校验用户登录状态,这样服务就变成无状态的,利于服务器集群扩展。

1.1 JWT令牌结构

  在紧凑的形式中,JSON Web Tokens由dot(.)分隔的三个部分组成:

  ◊ Header 头

  ◊ Payload 载荷

  ◊ Signature 签名

  因此,JWT通常如右所示:xxxxx.yyyyy.zzzzz

  (1)Header

  标头通常由两部分组成:令牌的类型,即JWT,以及正在使用的签名算法,如:HMAC SHA256或RSA。

{
"alg": "HS256",
"typ": "JWT"
}

  然后,这个JSON被编码为Base64Url,形成JWT的第一部分。

  (2)Payload

  Payload用来存放需要传递的数据,包括用户信息及认证信息等。

  JWT 规定了7个官方字段,供选用。

  ◊ iss (issuer):签发人

  ◊ exp (expiration time):过期时间

  ◊ sub (subject):主题

  ◊ aud (audience):受众

  ◊ nbf (Not Before):生效时间

  ◊ iat (Issued At):签发时间

  ◊ jti (JWT ID):编号

  除了官方字段,可以在这个部分自定义其它字段。

  然后,这个JSON被编码为Base64Url,形成JWT的第二部分。

  注意:JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

  (3)Signature

  Signature 部分是对前两部分的签名,防止数据篡改。这部分存在的意义就是为了解决前面部分的不安全性。

  首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
SECREATE_KEY
)

  签名用于验证消息在此过程中未被更改,并且,在使用私钥签名的令牌的情况下,它还可以验证JWT的发件人是否是它所声称的人。

2. ASP.NET Core中集成JWT身份认证

  新建ASP.NET Core API应用程序,添加安装包:

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Install-Package System.IdentityModel.Tokens.Jwt

  appsettings.json

{
"Jwt": {
"Issuer": "Issuer",
"Audience": "Audience",
"SigningKey": "EF1DA5B7-C4FA-4240-B997-7D1701BF9BE2"
}
}

  JwtConfig.cs

public class JwtConfig
{
public string Issuer { get; set; } public string Audience { get; set; } public string SigningKey { get; set; }
}

  Startup.cs

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens; public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
var jwtconfig = Configuration.GetSection("Jwt").Get<JwtConfig>();
// JWT身份认证
services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(option =>
{
option.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jwtconfig.Issuer,
ValidAudience = jwtconfig.Audience,
ValidateIssuer = true,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtconfig.SigningKey)),
// 缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟
ClockSkew = TimeSpan.FromSeconds()
};
}); services.AddOptions().Configure<JwtConfig>(Configuration.GetSection("Jwt")); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// JWT身份认证
app.UseAuthentication(); app.UseMvc();
}
}

  AuthController.cs

using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options; [Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
private JwtConfig jwtconfig;
public AuthController(IOptions<JwtConfig> option)
{
jwtconfig = option.Value;
} [HttpGet]
public ActionResult<string> Get()
{
var claim = new Claim[]{
new Claim("UserName", "lb")
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtconfig.SigningKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: jwtconfig.Issuer,
audience: jwtconfig.Audience,
claims: claim,
notBefore: DateTime.Now,
expires: DateTime.Now.AddSeconds(),
signingCredentials: creds); return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
} /// <summary>
/// 在需要身份认证的方法添加[Authorize]
/// </summary>
[Authorize]
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "value";
}
}

  在访问需要JWT身份认证的接口时,接口添加header参数Authorization,值为“Bearer”+空格+token。若不能通过JWT身份认证,则调用接口返回状态401未认证。

ASP.NET Core系列:JWT身份认证的更多相关文章

  1. ASP.NET Core 基于JWT的认证(一)

    ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...

  2. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  3. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  4. ASP.NET Core 中jwt授权认证的流程原理

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  5. asp.net core 系列之用户认证(authentication)

    ASP.NET Core 的 identity 是一种需要用户登录的会员系统,用户可以创建一个登录信息存储在 Identity 的的账号, 或者也可以使用第三方登录,支持的第三方登录包括:Facebo ...

  6. asp.net core 系列之用户认证(1)-给项目添加 Identity

    对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成. 虽然基架已 ...

  7. 【转】ASP.NET Core WebAPI JWT Bearer 认证失败返回自定义数据 Json

    应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer 进行接口权限认证的时候,返回的结果不是我们客户端想要的,其它我们想要给客户端返回统一的数据结构, ...

  8. asp.net core 3.0 身份认证 替换为自已的提供程序 AuthenticationStateProvider replace to SelfAuthenticationStateProvider

    public void ConfigureServices(IServiceCollection services) { // 添加身份验证服务 services.AddAuthorizationCo ...

  9. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

随机推荐

  1. 面试题-JavaScript交换两个变量的方法

    在平时的业务开发或者面试过程中,经常会遇到交换两个变量这种问题,于是,个人总结以下几种交换变量的方法: 1.方案一 使用一个临时变量来交换  2.方案二 使用ES6解构赋值语法来交换 3.方案三利用数 ...

  2. Macbook触控板使用技巧

    1. 在Storyboard鼠标右键可以直接拖线的,如果你用的是外接的第三方鼠标,没必要按着 control 键再用鼠标左键拖线 如果是触控板的话,双指按下去就可以直接拖线,带3Dtouch功能的触控 ...

  3. [PHP] time_wait与长连接短连接

    服务端上查看tcp连接的建立情况,直接使用netstat命令来统计,看到了很多的time_wait状态的连接.这些状态是tcp连接中主动关闭的一方会出现的状态.该服务器是nginx的webserver ...

  4. Windows下使用ssh-add报错 Error connecting to agent: No such file or directory

    Windows下使用ssh-add报错 Error connecting to agent: No such file or directory 环境信息 操作系统:windows 10 终端:Win ...

  5. 自动化部署-svn hook触发构建

    目的 之前是通过轮询的形式,2分钟更新一次svn,即时性不高,现在想要实现提交代码时直接触发构建 方案 使用svn的服务器hook,当有代码提交时请求jenkins api实现构建 具体实现 1.je ...

  6. java面试遇到的坑[第三期]

    亲爱的同学们,本人因为连续几周遭遇一定的工作压力几乎被压榨的只剩一个空壳,还好经常锻炼有一副好身体(皮囊),算是挺过来了.为了大家年前能早早入坑马不停蹄回到阵地给大家带来第二期的面试坑题,有些题是大家 ...

  7. react界面跳转,滚动到顶部

    在使用react-router-dom时,我们经常会遇到路由切换时滚动到浏览器顶部的问题. 滚动到顶部 Scroll to top 很多时候我们需要的是滚动到顶部“Scroll to top”,因为发 ...

  8. 深浅拷贝及 join set

    1.join s="**".join (['风清扬',"独孤求败"] )       join  把里面的东西拿出来,进行拼接 s="_". ...

  9. 使用system V实现读者写者问题

    #include <stdio.h> #include <sys/sem.h> #include <sys/ipc.h> #include <string.h ...

  10. Paper | No-reference Quality Assessment of Deblocked Images

    目录 故事背景 本文方法(DBIQ) 发表在2016年Neurocomputing. 摘要 JPEG is the most commonly used image compression stand ...