JWT(Json web token)就不用过多的介绍了,在 .NET Core 开发中使用JWT进行认证也是比较常见的,而且接入过程也比较简单,随便配置配置就好了。

要想使用JWT,仅仅只需要在项目中引用微软的一个认证组件。

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

然后将一些敏感数据可以放在配置文件appsettings.json中。

{"JWT": {"ClockSkew": 10,"ValidAudience": "https://meowv.com","ValidIssuer": "阿星Plus","IssuerSigningKey": "6Zi/5pifUGx1c+mYv+aYn1BsdXPpmL/mmJ9QbHVz6Zi/5pifUGx1c+mYv+aYn1BsdXPpmL/mmJ9QbHVz6Zi/5pifUGx1c+mYv+aYn1BsdXPpmL/mmJ9QbHVz6Zi/5pifUGx1cw==","Expires": 30}
}

Startup中添加配置并且使用

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ClockSkew = TimeSpan.FromSeconds(Convert.ToInt32(Configuration.GetSection("JWT")["ClockSkew"])),ValidateIssuerSigningKey = true,ValidAudience = Configuration.GetSection("JWT")["ValidAudience"],ValidIssuer = Configuration.GetSection("JWT")["ValidIssuer"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("JWT")["IssuerSigningKey"]))};});services.AddAuthorization();
app.UseAuthentication();
app.UseAuthorization();

这样一个简单的JWT配置就完成了,接下来新写一个接口去生成token。

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;namespace JsonWebTokenDemo.Controllers
{[Route("api/[controller]")][ApiController]public class AuthController : ControllerBase{public AuthController(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }[HttpGet][Route("Token")]public string GenerateTokenAsync(string username, string password){if (username == "meowv" && password == "123"){var claims = new[] {new Claim(ClaimTypes.Name, username),new Claim(ClaimTypes.Email, "123@meowv.com"),new Claim(JwtRegisteredClaimNames.Exp, $"{new DateTimeOffset(DateTime.Now.AddMinutes(Convert.ToInt32(Configuration.GetSection("JWT")["Expires"]))).ToUnixTimeSeconds()}"),new Claim(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}")};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("JWT")["IssuerSigningKey"]));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var securityToken = new JwtSecurityToken(issuer: Configuration.GetSection("JWT")["ValidIssuer"],audience: Configuration.GetSection("JWT")["ValidAudience"],claims: claims,expires: DateTime.Now.AddMinutes(Convert.ToInt32(Configuration.GetSection("JWT")["Expires"])),signingCredentials: creds);var token = new JwtSecurityTokenHandler().WriteToken(securityToken);return token;}else{throw new Exception("账号密码错误");}}}
}

模拟用户登录,成功登录则去生成token,在实际应用中还可以对接第三方登录系统进行认证,调用接口看下效果。

可以看到第一个接口输入正确的账号密码,成功返回了token,第二个接口会抛出一个异常。

接下来去写两个接口,去验证一下token的使用是否正常,写一个需要授权的接口和一个不需要授权的接口。

[HttpGet]
[Authorize]
[Route("AuthorizeTest")]
public string AuthorizeTest()
{return "我是返回结果";
}[HttpGet]
[AllowAnonymous]
[Route("AllowAnonymousTest")]
public string AllowAnonymousTest()
{return "我是返回结果";
}

这两个接口的唯一区别就是,[Authorize][AllowAnonymous]

添加了 [Authorize]特性的表明是需要进行授权才可以访问此接口,而添加了[AllowAnonymous]特性则表明不需要授权谁都可以访问,同样调用看一下效果。

第一个接口没有返回出结果,可见生效了,此时调用的时候就需要带上我们前面生成的token成功授权后才能返回数据。

有时候当我们没有成功授权,会直接返回一个401的错误页面,如果需要自定义返回信息需要怎么做呢?

这个有好几种做法,可以用中间件,拦截器等等,不过这里推荐一种组件集成好的做法,直接上代码。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{...options.Events = new JwtBearerEvents{OnChallenge = async context =>{context.HandleResponse();context.Response.ContentType = "application/json;charset=utf-8";context.Response.StatusCode = StatusCodes.Status401Unauthorized;await context.Response.WriteAsync("{\"message\":\"Unauthorized\",\"success\":false}");}};});

添加上面这段代码即可,await context.Response.WriteAsync()可以返回你自定义的错误消息,这里返回的是一个json字符串。

另外还有一种场景,默认我们拿到token进行授权访问,是需要在请求头中添加Authorization Bearer {token}这种方式的,如果我不想在请求头中使用要怎么做呢?比如我想将token放在URL参数中,或者cookie中?

同样也是可以的,而且实现方式也超级简单,看下面代码。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{...options.Events = new JwtBearerEvents{...OnMessageReceived = async context =>{context.Token = context.Request.Query["token"];await Task.CompletedTask;}};});

这里演示了将token放在URL请求参数中,其它情况请根据实际开发场景进行修改即可。

.NET Core 集成JWT认证相关推荐

  1. asp.net core 集成JWT

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  2. Dotnet core使用JWT认证授权最佳实践(二)

    最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 第一部分:Dotnet core使用JWT认证授权最佳实践(一) ...

  3. Asp.Net Core基于JWT认证的数据接口网关Demo

    Asp.Net Core基于JWT认证的数据接口网关Demo 近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求 ...

  4. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  5. Dotnet core使用JWT认证授权最佳实践(一)

    最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 一.JWT JSON Web Token (JWT)是一个开放标准 ...

  6. ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题

    最近我在准备一个分享,就是基于.NET 6.0的云原生开发Microsoft 365应用,这个看起来很高大上的东东,其实我理解主要就是能把应用容器化,便于与环境无关地进行分发和部署.如果理解有误,请大 ...

  7. ASP.NET Core 基于JWT的认证(二)

    上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用. .Net Core 2.2 Visual St ...

  8. asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)

    asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息.在这里我分享一个自定义 ...

  9. 在https上面使用ws不加密_ASP.NET Core 3.1 中使用JWT认证

    转自:小伟06cnblogs.com/liuww/p/12177272.html JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: ...

最新文章

  1. Apriori算法通俗详解_fpgrowth_关联
  2. python05-字符串和字典
  3. 函数指针--全局函数指针与类的函数指针(二)
  4. 认识控制台-控制台句柄、附着到控制台、关闭控制台
  5. 【Java从入门到天黑|04】JavaSE入门之数组
  6. 嵌入式实训-day1
  7. ppt格式刷快捷键_为什么别人PPT做的比你快?因为你没掌握这些!
  8. 窗口封装类与Windows窗口实例的关系-3、CWnd如何处理窗口消息
  9. who i am !
  10. 51Nod 1002 数字三角形 Label:水水水 非学习区警告
  11. Web前端开发技术实验与实践(第3版)储久良编著实训3
  12. ZebraDesigner-设计label
  13. 单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 pulsesensor ADS1292R
  14. 3ds Max中Vray分布式渲染
  15. 台式计算机把光驱改成硬盘,台式机光驱位怎么安装硬盘
  16. java接收二进制数据,java接口接收二进制流
  17. Python3编写炸金花游戏--超详细的讲解!!
  18. tiff与GDAL笔记
  19. PHP7.2中AES加密解密方法mcrypt_module_open()替换方案
  20. mysql 8.0优化配置_mysql 8.0.18 安装配置优化教程

热门文章

  1. java 连接redis 以及基本操作
  2. html标签缺省(自带)样式大全
  3. Java网络编程二:Socket详解
  4. Android Button监听的方式
  5. WPF将数据库和GridView绑定并更改GridView模板
  6. ⑥又是星期五,小试牛刀(编写定制标签)
  7. EVGA Precision—— 显卡超频神器 可用于调节风扇转速 降温
  8. android 文本后图标_如何在Android中更改文本,图标等的大小
  9. 如何更改Windows 10锁定屏幕超时
  10. 路由销毁上一页_路由器原理(数据通信)