ASP.NET Core系列:JWT身份认证
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身份认证的更多相关文章
- ASP.NET Core 基于JWT的认证(一)
ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- Asp.net Core 系列之--5.认证、授权与自定义权限的实现
ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...
- ASP.NET Core 中jwt授权认证的流程原理
目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...
- asp.net core 系列之用户认证(authentication)
ASP.NET Core 的 identity 是一种需要用户登录的会员系统,用户可以创建一个登录信息存储在 Identity 的的账号, 或者也可以使用第三方登录,支持的第三方登录包括:Facebo ...
- asp.net core 系列之用户认证(1)-给项目添加 Identity
对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成. 虽然基架已 ...
- 【转】ASP.NET Core WebAPI JWT Bearer 认证失败返回自定义数据 Json
应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer 进行接口权限认证的时候,返回的结果不是我们客户端想要的,其它我们想要给客户端返回统一的数据结构, ...
- asp.net core 3.0 身份认证 替换为自已的提供程序 AuthenticationStateProvider replace to SelfAuthenticationStateProvider
public void ConfigureServices(IServiceCollection services) { // 添加身份验证服务 services.AddAuthorizationCo ...
- Asp.Net Core基于JWT认证的数据接口网关Demo
近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...
随机推荐
- css横屏问题的设置
<link rel="stylesheet" media="all and (orientation:portrait)" href="css/ ...
- 如何给HTML页面的文本设置字符和单词间距
设置字符和单词间距介绍 属性名 单位 描述 letter-spacing px 设置字符间距 word-spacing px 设置单词间距 letter-spacing设置字符间距 letter-sp ...
- Android监视器概述
还望支持个人博客站:http://www.enjoytoday.cn Android监视器可帮助您分析应用程序的性能,以便您优化,调试和改进它们. 它可以让您从硬件设备或Android模拟器监控应用程 ...
- c语言的全排列
在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧.估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了.如果你 ...
- 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 ...
- 13. 抽象类 & 接口
一.抽象类 // 抽象类Shape public abstract class Shape { // 1. 成员变量 private String color; // 2. 初始化块 { System ...
- XML配置报错
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram ...
- CentOS 8安装体验
这两天出来了,晚上爽一爽. 一,下载 http://ftp.sjtu.edu.cn/centos/8.0.1905/isos/x86_64/ 还是那7G左右的保险,没有minial版了,那个500m多 ...
- 05justify-content
display: flex; 的默认轴是x轴 justify-content: 设置主轴上的子元素排列的方式 所以在使用之前要确定好哪一个是主轴 /* justify-content:flex-sta ...
- C++学习一 结构与结构体
结构体属于C++与C区别之一. 代码例子如下(来自<C++程序设计>): #include <iostream> #include <string> using n ...