我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NetCore实现JWT授权认证

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.NetCore实现JWT授权认证

关于JWT的基本概念,如果有不清晰的同学,请点击这里,就不在这里赘述了。接下来聊聊JWT是怎么发挥作用的。

第一,安装nuget包

Microsoft.AspNetCore.Authentication.JwtBearer

第二,配置【Startup】

首先是【ConfigureServices】方法,下面要写一大堆进去

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(x =>
                {
                    x.RequireHttpsMetadata = false;

                    x.SaveToken = true;

                    x.TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidateLifetime = true,
                        LifetimeValidator = (notBefore, expires, securityToken, validationParameters) =>
                        {
                            bool t = DateTime.UtcNow < expires;
                            return t;
                        },

                        ValidateAudience = false,

                        ValidateIssuer = true,
                        ValidIssuer = jwtConfig.Issuer,

                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.Key)),
                    };
                });

虽然看起来多,实际上逻辑很清晰,我在这里简单解释一下:

  • RequireHttpsMetadata:获取或设置元数据地址或权限是否需要HTTPS,默认为true
  • SaveToken:是否将信息存储在token中
  • TokenValidationParameters:这部分网上有很多版本,其中大部分都是写满的,但这对新手不太友好;而且也不是必须写满。先解释一些代码里的验证开关(设置true、false的我称为验证开关)
  • ValidateLifetime——是否验证过期时间
  • ValidateAudience——是否验证被发布者
  • ValidateIssuer——是否验证发布者
  • ValidateIssuerSigningKey——是否验证签名

查看框架代码你会发现更多的验证开关,这里就不一一解释了:

然后在【Configure】添加引用:

app.UseAuthentication();
app.UseAuthorization();

这里的顺序不能颠倒。第一行是开启身份验证,第二行是开启授权。

第三,配置

JWT需要进行一些简单的配置来确保安全,至于配置写在哪里都可以,我是放在appsettings内:

  "JWT": {
    "Issuer": "发布者,一般是一个域名",
    "Key": "一个新的guid",
    "Expires": 600(秒)
  }

第四,生成JWT

为了方便大家理解,我这边直接上代码:

public static string GetToken(IOptions<JwtConfig> _options, dynamic customer)
        {
            var claims = new[] {
                new Claim(ClaimTypes.Name,"JWT"),
                new Claim("ID",customer.ID),
                new Claim("WxOpenID",customer.WxOpenID),
                new Claim("Father",customer.Father)
            };
        
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.Value.Key));

            var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(
               issuer: _options.Value.Issuer,
                claims: claims,
                expires: DateTime.UtcNow.AddMinutes(_options.Value.Expires),
                signingCredentials: credentials);

            return new JwtSecurityTokenHandler().WriteToken(token);
        }

如果在token中想要携带某些参数,可以使用Claim进行封装。

接下来还有3个小步骤:

  • 1、对配置文件中的key进行加密,得到对称加密key。
  • 2、使用上一步得到的结果生成数字证书。
  • 3、配置token的内容。

最后,就可以生成jwt并且返回了。

第五,获取JWT内容

正常情况下,JWT除了做验证以外,还要有一些参数做辅助。上面说了参数传递是通过定义claim实现的,那么怎么合法的解析呢?还是直接上代码:

public static JwtInfo GetInfoFromToken(string token = null)
        {
            if (token is null)
                return null;

            string tokenStr = token.Replace("Bearer ", "");

            var handler = new JwtSecurityTokenHandler();

            var payload = handler.ReadJwtToken(tokenStr).Payload;

            var claims = payload.Claims;

            JwtInfo info = new JwtInfo()
            {
                ID = claims.First(claim => claim.Type == "ID")?.Value,
                WxOpenID = claims.First(claim => claim.Type == "WxOpenID")?.Value,
                Father = claims.First(claim => claim.Type == "Father")?.Value
            };

            return info;
        }

这一段没什么好讲的,对应的名字拿到对应的参数。不过如果参数不存在这里会报错,所以尽量规范一点,首尾呼应。

第六,代码应用

JWT也生成了,同时也可以反向解析传递的参数了,该如何应用到代码中去呢?这里要用到特性。

为需要进行验证的控制器添加【Authorize】特性,这个控制器下的所有方法在外部调用时就都需要JWT认证才可顺利调用,否则返回401(未授权)。如果不是全部方法都需要认证,那么可以为方法添加【AllowAnonymous】特性来忽略认证限制,如图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.NetCore实现JWT授权认证

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

.Net Core如何授权认证JWT

这篇文章主要讲解了“.Net Core如何授权认证JWT”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.Net Core如何授权认证JWT”吧!一、前言现在越来越多的项目或多或少会用到JWT
2023-07-02

SpringBoot+SpringSecurity+JWT实现系统认证与授权示例

本文主要介绍了SpringBoot+SpringSecurity+JWT实现系统认证与授权示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

.NET Core怎么实现Cookie和JWT混合认证、授权

本篇内容介绍了“.NET Core怎么实现Cookie和JWT混合认证、授权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言为防止JWT
2023-06-26

ASP.NET Core使用JWT认证授权的方法

demo地址: https://github.com/william0705/JWTS 名词解析认证 : 识别用户是否合法 授权: 赋予用户权限 (能访问哪些资源) 鉴权: 鉴定权限是否合法 Jwt优势与劣势优势1、 无状态 token
2022-06-07

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

1,快速实现授权验证 什么是 JWT ?为什么要用 JWT ?JWT 的组成? 这些百度可以直接找到,这里不再赘述。 实际上,只需要知道 JWT 认证模式是使用一段 Token 作为认证依据的手段。 我们看一下 Postman 设置 Tok
2022-06-07

ASP.NET Core 6.0怎么添加JWT认证和授权功能

本篇内容介绍了“ASP.NET Core 6.0怎么添加JWT认证和授权功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!相关名词Authe
2023-06-30

SpringBoot中怎么实现安全认证和授权

在Spring Boot中,可以使用Spring Security实现安全认证和授权。Spring Security是一个强大且高度可定制的框架,可以帮助我们轻松地实现各种安全功能,包括用户认证、用户授权、密码加密、会话管理等。以下是在S
SpringBoot中怎么实现安全认证和授权
2024-03-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录