首页 > 其他分享 >Net6之Jwt认证+Bearer认证 2.0

Net6之Jwt认证+Bearer认证 2.0

时间:2023-07-22 20:55:52浏览次数:42  
标签:Claim 令牌 string 认证 context new var Net6 2.0

以前接触过,写过博客,第二次再写有了新的体会。第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html

过程:

  1. 生成token令牌(钥匙)
  2. 添加bearer认证 (验证钥匙是否正确)
  3. 给接口或控制器添加验证 (锁)
  4. 给接口添加显示的小锁

1.引入包:System.IdentityModel.Tokens.Jwt

这次博客比第一次简化了好多,比如令牌的model类,密钥写在配置文件等,暂时省略了

  public static string IssueJwt(string id,string Name)
        {
            string iss = "发行人";
            string aud = "受众人";
            string secret = "12345678912345671234567891234567";

            //载荷
            var claims = new List<Claim>()
            {
                 //jwtID唯一
                 new Claim(JwtRegisteredClaimNames.Jti,id),
                 //发行人可以理解为网站属于发行人
                 new Claim(JwtRegisteredClaimNames.Iss,iss),
                 //受众可以理解为哪些人可以使用
                 new Claim(JwtRegisteredClaimNames.Aud,aud),
                 //主体可以理解为对令牌的说明
                 new Claim(JwtRegisteredClaimNames.Sub,"主体"),
                 //发行时间即为令牌生成的时间
                 new Claim (JwtRegisteredClaimNames.Iat,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
                 //在此时间之前不可用
                 new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
                 //令牌过期时间
                 new Claim(JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(60)).ToUnixTimeSeconds()}"),
                 new Claim(ClaimTypes.Name,Name)
            };

            //使用密钥生成签名凭证
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            //序列化jwt
            var jwt = new JwtSecurityTokenHandler().WriteToken(
                new JwtSecurityToken(
                issuer: iss,
                claims: claims,
                signingCredentials: creds));
            return jwt;
        }
   
生成token

2.引入包:Microsoft.AspNetCore.Authentication.JwtBearer 

//注册bearer认证
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
    var SigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("12345678912345671234567891234567"));
    //验证的参数
    o.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
        //验证密钥
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = SigningKey,
        //验证发行者
        ValidateIssuer = true,
        ValidIssuer = "发行人",
        //验证受众
        ValidateAudience = true,
        ValidAudience = "受众人",
        //验证有效期
        ValidateLifetime = true,
        ClockSkew = TimeSpan.FromSeconds(30),
        //必须有过期值/时间
        RequireExpirationTime = true
    };
    o.Events = new JwtBearerEvents()
    {
        //当JWT Bearer认证失败时,即请求未包含有效的JWT令牌或令牌验证失败,该事件会被触发
        OnChallenge = context =>
        {
            context.Response.Headers.Add("Token-Error", context.ErrorDescription);
            return Task.CompletedTask;
        },
        //当JWT Bearer认证过程中出现异常时,例如令牌过期、签名验证失败等情况,该事件会被触发
        OnAuthenticationFailed = context =>
        {
            var jwtHandler = new JwtSecurityTokenHandler();
            var token = context.Request.Headers["Authorization"].ObjToString().Replace("Bearer ", string.Empty).Replace("bearer",string.Empty).Trim();

            var jwtToken = jwtHandler.ReadJwtToken(token);

            if (jwtToken.Issuer != "发行人")
            {
                context.Response.Headers.Add("Token-Error-Iss", "issuer is wrong!");
            }

            if (jwtToken.Audiences.FirstOrDefault() != "受众人")
            {
                context.Response.Headers.Add("Token-Error-Aud", "Audience is wrong!");
            }
            // 如果过期,则把<是否过期>添加到,返回头信息中
            if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
            {
                context.Response.Headers.Add("Token-Expired", "true");
            }
            return Task.CompletedTask;
        }
    };
});
bearer认证

3和4:引入包:SwashBuckle.AspNetCore.Filters

builder.Services.AddSwaggerGen(a =>
{
    // 开启加权小锁(暂时不知道什么意思)
    a.OperationFilter<AddResponseHeadersFilter>();
    //(接口显示认证角色信息)
    a.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
    // 在header中添加token,传递到后台(添加小锁)
    a.OperationFilter<SecurityRequirementsOperationFilter>();

    a.AddSecurityDefinition("oauth2", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
    {
        Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",
        Name = "Authorization",        //jwt默认的参数名称
        In = ParameterLocation.Header, //jwt默认存放Authorization信息的位置(请求头中)
        Type = SecuritySchemeType.ApiKey//安全方案/类型(模式)APIkey
    });
});
添加到swagger显示锁

 

 

 

标签:Claim,令牌,string,认证,context,new,var,Net6,2.0
From: https://www.cnblogs.com/zhang-3/p/17574221.html

相关文章

  • WPF .net6 自定义启动入口 、 自定义Main函数、自定义 STAThread 方法
    前言:  为了解决程序开启自启动问题参考资料  CustomEntryPointsinWPFon.NETCore链接https://blog.magnusmontin.net/2020/01/31/custom-entry-point-wpf-net-core/  CreatingacustomMainmethodinaWPFapplication链接https://www.meziantou.net/creat......
  • 图片预加载需要token认证的地址处理
    1.添加函数修改img的属性;/****@param{*}idName传入的id,获取改img的dom,添加相应的数学*/exportconstproxyImg=(idName)=>{constimg=document.getElementById(idName||'img');consturl=img.getAttribute('authsrc');constrequest=new......
  • clion申请教育认证
    clion申请教育认证1、注册jetbrains账号jetbrains注册账号网站链接邮箱没有限制,qq邮箱即可,注册时候会给qq邮箱发送邮件,前往qq邮箱进行确认即可,如下图。2、教育认证点击注册完页面的Applyforafreestudentorteacherlicense选项或者跳转教育认证https://www.jetbrain......
  • .NET6 Core6教程
    .NET6Core6教程教程概述在本教程中,我将向你介绍如何使用.NET6Core6来开发应用程序。我会逐步指导你完成整个过程,并提供每一步所需的代码示例和解释。通过这个教程,你将学会使用.NET6Core6构建功能强大的应用程序。教程步骤步骤描述1安装.NET6Core6......
  • WARN common.Util: Path /E:/hadoop/hadoop-2.2.0/data/namenode should be speci
    如何解决"WARNcommon.Util:Path/E:/hadoop/hadoop-2.2.0/data/namenodeshouldbespecifiedasaURIwhoseschemeandauthorityare'null'.Theuriwereceivedwas:/E:/hadoop/hadoop-2.2.0/data/namenode"错误作为一名经验丰富的开发者,我将指导你如何解决这个错误。首......
  • 2023年9月天津/郑州/深圳DAMA-CDGA/CDGP认证考试报名
    据DAMA中国官方网站消息,2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启,相关事宜通知如下: 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA)数据治理专家(CertifiedDataGovernanceProfessional,CDGP) 考试时间: CDGA:2023......
  • 华为认证 | 拿下HCIE,需要多久?
    有很多人想学习HCIE,但又不知道什么时候能学会,在这小编为大家详细介绍一下HCIE多久学会?其实有很多因素影响学习的时间,比如有个人基础、学习时间、学习能力等等原因。跟我们学其他的知识是一样的。有的人考HCIE,几个月考到,有的人需要半年或1年以上的时间考到,甚至好几年没过的也有。每......
  • 2023年7月天津/郑州/深圳CDGA/CDGP数据治理认证招生
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 2023年天津/郑州/深圳CSPM-3中级国标项目管理认证报名
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • SSO2.0 28-20230719
                      ......