JWT验证一般用户移动端,因为它不像cookie验证那样,没有授权跳转到登陆页面

JWT是json web token的简称,在  jwt.io 网址可以看到

新建一个API项目,通过postman 可以访问:

JWT在命名空间:using Microsoft.AspNetCore.Authentication.JwtBearer;

添加JWT实体类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace Api.Models
{public class JwtSettings{/// <summary>/// Token是谁颁发的/// </summary>public string Issuer { get; set; }/// <summary>/// Token给那些客户端去使用/// </summary>public string Audience { get; set; }/// <summary>/// 用于加密的key 必须是16个字符以上,要大于128个字节/// </summary>public string SecetKey { get; set; }}
}

添加配置文件

添加JWT认证

public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.Configure<JwtSettings>(Configuration);var jwtSettings = new JwtSettings();Configuration.Bind("JwtSettings", jwtSettings);services.AddAuthentication(option => {option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(option=> {option.TokenValidationParameters = new TokenValidationParameters {ValidIssuer = jwtSettings.Issuer,ValidAudience = jwtSettings.Audience,IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecetKey))

 /***********************************TokenValidationParameters的参数默认值***********************************/                    // RequireSignedTokens = true,                    // SaveSigninToken = false,                    // ValidateActor = false,                    // 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。                    // ValidateAudience = true,                    // ValidateIssuer = true,                     // ValidateIssuerSigningKey = false,                    // 是否要求Token的Claims中必须包含Expires                    // RequireExpirationTime = true,                    // 允许的服务器时间偏移量                    // ClockSkew = TimeSpan.FromSeconds(300),                    // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比                    // ValidateLifetime = true};});}

添加中间件(Middleware)

app.UseAuthentication();

API接口打上标签:

然后在postman访问 就是401 未授权

接下来需要给用户颁发Token

当用户登陆成功后,颁发token

创建登陆API和实体类

namespace Api.Models
{public class LoginViewModel{[Required]public string user { get; set; }[Required]public string pwd { get; set; }}
}

using Api.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;namespace Api.Controllers
{//[Route("api/[controller]")]//[ApiController]public class AuthorizeController : ControllerBase{private JwtSettings _jwtSettings;public AuthorizeController(IOptions<JwtSettings> jwtSetting){_jwtSettings = jwtSetting.Value;}[HttpPost]public IActionResult Token([FromBody]LoginViewModel login){if (ModelState.IsValid){if (!(login.user == "cnglgos" && login.pwd == "123")){return BadRequest();}var claim = new Claim[] {new Claim("name","cnbogs"),new Claim("role","admin")};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//neget包:Microsoft.AspNetCore.Authentication.JwtBearer//命名空间: System.IdentityModel.Tokens.Jwt;//第一种方式var token = new JwtSecurityToken(_jwtSettings.Issuer,// Issuer 颁发者,通常为STS服务器地址_jwtSettings.Audience,// Audience Token的作用对象,也就是被访问的资源服务器授权标识
                    claim,DateTime.Now,  //Token生效时间,在此之前不可用DateTime.Now.AddMinutes(30), //Token过期时间,在此之后不可用
                    creds);//第二种方式var descriptor = new SecurityTokenDescriptor{Issuer = _jwtSettings.Issuer,Audience = _jwtSettings.Audience,// Audience Token的作用对象,也就是被访问的资源服务器授权标识Subject = new ClaimsIdentity(claim),NotBefore = DateTime.Now, //Token生效时间,在此之前不可用Expires = DateTime.Now.AddMinutes(30), //Token过期时间,在此之后不可用SigningCredentials = creds,IssuedAt=DateTime.Now //Token颁发时间
                };var handler = new JwtSecurityTokenHandler();JwtSecurityToken token1 = handler.CreateJwtSecurityToken(descriptor);return Ok(new{token = new JwtSecurityTokenHandler().WriteToken(token),token1 = handler.WriteToken(token1)});}return BadRequest();}public IActionResult Index(){return Ok();}}
}

Postman请求

然后上面的Token 请求 https://localhost:5001/api/values

从headers可以看到,前缀必须是Bearer

我们可以自定义Token,必须继承接口:ISecurityTokenValidator

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Collections.Generic;
using System.Security.Claims;
namespace Api.Models
{public class TokenValidtor : ISecurityTokenValidator{public bool CanValidateToken => true;public int MaximumTokenSizeInBytes { get; set; }public bool CanReadToken(string securityToken){return true;}public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken){validatedToken = null;

            var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);

            if (securityToken == "cnblgos")            {                var claim = new List<Claim> {                    new Claim("name","cnblogs"),                    new Claim("role","admin")                };                identity.AddClaims(claim);            }

            var principal = new ClaimsPrincipal(identity);            return principal;}}
}

然后在StartUp中修改:

  public void ConfigureServices(IServiceCollection services){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);/*appsettings.json文件中JwtSettings是单独的一节,所以要GetSection方法获取*/services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));//services.Configure<JwtSettings>(Configuration);var jwtSettings = new JwtSettings();Configuration.Bind("JwtSettings", jwtSettings);services.AddAuthentication(option =>{option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(option =>{//option.TokenValidationParameters = new TokenValidationParameters {//    ValidIssuer = jwtSettings.Issuer,//    ValidAudience = jwtSettings.Audience,//    IssuerSigningKey=new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey))
option.SecurityTokenValidators.Clear();option.SecurityTokenValidators.Add(new TokenValidtor());option.Events = new JwtBearerEvents{OnMessageReceived = context =>{var token = context.Request.Headers["token"];context.Token = token.FirstOrDefault();return Task.CompletedTask;}};});}

//添加Policy和Claim授权
            services.AddAuthorization(options => {
                options.AddPolicy("nsky", policy => policy.RequireClaim("nsky")); });

Token可以去jwt.io 网站验证

参考大神的文章:https://www.cnblogs.com/RainingNight/p/jwtbearer-authentication-in-asp-net-core.html

转载于:https://www.cnblogs.com/nsky/p/10312101.html

Asp.net Core认证和授权:JWT认证和授权相关推荐

  1. ASP.NET Core 实现基于 ApiKey 的认证

    ASP.NET Core 实现基于 ApiKey 的认证 Intro 之前我们有介绍过实现基于请求头的认证,今天来实现一个基于 ApiKey 的认证方式,使用方式参见下面的示例 Sample 注册认证 ...

  2. ASP.NET Core 2.1中基于角色的授权

    授权是来描述用户能够做什么的过程.例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载.而非管理员用户只能使用软件而不能进行软件的安装以及卸载.它是独立的而又与验证配合使用,需要身份验证机制.对于 ...

  3. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    为什么是 JWT Bearer ASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer,  ...

  4. ASP.NET Core 3.0 gRPC 身份认证和授权

    一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...

  5. kong插件应用(熔断 限流,黑白名单,认证(basic,key,jwt,hmac,),授权,加密,zipkin链路跟踪,日志, prometheus可视化, 爬虫控制插件)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 kong安装部署以及kong-dashboard参考:https://blog.csdn.net/luanpeng825485697/article/ ...

  6. .net Core .net6 Cookie加Jwt认证 同时生效

    本文环境 Visual Studio 2022, .Net6 关于Cookie认证见,上篇 http://t.csdn.cn/ebmkT本文是接着添加Jwt认证的.流程简单代码不多. 目录 一.确定J ...

  7. ASP.NET Core 基于角色的 JWT 令牌

    原文:https://bit.ly/3vYljq3 作者:Rick Strahl 翻译:精致码农-王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知 ...

  8. ASP.net Core 2.2中Jwt验证的使用方法及在微信小程序上应用

    文章目录 Jwt简单介绍 什么是Jwt Jwt安全吗 在 ASP.NET Core中使用Jwt 授权和认证 三步走代码例子 生成Jwt 编辑授权策略 在StartUp中配置 添加特性 客户端使用 测试 ...

  9. ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

    本文我们来探讨下JWT VS Session的问题,我们可直接抛出问题:使用客户端存储的JWT比服务端维持Session更好吗? 既然要比较JWT VS Session,那我们就得知道为何需要JWT和 ...

  10. ASP.NET Core Web Api之JWT(一)

    最近沉寂了一段,主要是上半年相当于休息和调整了一段时间,接下来我将开始陆续学习一些新的技能,比如Docker.Jenkins等,都会以生活实例从零开始讲解起,到时一并和大家分享和交流.接下来几节课的内 ...

最新文章

  1. CYQ学习主要摘要4
  2. iOS----------拨打电话的3种方式
  3. 目前的计算机聪原理上讲,计算机组成原理-第23-24讲(第7章)+课件.ppt
  4. python打印log重复问题
  5. day1---python的基础特性
  6. 宣布降低Windows Azure Storage的定价
  7. ionic3 cordova ionic-native插件
  8. 线性表的顺序存储的基本操作
  9. Linux下使用Iptraf进行网络流量的分析
  10. python竖着输出编码_在Python中使用管道标准输出时设置正确的编码
  11. 酷炫的VR选座,阿里大麦背后的技术堪称豪华
  12. 怎么使用水经注万能地图下载器制作百度个性化建筑地图
  13. 「一本通 4.5 例 1」树的统计(树链剖分)
  14. AD PCBlayout 总结
  15. Deprecated: Function eregi() is deprecated in ……【解决方法】
  16. python读取邮箱邮件_Python读取我的outlook邮箱并分析邮件
  17. u盘服务器安装win7系统安装教程视频教程,小白U盘安装win7系统教程
  18. Python学习随笔:PyCharm的错误检测使用及调整配置减少错误数量
  19. 考研面试php,考研复试 | 盘点:这些院校已公布2019考研复试内容
  20. 古代情感诗词top100

热门文章

  1. Mastering KVM Virtualization:第二章 KVM内部原理
  2. DB2 日期时间函数
  3. mac easy_install 安装插件失败
  4. 黑白世界,感受不同的旅行...
  5. Ubuntu Server 命令行下的默认语言 中文乱码
  6. Linux远程软件xshell的使用
  7. C++回顾day01---C++对C的增强
  8. Dependency injection in ASP.NET Core
  9. ViewPager Indicator的使用方法
  10. 关于RESTful名字的含义