.NET Framework 中对webapi进行jwt验证
最近在项目中对webapi进行了jwt验证,做一个记录
- 有关于jwt生成和验证token的操作全部记录在jwthelper.cs文件中:
/// <summary>
/// 授权JWT类
/// </summary>
public class JwtHelper
{
public readonly string SecretKey = System.Configuration.ConfigurationManager.AppSettings["SecretKey"];
public readonly string AppId = System.Configuration.ConfigurationManager.AppSettings["AppId"];
public readonly string AppKey = System.Configuration.ConfigurationManager.AppSettings["AppKey"];
/// <summary>
/// 创建Token 这里面可以保存自己想要的信息
/// </summary>
/// <param name="user_id"></param>
/// <param name="mobile"></param>
/// <returns></returns>
public string CreateToken(string user_id)
{
// 1. 定义需要使用到的Claims
var claims = new Claim[]
{
new Claim("user_id", user_id),
/* 可以保存自己想要信息,传参进来即可
new Claim("limit", "limit"),
*/
}; // 2. 从 appsettings.json 中读取SecretKey
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey)); // 3. 选择加密算法
var algorithm = SecurityAlgorithms.HmacSha256; // 4. 生成Credentials
var signingCredentials = new SigningCredentials(secretKey, algorithm); // 5. 根据以上,生成token
var jwtSecurityToken = new JwtSecurityToken(
issuer: AppId, //Issuer
audience: AppKey, //Audience
claims: claims, //Claims,
notBefore: DateTime.Now, //notBefore
expires: DateTime.Now.AddHours(1), //expires
signingCredentials: signingCredentials //Credentials
); // 6. 将token变为string
var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); return token;
} /// <summary>
/// 根据token反向解析
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public string GetInfoFromToken(string token = null)
{
if (token is null || token == "")
return null; string tokenStr = token.Replace("Bearer ", ""); var handler = new JwtSecurityTokenHandler();
// string tokenStr = token;
var payload = handler.ReadJwtToken(tokenStr).Payload; var claims = payload.Claims; var userid = claims.First(claim => claim.Type == "user_id")?.Value;
return userid;
} /// <summary>
/// 从Token中获取用户身份
/// </summary>
/// <param name="token"></param>
/// <param name="securityKey">securityKey明文,Java加密使用的是Base64</param>
/// <returns></returns>
public ClaimsPrincipal GetPrincipal(string token)
{
try
{
string securityKey = SecretKey;
token = token.Replace("Bearer ", "");
var handler = new JwtSecurityTokenHandler();
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey)),
ValidateLifetime = false
};
return handler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
}
catch (Exception ex)
{ return null;
}
} /// <summary>
/// 校验Token
/// </summary>
/// <param name="token">token</param>
/// <returns></returns>
public bool CheckToken(string token)
{
var principal = GetPrincipal(token);
if (principal is null)
{
return false;
}
return true;
}
2. 控制器中添加获取token的方法
/// <summary>
/// 获取Token
/// </summary>
/// <returns></returns>
[System.Web.Http.HttpGet]
public async Task<string> GetToken(string userid)
{
//参数验证等等....
if (string.IsNullOrEmpty(userid))
{
return await Task.FromResult("参数异常!");
}
//这里可以连接数据库做账号密码验证
//这里可以做Redis缓存验证等等
//这里获取Token
var token = await Task.Run(() => { return _jwt.CreateToken(userid); });
return token;
}
根据该访问获取到token
2. 自定义SaveImgAttribute,继承ActionFilterAttribute过滤器并重写OnActionExecuting()方法
public class SaveImgAttribute : ActionFilterAttribute
{ public readonly string SecretKey = System.Configuration.ConfigurationManager.AppSettings["SecretKey"];
public readonly string AppId = System.Configuration.ConfigurationManager.AppSettings["AppId"];
public readonly string AppKey = System.Configuration.ConfigurationManager.AppSettings["AppKey"]; // 调用方法前
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
Jwt.JwtHelper _jwt = new Jwt.JwtHelper();
var token = "";
if (actionContext.HttpContext.Request.Headers.AllKeys.Contains("Authorization"))
{
int index = actionContext.HttpContext.Request.Headers.AllKeys.Select((a, i) => i).Where(i => actionContext.HttpContext.Request.Headers.AllKeys[i] == "Authorization").FirstOrDefault();
token = actionContext.HttpContext.Request.Headers[index];
}
if (token == null || token == "")
{
var Auth = new
{
Status = 401,
Message = "身份验证失败"
};
actionContext.Result = new ContentResult
{
ContentType = "application/json",
Content = JsonConvert.SerializeObject(Auth)
};
return;
}
bool isOK = _jwt.CheckToken(token);
if (!isOK)
{
var Auth = new
{
Status = 401,
Message = "身份验证失败"
};
actionContext.Result = new ContentResult
{
ContentType = "application/json",
Content = JsonConvert.SerializeObject(Auth)
}; return; }
var userid = _jwt.GetInfoFromToken(token); base.OnActionExecuting(actionContext);
} }
3. 在控制器方法上加上[SaveImg]特性即可,每次调用对应方法的时候都会在SaveImgAttribute中进行 token验证
[SaveImg]
[System.Web.Http.HttpPost]
public async Task<JsonResult> SaveFileToOSS([FromBody] RequestBody request)
{.....}
将GetToken()获取到的token添加到http请求头中(key:Authorization)(value:Bearer+空格+token)再进行对应方法的请求
.NET Framework 中对webapi进行jwt验证的更多相关文章
- webapi中使用token验证(JWT验证)
本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...
- WebApi中关于base64和jwt的联合验证
用到了如鹏的代码 jwt验证 public class MyAuthoFilterPostOrgInfoAttribute: AuthorizationFilterAttribute { public ...
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- 在 SpringBoot 项目中简单实现 JWT 验证
使用 SpringBoot 提供 api 的时候,我更喜欢使用 jwt 的方式来做验证.网上有会多 Spring Security 整合 jwt 的,也有 Shiro 整合 jwt 的,感觉有点复杂. ...
- .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...
- WebApi使用JWT认证(一)
这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...
- WebApi使用JWT认证(二)
这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...
- WebAPI ModelValidata(模型验证)——DataAnnotations 解析
爱做一个新的项目,在该项目中的 WebAPI 中对数据的验证用到了 ModelValidata, 以前也没有用到过,也不是很熟悉,在查看了一些资料和代码后稍有了解,这里记录下来. 这里主要介绍的是 S ...
- 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇
之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...
随机推荐
- for循环-while循环
for循环 循环语句1--for for循环语句格式: for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ } 执行流程 执行顺序:①②③④>②③④>②③④-②不满足为止 ...
- 【.NET 8】ASP.NET Core计划 - 支持更完善的AOT发布
.NET7.0刚发布不久,.NET社区开始了.NET8.0的开发,重心重新回到了新功能的迭代. 我们知道在.NET7.0中一个令人激动的特新就是支持了NativeAOT,我们可以通过NativeAOT ...
- wsl 网络探究
省流:wsl2能否固定ip地址? - 豆腐干的回答 - 知乎 https://www.zhihu.com/question/387747506/answer/2764445888 割--------- ...
- 工具-使用org.openjdk.jol查看对象在内存中的布局
1 添加依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core& ...
- JavaScript 中的 apply、call、bind
在 JavaScript 中,apply.call.bind 是三个与函数调用相关的方法,它们都允许你在调用函数时手动设置函数的上下文(即 this 指向). 1.apply 方法:apply 方法允 ...
- PHP封装自定义函数function
最近一直在看PHP教程,毕竟懂点PHP语言还是不错的选择,起初是准备制作一个三文件夹内关键词组合长尾关键词,然后用PHP做一个全站的动态聚合页面的一个PHP插件,不负有心人啊!已写好,稍晚整理会在资源 ...
- GetShell 之:利用 SQLServer GetShell
GetShell 之:利用 SQLServer GetShell 目录 GetShell 之:利用 SQLServer GetShell 1 SQLServer 基础操作 2 SQLServer 利用 ...
- Vulhub 漏洞学习之:Couchdb
Vulhub 漏洞学习之:Couchdb 目录 Vulhub 漏洞学习之:Couchdb 1 Couchdb 垂直权限绕过漏洞(CVE-2017-12635) 1.1 漏洞利用过程 2 Couchdb ...
- Art of Illusion 一款**的开源 3D 建模和渲染软件
原文地址:https://www.mvrlink.com/artofillusion/ Art of Illusion 是一个免费的开源 3D 建模和渲染工作室.它的许多功能可与商业程序中的功能相媲美 ...
- LeetCode-1220 统计元音字母序列的数目
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-vowels-permutation 题目描述 给你一个整数 n,请你帮忙统计一下我们 ...