Asp.NetCore3.1 WebApi 使用Jwt 授权认证使用
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 授权认证使用的更多相关文章
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- ASP.NET Core 中jwt授权认证的流程原理
目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- Vue学习使用系列九【axiox全局默认配置以及结合Asp.NetCore3.1 WebApi 生成显示Base64的图形验证码】
1:前端code 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta char ...
- Asp.NetCore3.1 WebApi 获取配置json文件中的数据
下面只是做一个简单的测试: 1:定义好appsetting.Json文件的配置信息如下: { "Logging": { "LogLevel": { " ...
- 关于ASP.Net Core Web及API身份认证的解决方案
6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自 ...
- 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 如何使用Swagger为.NET Core 3.0应用添加JWT授权说明文档
简介 本教程采用WHY-WHAT-HOW黄金圈思维模式编写,黄金圈法则强调的是从WHY为什么学,到WHAT学到什么,再到HOW如何学.从模糊到清晰的学习模式.大家的时间都很宝贵,我们做事前先想清楚为什 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
随机推荐
- ceph SSD HDD分离与openstack调用
本例子ceph L版本采用的是filestore,而不是bluestore. 一.查看class类型,只有一个hdd,.Luminous 为每个OSD添加了一个新的属性:设备类.默认情况下,OSD将根 ...
- python实现将大文件夹分割成多个子文件夹
楼主用的linux,一旦数据达到几万,文件夹打开就会变卡,同时也方便同时分工协作,便于git管理,写了个将大文件夹分割成多个小文件夹的脚本 如操作文件夹:img,脚本不破坏img的数据,创建img_1 ...
- Java使用IO流读取TXT文件
通过BufferedReader读取TXT文件window系统默认的编码是GBK,而IDE的编码多数为UTF-8,如果没有规定new InputStreamReader(new FileInputSt ...
- 全国计算机等级考试二级笔试样卷Java语言程序设计
一.选择题((1)-(35)每小题2分,共70分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分. (1)下列选项中不符合良好程 ...
- 解决SELinux阻止Nginx访问服务
在使用 yum 安装 nginx 后可能会出现配置完成后却无法访问的问题,查看 audit.log 会发现类似于以下的错误信息 出现此问题的原因是 SELinux 基于最小权限原则默认拦截了 Ngin ...
- 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点
题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...
- 「疫期集训day1」无言
正式集训第一天,感觉没啥特别大的感受,无非是奥赛时间延长了,效率提高了,身外事少了 当然不止这些 感受1:有些曾经被恶的题现在仍然在恶心,例如昨天的farmcraft,今天的整数划分(和着多边形一块调 ...
- Docker-本地镜像发布到阿里云
1.先生成一个镜像 有两种发法:(1)写DockerFile (2)从容器创建一个新的镜像 docker commit [option] 容器ID 镜像名字:版本号 option 说明 :-a 作者 ...
- 基于tcp/udp协议的套接字通信
目录 一.套接字分类 二.套接字的工作流程 三.基于tcp协议的套接字 四.基于udp协议的套接字 一.套接字分类 1.基于文件类型的套接字家族:AF_UNIX 2.基于网络类型的套接字家族:AF_I ...
- MVC + EFCore 项目实战 - 数仓管理系统3 - 完成整体样式风格配置
上次课程我们新建了管理员的模板页. 本次我们就完善这个模板页,顺便加入样式和一些基本的组件,配置好整个项目的UI风格. 一.引入 共用的css和js文件 后端库用nuget, 前端库用libman ...