任务38:JWT 设计解析及定制

改造jwt token

token的值不放在Authorize里面,而是放在header的token里面

asp.net core的源代码

Security的下面

https://github.com/aspnet/AspNetCore/tree/master/src/Security

github源代码的讲解

这是jwtBearer的认证的源码:

https://github.com/aspnet/AspNetCore/tree/master/src/Security/Authentication/JwtBearer/src

AddJwtBearer的扩展方法在这里。

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs

就是我们的StartUp里面的方法调用的AddJwtBearer

JwtBearerHandler.cs

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs

这里提供我们一种方式Token可以从别的地方去拿,而不是从Header的Authorize的里面去拿token:

1分55秒

拿到token以后,下面会进行一些验证。我们要看关键是如何去加在自己的认证。

我们就是要加一个自己的Validate,在循环里面完成自己的业务逻辑。

也就是我们需要把token读取的地方给换掉。同时把token验证的逻辑换掉。

2分57秒

我们看到这里new了一个MessageReceivedContext 实际上它是包装,把我们当前的HttpContext和Scheme以为Options配置全都放进来

然后下面调用了 MessageReceived的这种方式

我们的MessageReceivedContext 在这个地方:

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/MessageReceivedContext.cs

然后是:JwtBearerEvents

https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/JwtBearer/src/JwtBearerEvents.cs

我们可以把这个地方给改掉:

同时最下面还有TokenValidated方法,我们用来手动写一下

开始写代码

开始改写我们之前写的代码:3分27秒

我们先把原来的代码注释掉

          //SecurityTokenValidators这是一个数组,我们先把它清空掉,否则它会从里面拿验证
o.SecurityTokenValidators.Clear();
//new一个event,我们要对它进行改造
o.Events = new JwtBearerEvents() {
OnMessageReceived = context =>{
var token = context.Request.Headers["mytoken"];//获取header中的token
context.Token = token.FirstOrDefault();//赋值给Context中的Token
return Task.CompletedTask;
}
};

然后再加Validator验证

根目录下创建类:MyTokenValidator.cs

继承:ISecurityTokenValidator在这个命名空间下using Microsoft.IdentityModel.Tokens;

修改接口的方法的返回值。

完成认证,以及给indetity赋值的过程

上面判断了token的值如果不对就返回了null是不可以的。必须要返回一个principal对象,哪怕是一个空的

再次修改如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens; namespace JwtAuthSample
{
public class MyTokenValidator : ISecurityTokenValidator
{
public bool CanValidateToken => true; public int MaximumTokenSizeInBytes { get; set; } public bool CanReadToken(string securityToken)
{
return true;
} public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
//进行验证
validatedToken = null;//要先进行赋值 var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); if (securityToken == "abcdefg")
{
identity.AddClaim(new Claim("name", "wjw"));
identity.AddClaim(new Claim("SuperAdminOnly", "true"));
identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "user"));
} var principal = new ClaimsPrincipal(identity); ; return principal;//不能直接返回null这里必须返回一个pincipal对象 }
}
}

MyTokenValidator

然后在startup中丢过去这段验证

这样就完成了定制的过程,我们修改了token的来源,同时我们该了token的验证方式

加了个;

[Authorize(Policy ="SuperAdminOnly")]

所以在验证的时候,我们也必须要给claim的一个SuperAdminOnly的Claim

本机代码报错:

System.InvalidOperationException:“The AuthorizationPolicy named: 'SuperAdminOnly' was not found.”

policy策略的相关文章:

https://www.cnblogs.com/freeliver54/p/6256538.html

博客园遇到的错误的地址:https://q.cnblogs.com/q/92774/

中文官方文档:

https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies?view=aspnetcore-2.2

*****************************************************************************

参考视频的代码写法 ,就是运行不起来。

以下是视频中的截图:

输入一个错误的token

输入一个正确的mytoken的值。然后就会返回 200.并且输出 claim的值

这是视频中的项目,和原来的JwtAuthSample不是一个项目。

任务38:JWT 设计解析及定制的更多相关文章

  1. 【ASP.NET Core快速入门】(十二)JWT 设计解析及定制

    前言 上一节我们讲述的书如何使用jwt token,而且上一节的token是要加Authorization:bearer XXXXXXXXXXXX才能访问. 这一节我们来研究如何自定义类似jwt的to ...

  2. 菜鸟入门【ASP.NET Core】12:JWT 设计解析及定制

    前言 上一节我们讲述的书如何使用jwt token,而且上一节的token是要加Authorization:bearer XXXXXXXXXXXX才能访问. 这一节我们来研究如何自定义类似jwt的to ...

  3. 38-JWT 设计解析及定制

    可去官网下载Security项目查看源码 只需修改 AddJwtBearer中的行为即可 public void ConfigureServices(IServiceCollection servic ...

  4. Kafka设计解析(二)- Kafka High Availability (上)

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/04/24/KafkaColumn2 摘要 Kafka在0.8以前的版本中,并不提供High Av ...

  5. Kafka设计解析(七)- Kafka Stream

    本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka Stream.接着介绍了Kafka Stream的整体架构,并行模型,状态存储,以 ...

  6. Kafka设计解析(五)- Kafka性能测试方法及Benchmark报告

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/12/31/KafkaColumn5_kafka_benchmark 摘要 本文主要介绍了如何利用 ...

  7. 专注于个人服装定做_服装设计_Fabric_Design_Tailor-迦勒定制网

    专注于个人服装定做_服装设计_Fabric_Design_Tailor-迦勒定制网 客服热线:400-720-7206 工作时间:AM 09:00-PM 10:00 周六/周日/节假日:设计师休息

  8. 揭秘Kafka高性能架构之道 - Kafka设计解析(六)

    原创文章,同步首发自作者个人博客.转载请务必在文章开头处以超链接形式注明出处http://www.jasongj.com/kafka/high_throughput/ 摘要 上一篇文章<Kafk ...

  9. 流式处理的新贵 Kafka Stream - Kafka设计解析(七)

    原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/kafka_stream/ Kafka Stream背景 Ka ...

随机推荐

  1. linux批量解压和批量压缩

    ls *.tar.gz | xargs -n1 tar xzvf //批量解压 ls | awk '{ print "tar zcvf "$0".tar.gz " ...

  2. BeagleBone Black Industrial 工业版介绍

    前言 在电子发烧友论坛看到有Beaglebone Black Industrial版的试用,这里介绍一下这块开发板. BBB是开源硬件,原理图.BOM等都开放下载,所以也有诸多兼容板. BBB兼容产品 ...

  3. cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法

    cocos2d-x 3.0 中.假设你须要使用CocosStudio.Extensions扩展库 等等.都须要自己手动加入. 加入过程例如以下:(比方说如今我要加入libExtensions,libC ...

  4. PAT 1094. The Largest Generation(BFS)

    CODE: #include<cstdio> #include<cstring> #include<queue> using namespace std; bool ...

  5. CentOS笔记-用户和用户组管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 1.添加新的用户账号使用useradd命令,其语法如下 ...

  6. Hadoop提供的reduce函数中Iterable 接口只能遍历一次的问题

    今天在写MapReduce中的reduce函数时,碰到个问题,特此记录一下: void reduce(key, Iterable<*>values,...) { for(* v:value ...

  7. jvm 调优(1)概念

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  8. 通过反射调用一个单列的方法(单列必须有“getInstance”方法)

    Class<?> _clazz = Class.forName(_clazzName); if (_clazz != null) { Method _getInstance = _claz ...

  9. Statelessness Provide credentials with the request. Each request MUST stand alone and should not be affected from previous conversation happened from same client in past.

    The server never relies on information from previous requests. Statelessness As per the REST (REpres ...

  10. dataTables-details 1.9

    本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jqu ...