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

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

 

改造jwt tokengit

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

 asp.net core的源代码数组

Security的下面asp.net

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

 

 github源代码的讲解

 这是jwtBearer的认证的源码:spa

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

 AddJwtBearer的扩展方法在这里。设计

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

 

 

 就是咱们的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策略的相关文章:

http://www.javashuo.com/article/p-tzixxrnh-e.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不是一个项目。

相关文章
相关标签/搜索