最近在项目中对webapi进行了jwt验证,做一个记录

  1. 有关于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验证的更多相关文章

  1. webapi中使用token验证(JWT验证)

    本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...

  2. WebApi中关于base64和jwt的联合验证

    用到了如鹏的代码 jwt验证 public class MyAuthoFilterPostOrgInfoAttribute: AuthorizationFilterAttribute { public ...

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

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

  4. 在 SpringBoot 项目中简单实现 JWT 验证

    使用 SpringBoot 提供 api 的时候,我更喜欢使用 jwt 的方式来做验证.网上有会多 Spring Security 整合 jwt 的,也有 Shiro 整合 jwt 的,感觉有点复杂. ...

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

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

  6. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...

  7. WebApi使用JWT认证(一)

    这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...

  8. WebApi使用JWT认证(二)

    这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...

  9. WebAPI ModelValidata(模型验证)——DataAnnotations 解析

    爱做一个新的项目,在该项目中的 WebAPI 中对数据的验证用到了 ModelValidata, 以前也没有用到过,也不是很熟悉,在查看了一些资料和代码后稍有了解,这里记录下来. 这里主要介绍的是 S ...

  10. 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇

    之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...

随机推荐

  1. java 进阶P-3.3+P-3.4

    Array list的操作 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素.ArrayList 继承了 AbstractList , ...

  2. 论文翻译:2022_2022_TEA-PSE 2.0:Sub-Band Network For Real-Time Personalized Speech Enhancement

    论文地址:TEA-PSE 2.0:用于实时个性化语音增强的子带网络 论文代码: 引用: 摘要 个性化语音增强(Personalized speech enhancement,PSE)利用额外的线索,如 ...

  3. QGraphicsView, QGraphicsObject ,QQGraphicsSvgItem 图片接收鼠标事件 拖拉 收放

    由于项目要求,需要加载svg格式图片和pixmap图片,并根据指定坐标在图上进行勾画,并且对相应位置接收鼠标事件. -继承QGraphicsObject,实现加载pixmap的项 myimageite ...

  4. .NET为什么推荐它作为RabbitMQ消息队列的首选开发工具

    支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac. RabbitMQ作为一款主流的消息队列工具早已 ...

  5. 我不想再传递 nameof 了

    有的时候抛出一个异常,我们需要知道是哪个方法抛出的异常.那么,我们可以通过传递 nameof 来获取调用者的方法名.但是,感觉很烦,每次都要传递 nameof.那么,有没有更好的方法呢? Caller ...

  6. 你想知道的do{...}while(0)的作用,都在这里了

    0.引言         我们在嵌入式开发的过程中,经常可以碰到在一些宏定义或者是代码段中使用了do {...} while(0)的语句,从语义上理解,do {...} while(0)内的逻辑就只执 ...

  7. JZOJ 3447.摘取作物

    \(\text{Problem}\) 在一个矩阵里选数,每行最多选两个,每列最多选两个,最大会价值 \(n,m \le 30\) \(\text{Analysis}\) 对个这个限制如何实现? 跑费用 ...

  8. Windows 10系统设置多用户同时远程登录教程 and rdpwrap下载 and Win10多用户同时远程桌面的另类解决方案---支持1809和1909和2004版本V2.0

    转载简书: Windows 10系统设置多用户同时远程登录教程 - 简书 (jianshu.com) 转载github: 发布 ·stascorp/rdpwrap ·GitHub 转载csdn: Wi ...

  9. MySQL索引的基本理解

    之前一致以为索引就是简单的在原表的数据上加了一些编号,让查询更加快捷.后来发现里面还有更深的知识. 索引用于快速查找具有特定列值的行.如果没有索引,MySQL 必须从第一行开始,然后通读整个表以找到相 ...

  10. Docker安装和卸载(centos)

    Docker安装和卸载 一,已安装Docker,卸载Docker 1.方法一 sudo yum remove docker \ docker-client \ docker-client-latest ...