1:导入NuGet包 Microsoft.AspNetCore.Authentication.JwtBearer

2:配置 jwt相关信息

3:在 startUp中

 public void ConfigureServices(IServiceCollection services){
#region JWT 认证
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
var jsonmodel = AppJsonHelper.InitJsonModel();
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jsonmodel.Issuer,// Configuration["JwtSetting:Issuer"],
ValidAudience = jsonmodel.Audience,// Configuration["JwtSetting:Audience"],
// IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSetting:SecurityKey"])),
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jsonmodel.TockenSecrete)),
// 默认允许 300s 的时间偏移量,设置为0即可
ClockSkew = TimeSpan.Zero
};
});
#endregion
} //注意需要放在addmvc上面 services.AddMvc(); public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthentication();//身份验证
app.UseAuthorization();// 授权
}

4:使用时在Controller /action 上打上特性 [Authorize]

可以单独在Action上打上特性[Authorize]  不需要检查授权认证的话打上特性: [AllowAnonymous]
两个特性类都在如下命名空间下:
using Microsoft.AspNetCore.Authorization;

5:难道后端返回的Tocken,可以在PostMan上面测试,和JWT.io官网上面来测试

6: 发送请求到后端,带上Tocken 如Get ://localhost:5000/user/login
Key value
Authorization Bearer qweTdfdsfsJhdsfd0.fdsfdsgfdsewDDQDD.fdsfdsg***

7:action上面的code

 [HttpPost, Route("Login")]
public ApiResult Login(personnel p)
{
ApiResult result = new ApiResult();
try
{
string tockenStr = ZrfJwtHelper.GetTocken(p);
result.data = tockenStr;
result.code = statuCode.success;
result.message = "获取成功!";
}
catch (Exception ex)
{
result.message = "查询异常:" + ex.Message;
}
return result;
} [HttpPost, Route("authTest")]
[Authorize]
[AllowAnonymous]// 跳过授权认证
public ApiResult authTest(string accesTocken)
{
ApiResult result = new ApiResult();
try
{
var info = ZrfJwtHelper.GetTockenInfo(accesTocken);
result.data = info;
result.code = statuCode.success;
result.message = "获取成功!";
}
catch (Exception ex)
{
result.message = "查询异常:" + ex.Message;
}
return result;
}

8:完整的Jwt代码封装

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZRFCoreTestMongoDB.Commoms
{
using Microsoft.AspNetCore.Http;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using ZRFCoreTestMongoDB.Model; /// <summary>
/// @auth fengge
/// </summary>
public class ZrfJwtHelper
{
/// <summary>
/// 生成Tocken
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public static string GetTocken(personnel p)
{
//读取配置文件获得Jwt的json文件信息
var model = AppJsonHelper.InitJsonModel();
string _issuer = model.Issuer;//分发者
string audience = model.Audience;//接受者
string TockenSecrete = model.TockenSecrete;//秘钥 //秘钥
var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TockenSecrete)), SecurityAlgorithms.HmacSha256);
// 設定要加入到 JWT Token 中的聲明資訊(Claims)
//var claims = new List<Claim>();
//// 在 RFC 7519 規格中(Section#4),總共定義了 7 個預設的 Claims,我們應該只用的到兩種!
////claims.Add(new Claim(JwtRegisteredClaimNames.Iss, issuer));
//claims.Add(new Claim(JwtRegisteredClaimNames.Sub, userInfo.UserId)); //Claim
var claims = new Claim[] {
new Claim(JwtRegisteredClaimNames.Sid,p.Uid),
new Claim(JwtRegisteredClaimNames.Iss,_issuer),
new Claim(JwtRegisteredClaimNames.Sub,p.Name),
new Claim("Guid",Guid.NewGuid().ToString("D")),
new Claim("Roleid",p.Roleid.ToString()),
new Claim("Age",p.Age.ToString()),
new Claim("BirthDay",p.BirthDay.ToString())
}; SecurityToken securityToken = new JwtSecurityToken(
issuer: _issuer,
audience: audience,
signingCredentials: securityKey,
expires: DateTime.Now.AddMinutes(),//过期时间
claims: claims
); return new JwtSecurityTokenHandler().WriteToken(securityToken);
} /// <summary>
/// 获取accessTocken
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string GetTockenString(HttpContext context)
{
return context != null ? context.Request.Headers["Authorization"].ToString() : "";
} /// <summary>
/// 解析Jwt生成的 Tocken
/// </summary>
/// <param name="accesTocken"></param>
/// <returns></returns>
public static TockenInfo GetTockenInfo(string accesTocken)
{
try
{
if (accesTocken.Contains("Bearer")) //防止前端传过来的tocken 为待了 Bearer 的字符串
{
accesTocken = accesTocken.Replace("Bearer ", "");
}
var tockHandler = new JwtSecurityToken(accesTocken);
TockenInfo info = new TockenInfo
{
// Age=tockHandler.Claims.FirstOrDefault(c=>c.Type==JwtRegisteredClaimNames.Email)
Uid = tockHandler.Claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Sid).Value,
Name = tockHandler.Claims.FirstOrDefault(c => c.Type ==JwtRegisteredClaimNames.Sub).Value,//在于自己来定义了,上面生成是和下面获取时Key要一致 Age = tockHandler.Claims.FirstOrDefault(c => c.Type == "Age").Value,
BirthDay = tockHandler.Claims.FirstOrDefault(c => c.Type == "BirthDay").Value,
Roleid = tockHandler.Claims.FirstOrDefault(c => c.Type == "Roleid").Value,
};
return info;
}
catch (Exception ex)
{
throw new Exception("解析Tocken时错误!");
}
}
}
public class TockenInfo
{
public string Uid { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public string BirthDay { get; set; }
public string Roleid { get; set; }
}
}

9:模型实体

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace ZRFCoreTestMongoDB.Model
{
using System.ComponentModel.DataAnnotations;
[Serializable]
public class personnel
{ [Required(ErrorMessage = "姓名必填")]
[StringLength(maximumLength: , ErrorMessage = "姓名最多是10个字符")]
[MinLength(, ErrorMessage = "姓名长度最少为两个字符")]
public string Name { get; set; } [Range(, , ErrorMessage = "年龄范围为:1-150")]
public int Age { get; set; }
[DataType(DataType.Date, ErrorMessage = "生日不学为日期格式,例如:1998-10-10")]
public DateTime BirthDay { get; set; } [Required(ErrorMessage = "密码必填")]
[StringLength(maximumLength: , MinimumLength = , ErrorMessage = "密码长度最多10位")]
public string Password { get; set; }
public int Roleid { get; set; }
public string Uid { get; set; }
}
}

10:配置内容:

11:测试效果

Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用的更多相关文章

  1. ASP.NET Core WebApi基于JWT实现接口授权验证

    一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...

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

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  3. ASP.NET Core系列:JWT身份认证

    1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...

  4. Vue学习使用系列九【axiox全局默认配置以及结合Asp.NetCore3.1 WebApi 生成显示Base64的图形验证码】

    1:前端code 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta char ...

  5. Asp.NetCore3.1 WebApi 获取配置json文件中的数据

    下面只是做一个简单的测试: 1:定义好appsetting.Json文件的配置信息如下: { "Logging": { "LogLevel": { " ...

  6. 关于ASP.Net Core Web及API身份认证的解决方案

    6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自 ...

  7. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  8. 如何使用Swagger为.NET Core 3.0应用添加JWT授权说明文档

    简介 本教程采用WHY-WHAT-HOW黄金圈思维模式编写,黄金圈法则强调的是从WHY为什么学,到WHAT学到什么,再到HOW如何学.从模糊到清晰的学习模式.大家的时间都很宝贵,我们做事前先想清楚为什 ...

  9. .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)

    上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...

随机推荐

  1. redis高级命令2

    主服务负责数据的写,从服务器负责客户端的高并发来读 创建主从复制 clone不能让上面的mac地址不能重复,IP地址也不能重复 122和123是从服务器,我们修改二者的配置文件 其中 192.168. ...

  2. 入门大数据---Spark_Streaming基本操作

    一.案例引入 这里先引入一个基本的案例来演示流的创建:获取指定端口上的数据并进行词频统计.项目依赖和代码实现如下: <dependency> <groupId>org.apac ...

  3. vue全家桶(2.6)

    3.9.滚动行为 设置滚动行为的作用是导航到新路由时,让页面滚动到你想要的位置. const router = new VueRouter({ routes: [...], scrollBehavio ...

  4. html+css快速入门教程(5)

    练习: 1.画盒子1 2.画盒子2 3.京东特色购物 4.京东发现好货 5.京东玩3c 7.3 定位 通过使用 position 属性,我们可以选择 3 种不同类型的定位,这会影响元素框生成的方式. ...

  5. eclipse在debug模式下鼠标移动到变量上不显示值的问题

    在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的: Window->Preferences->Java->Editor-> ...

  6. 【未完待续】MVC 之HTML辅助方法

    顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用, 在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用H ...

  7. Mybatis 报错

    Mybatis 报错 builder.BuilderException: Error parsing SQL Mapper Configuration Caused by: org.apache.ib ...

  8. Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  9. Docker镜像-删除镜像

    因为尝试使用新的镜像,对原来的镜像进行删除,报错如下: 意思就是在删除镜像之前,要先删除对应的docker.因为该image被对应的container引用,所以image删除失败. 显示所有状态的容器 ...

  10. centos-pip不存在安装失败的解决办法

    1.centos下安装pip失败 2.解决办法 需要先安装扩展源EPEL. EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL ...