.NET Core 集成JWT认证

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请求参数中,其它情况请根据实际开发场景进行修改即可。

(0)

相关推荐

  • JWT(Json Wen Token)原理剖析

    JWT(即json web token),大家先看下面这张图 大家可以观察到,jwt String就是生成后的jwt字符集,其中有两个 "."(注意:jwt校验会对".& ...

  • drf——基于jwt的多方式登录以及自定义多方式登录

    一.基于jwt的多方式登陆 1 手机号+密码 用户名+密码 邮箱+密码 2 流程分析(post请求): -路由:自动生成(推荐自动生成,自己手写也行) -视图类:ViewSet(ViewSetMixi ...

  • dotNET Core 3.X 使用 Jwt 实现接口认证

    在前后端分离的架构中,前端需要通过 API 接口的方式获取数据,但 API 是无状态的,没有办法知道每次请求的身份,也就没有办法做权限的控制.如果不做控制,API 就对任何人敞开了大门,只要拿到了接口 ...

  • .NET core webApi 使用JWT验证签名

    一.为什么使用JWT 1.跨语言使用. 2.服务器端无需再保存任何东西,只需要客户端保存token就可以. 3.实现简单. 4.统一认证方式,如果是移动端也要验证的话,jwt也支持就无需修改,否则客户 ...

  • NET CORE API权限控制之JWT的创建和引用

    在我们的接口调用中,都需要配置权限控制,下面介绍下在ASP NET CORE下使用JWT的步骤: 1.创建鉴权项目 由于鉴权并不需要每次调用都鉴权,所以我们可以自己创建一个项目工程作为鉴权中心,用户拿 ...

  • ASP.Net Core 3.1 中使用JWT认证

    JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包含token的元 ...

  • thinkphp5.0 集成jwt方案

    通过composer安装thinkphp5.*框架 composer create-project topthink/think thinkRedisFirst –prefer-dist1 -pref ...

  • ASP.NET Core 集成Prometheus+grafana

    相关主页  Prometheus https://prometheus.io/ grafana https://grafana.com/ 安装Prometheus         Linux 可以参考 ...

  • .net core 集成 sentry 进行异常报警

    Intro Sentry 是一个实时事件日志记录和汇集的平台.其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈.它分为客户端和服务端,客户端(目前客户端有 C#, Python, ...

  • drf—— JWT认证及基本使用

    一.JWT认证介绍 1 不再使用Session认证机制,而使用Json Web Token(本质就是token)认证机制,用户登录认证 2 用户只要登录了,返回用户一个token串(随机字符串),每次 ...

  • Django REST Framework教程(7): 如何使用JWT认证(神文多图)

    在前面的DRF系列文章中,我们介绍了DRF认证(authentication)的本质, 以及自带的几种认证方案,包括TokenAuthentication方案.然而JSON Web Token(JWT ...

  • [Vue+Flask]前后端分离JWT用户认证授权

    传统Flask通过Flask-Login的login_user()解决登录问题,通过session进行处理,不适合前后端分离系统,所以使用JWT进行用户认证 Session-cookie: Sessi ...

  • ASP.NET Core 5.0 Web API 自动集成Swashbuckle

    dotNET跨平台 今天 以下文章来源于UP技术控 ,作者conan5566 UP技术控不止IT 还有生活 ASP.NET Core 5.0 Web API与开放源代码项目 Swashbuckle.A ...