.Net Core WebApi 使用 JWT 验证身份
.h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px }
一、注册身份验证服务
StartUp.ConfigureServices()
//策略授权
services.AddAuthorization(options =>
{
options.AddPolicy("Admin", po => po.RequireRole("Admin"));
options.AddPolicy("Client", policy => policy.RequireRole("Client"));
options.AddPolicy("Systems", policy => policy.RequireRole("Admin", "System", "Client"));
}); //JWT 身份验证
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey)),
ValidateAudience = true,
ValidAudience = setting.Audience,
ValidateIssuer = true,
ValidIssuer = setting.Issuer,
ClockSkew = TimeSpan.Zero,
ValidateLifetime = true,
RequireExpirationTime = true
};
options.Events = new JwtBearerEvents
{
OnChallenge = context =>
{
//跳过所有默认的逻辑
context.HandleResponse();
var result = new
{
status = 401,
msg = "无效的Token",
err = "无效的Token"
};
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Response.ContentType = "application/json";
context.Response.WriteAsync(JsonConvert.SerializeObject(result));
return Task.CompletedTask;
}
};
});
二、添加认证中间件(官方定义)
StartUp.Configure()
//这里注意 一定要在 UseMvc前面,顺序不可改变
app.UseAuthentication();
app.UseMvc();
三、设置Controller访问权限
将需要身份验证才可访问的 API 增加验证 [Authorize] ,如果允许匿名访问 ,添加 [AllowAnonymous]
[Route("api/[controller]")]
//[ApiExplorerSettings(IgnoreApi = true)]//awagger忽略当前Api
//[Authorize(Roles = "Admin")] //只允许 用户 Role 是 Admin 可以访问
//[Authorize] //任何登陆的用户都可以访问
[Authorize(Policy = "Admin")] //对应 services.AddAuthorization 定义的策略名
public class EmployeeController1 : Controller
{
/// <summary>
/// 获取所有员工
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ResultData<IList<Employee>>> Get()
{
var data = await Task.Run(() => GetSourceEmployees());
var result = new ResultData<IList<Employee>>
{
Code = (int)ResultCodeEnum.SUCCESS,
Msg = "成功",
Data = data
};
return result;
} /// <summary>
/// 根据Id 获取员工
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[AllowAnonymous] //允许匿名访问
public async Task<ResultData<Employee>> Get(int id)
{
var result = new ResultData<Employee>
{
Code = (int)ResultCodeEnum.SUCCESS,
Msg = "成功",
}; var employees = await Task.Run(() => GetSourceEmployees());
var data = employees.FirstOrDefault(l => l.Id == id);
if (data != null)
{
result.Code = (int)ResultCodeEnum.DATA_NULL;
result.Msg = "找不到所需数据";
}
else
{
result.Code = (int)ResultCodeEnum.SUCCESS;
result.Msg = "成功";
result.Data = data;
}
return result;
} [NonAction]
private IList<Employee> GetSourceEmployees()
{
IList<Employee> employees = new List<Employee>();
employees.Add(new Employee
{
Address = "北京市朝阳公园",
Gender = 1,
Id = 1,
Mobile = "16578976589",
Name = "张三"
});
employees.Add(new Employee
{
Address = "批量添加",
Gender = 2,
Id = 2,
Mobile = "16897623407",
Name = "测试员工-001"
});
return employees;
}
}
四、创建Token
[Route("api/[controller]")]
[ApiController]
public class TokenController : ControllerBase
{
JwtSettings setting;//Token 配置信息
IMerchantRepository _merchantRepository; //IOptions<JwtSettings> 是在 appsetting.json 的配置项
//需要提前在 StartUp.ConfigureServices注册
public TokenController(IOptions<JwtSettings> jwtSettings, IMerchantRepository merchantRepository)
{
setting = jwtSettings.Value;
_merchantRepository = merchantRepository;
} [HttpGet]
public async Task<IActionResult> Get(string appid, string appsecret)
{
try
{
var merchants = await _merchantRepository.LoadAll();
var merchant = merchants.FirstOrDefault(l => l.AppId == appid && l.AppSecret == appsecret);
if (merchant == null)
{
return new JsonResult(new
{
status = 400,
msg = "无效的用户",
token = string.Empty
}); ;
} var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, merchant.Name));
var roles = merchant.Roles.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < roles.Length; i++)
{
//添加用户的角色
claims.Add(new Claim(ClaimTypes.Role, roles[i]));
} //SecretKey 必须>= 16位
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//设置 token 生成元素
var token = new JwtSecurityToken(
issuer: setting.Issuer,
audience: setting.Audience,
claims: claims,
notBefore: DateTime.Now,
expires: DateTime.Now.AddSeconds(100),
signingCredentials: creds);
var result = new JwtSecurityTokenHandler().WriteToken(token);
return new JsonResult(new
{
status = 200,
msg = "成功",
token = result
});
}
catch (Exception ex)
{
return new JsonResult(new
{
status = 500,
msg = "服务器开小差了",
err = ex.Message
});
}
}
}
五、测试
1、直接访问 /api/values,出现以下提示
2、访问 /api/values/1 可正常访问
3、请求 /api/token,然后添加到 /api/values 的 Headers 再次访问
.Net Core WebApi 使用 JWT 验证身份的更多相关文章
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- .NET Framework 中对webapi进行jwt验证
最近在项目中对webapi进行了jwt验证,做一个记录 有关于jwt生成和验证token的操作全部记录在jwthelper.cs文件中: /// <summary> /// 授权JWT类 ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- .Net Core官方的 JWT 授权验证
什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...
- webapi中使用token验证(JWT验证)
本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...
- .net core webapi jwt 更为清爽的认证
原文:.net core webapi jwt 更为清爽的认证 我的方式非主流,控制却可以更加灵活,喜欢的朋友,不妨花一点时间学习一下 jwt认证分为两部分,第一部分是加密解密,第二部分是灵活的应用于 ...
- .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
.net core webapi jwt 更为清爽的认证 后续:续期以及设置Token过期 续期: 续期的操作是在中间件中进行的,续期本身包括了前一个Token的过期加发放新的Token,所以在说续 ...
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- 如何在启用JWT Token授权的.NET Core WebApi项目中下载文件
背景 前几天,做项目的时候遇到一个文件下载的问题.当前系统是一个前后端分离的项目,前端是一个AngularJs项目, 后端是一个.NET Core WebApi项目.后端的Api项目使用了Jwt To ...
- 使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证
使用ASP.NET Identity 实现WebAPI接口的Oauth身份验证 目前WEB 前后端分离的开发模式比较流行,之前做过的几个小项目也都是前后分离的模式,后端使用asp.net weba ...
随机推荐
- Rust 错误处理
rust 处理错误,不使用 try catch, 而是使用 Result<T, E>. 简单的处理rust错误 在各种关于rust错误处理的文档中,为了解释清楚其背后的机制,看着内容很多, ...
- WPF使用Shape实现复杂线条动画
看到巧用 CSS/SVG 实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果.ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合 MASK 实现 ...
- Linux 提权-Sudo_1
本文通过 Google 翻译 Sudo Part-1 – Linux Privilege Escalation - Juggernaut-Sec 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词 ...
- sass @extend(继承)指令详解
在设计网页的时候常常遇到这种情况:一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式. 通常会在 HTML 中给元素定义两个 class,一个通用样式,一个特殊样式. 普通CSS的实现 接下 ...
- Instsrv.exe 与 Srvany.exe 安装Windows服务
原理:Instsrv.exe可以给系统安装和删除服务 Srvany.exe可以让exe程序以服务的方式运行(Srvany只是exe注册程序的服务外壳,可以通过它让我们的程序以SYSTEM账户活动,随电 ...
- Flask简单部署至kubernetes
安装Kubernetes.Docker Kubernetes.Docker安装教程 项目地址 Github Flask flask run.py from flask import Flask imp ...
- golang开发 gorilla websocket的使用
很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的.也是最简单的socket服务就 ...
- Objetive-C 属性和线程安全
一.接上一篇<nonatomic 带来的线程安全问题>,这里继续详细讨论属性各种类型与线程安全的关系 1)影响线程安全的属性类型,nonatomic,atomic,weak @proper ...
- iOS开发环境theos开发环境搭建与介绍
iOS开发环境theos开发环境搭建与介绍 标签(空格分隔): 越狱开发-第一篇 1. 环境准备 一台Mac,本人的机器是MacBook Air (13-inch, Mid 2013),系统是10.1 ...
- NOIP模拟61
T1 交通 解题思路 把环视为点,对于原图中每一个点的两条入边以及两条出边分别连边. 优于保证了原图中每个点出入度都是 2 因此新图中一定由若干个偶数环所组成的. 并且对于环中一定是只能间隔着选点,因 ...