(三).NET Core WebAPI集成JWT,实现身份验证

简介: 前两篇文章给大家介绍了在.NET Core中如何使用Swagger的文章,那今天给大家分享一下JWT在做接口开发的同学可能都有感受,我的接口如何保护的问题,如果没有身份验证,那不是接口完全暴露在外面,任意使人调用,这显然不是我们想要的一种结果。当然做身份验证的方式有多种,今天给大家讲一种比较流行了,标准的身份验证JWT什么是JWT?

前两篇文章给大家介绍了在.NET Core中如何使用Swagger的文章,那今天给大家分享一下JWT

在做接口开发的同学可能都有感受,我的接口如何保护的问题,如果没有身份验证,那不是接口完全暴露在外面,任意使人调用,这显然不是我们想要的一种结果。当然做身份验证的方式有多种,今天给大家讲一种比较流行了,标准的身份验证JWT

什么是JWT?


随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

JWT的结构体是什么样的?

JWT由三部分组成,分别是头信息、有效载荷、签名,中间以(.)分隔

(1)header(头信息)

由两部分组成,令牌类型(即:JWT)、散列算法(HMAC、RSASSA、RSASSA-PSS等)

(2)Payload(有效载荷)

JWT的第二部分是payload,其中包含claims。claims是关于实体(常用的是用户信息)和其他数据的声明,claims有三种类型: registered, public, and private claims。

Registered claims: 这些是一组预定义的claims,非强制性的,但是推荐使用, iss(发行人), exp(到期时间), sub(主题), aud(观众)等;

Public claims: 自定义claims,注意不要和JWT注册表中属性冲突

Private claims: 这些是自定义的claims,用于在同意使用这些claims的各方之间共享信息,它们既不是Registered claims,也不是Public claims。

(3)Signature

要创建签名部分,必须采用编码的Header,编码的Payload,秘钥,Header中指定的算法,并对其进行签名。

JWT使用流程:

JWT在.NET Core项目中的具体用法:

(1)在ConfigureServices方法中添加JWT相关代码:

网络异常,图片无法展示
|

#region 添加jwt验证:

   services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

   .AddJwtBearer(options => {

       options.TokenValidationParameters = new TokenValidationParameters

       {

           ValidateIssuer = true,//是否验证Issuer

                   ValidateAudience = true,//是否验证Audience

                   ValidateLifetime = true,//是否验证失效时间

                   ValidateIssuerSigningKey = true,//是否验证SecurityKey

                   ValidAudience = Configuration["audience"],//Audience

                   ValidIssuer = Configuration["issuer"],//Issuer,这两项和前面签发jwt的设置一致

                   IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]))//拿到SecurityKey

               };

   });

#endregion

网络异常,图片无法展示
|

(2)在Configure方法中添加JWT代码:

#region jwt

   app.UseAuthentication();//注意添加这一句,启用验证

#endregion

(3)创建一个JWT服务类:

网络异常,图片无法展示
|

publicclass JWTService

{

   privatereadonly IConfiguration _configuration;


   public JWTService(IConfiguration configuration)

   {

       _configuration = configuration;

   }


   publicstring GetToken(string UserName)

   {

       var claims = new[]

       {

              new Claim(ClaimTypes.Name, UserName)

       };


       //sign the token using a secret key.This secret will be shared between your API and anything that needs to check that the token is legit.

       var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));

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

       //.NET Core’s JwtSecurityToken class takes on the heavy lifting and actually creates the token.

       /**

        * Claims (Payload)

           Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:


           iss: The issuer of the token,token 是给谁的

           sub: The subject of the token,token 主题

           exp: Expiration Time。 token 过期时间,Unix 时间戳格式

           iat: Issued At。 token 创建时间, Unix 时间戳格式

           jti: JWT ID。针对当前 token 的唯一标识

           除了规定的字段外,可以包含其他任何 JSON 兼容的字段。

        * */

       var token = new JwtSecurityToken(

           issuer: _configuration["issuer"],

           audience: _configuration["audience"],

           claims: claims,

           expires: DateTime.Now.AddHours(24),

           signingCredentials: creds);

       string returnToken = new JwtSecurityTokenHandler().WriteToken(token);

       return returnToken;

   }

}

网络异常,图片无法展示
|

(4)在接口类或方法上标记身份验证:

到此为止,JWT的基本用法就结束,非常简单和方便,接下来我们用postman测试一下JWT是否生效:

(1)当我们在不登录的情况下,访问接口看看是什么现象:

我们发现接口返回提示:401 Unauthorized

(2)我们先调用登录接口,先计算得到token,然后再来请求试试:

登录成功后,接口返回了token值

(3)将token复制粘贴到下方,请求业务接口,成功调用:

相关文章
|
开发框架 数据可视化 .NET
.NET 中管理 Web API 文档的两种方式
.NET 中管理 Web API 文档的两种方式
360 14
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
718 4
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
人工智能 API C#
使用Microsoft.Extensions.AI简化.NET中的AI集成
使用Microsoft.Extensions.AI简化.NET中的AI集成
412 5
使用Microsoft.Extensions.AI简化.NET中的AI集成
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
506 3
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
337 3
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
269 8
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
377 0
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
260 0
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
379 0
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
309 0