.netcore2.1 使用IdentityServer4 生成Token验证
每个新技术权限验证都有一套机制,之前项目WebApi接口权限验证用的是Owin做为权限验证,而.netcore权限限制使用的是IdentityServer4,采用JWT的方法验证token.
- 首先使用Guget包管理添加IdentityServer4包的引用,如图
- 生成token方法
/// <summary>
/// 生成token
/// </summary>
/// <param name="userId"></param>
/// <param name="key">JwtKey</param>
/// <returns></returns>
public static string GenerateToken(string userId, string key)
{
var tokenHandler = new JwtSecurityTokenHandler();
var keyBytes = System.Text.Encoding.Default.GetBytes(key);
var authTime = DateTime.UtcNow;
var expireaAt = authTime.AddHours();//token过期时间
var timestamp = TimeStamp.GenerateTimeStamp(authTime);//生成日间戳
var sign = MyUnity.GetMd5Upper32((userId + "&" + timestamp + "&" + key).ToUpper());
var tokenDescriptor = new SecurityTokenDescriptor()
{
Subject = new ClaimsIdentity(new Claim[] {
new Claim(JwtClaimTypes.Audience,"api"),
new Claim(JwtClaimTypes.Issuer,"hengfeng"),
new Claim(JwtClaimTypes.Id,userId),
new Claim("timestamp",timestamp),
new Claim("sign",sign),
}),
Expires = expireaAt,
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(keyBytes),
SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return tokenString;
}
- 创建JwtTokenFilter过滤器
public class JwtTokenFilter : ActionFilterAttribute
{
private readonly IConfiguration _config;
public JwtTokenFilter(IConfiguration configuration)
{
_config = configuration;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
try
{
var token = context.HttpContext.Request.Headers["token"];
var tokenHandler = new JwtSecurityTokenHandler();
var jwtSecurityToken = tokenHandler.ReadJwtToken(token);
var claims = jwtSecurityToken.Claims;
var userid = claims.FirstOrDefault(m => m.Type == "id").Value;
var sign = claims.FirstOrDefault(m => m.Type == "sign").Value;
var expireaAt = claims.FirstOrDefault(m => m.Type == "exp").Value;
var key = _config["jwt_key"];
var timestamp = claims.FirstOrDefault(m => m.Type == "timestamp").Value;
var sign_new = MyUnity.GetMd5Upper32((userid + "&" + timestamp + "&" + key).ToUpper());
if (!sign_new.Equals(sign, StringComparison.InvariantCultureIgnoreCase))
{
context.Result = new JsonResult( "账号未登录");
}
else
{
var expiresTime = TimeStamp.ConvertIntDateTime(expireaAt);
if ((DateTime.Now - expiresTime).Minutes > )
{
context.Result = new JsonResult("账号Token失效");
}
}
}
catch (Exception ex)
{
context.Result = new JsonResult(ex.ToString());
}
}
}
- 在使用控制器中添加 [ServiceFilter(typeof(JwtTokenFilter))] 特性
// GET: api/Default/5
[HttpGet("{id}", Name = "Get")]
[ServiceFilter(typeof(JwtTokenFilter))]
public string Get(int id)
{
return "value";
}
- 如果该控制器不需要验证token,加上允许匿名访问特性即可
[HttpPost]
[AllowAnonymous]
public void Post([FromBody] string value)
{ }
最后:注意登录成功后,需要把生成的token返回给前端,前端再一次请求系统其它需要验证token的接口中,在head中加上token值。
用到的加密算法
/// <summary>
/// Md5 16位长度
/// </summary>
/// <param name="sValue"></param>
/// <returns></returns>
public static string GetMd5Upper16(string sValue)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string s = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(sValue)), , );
s = s.Replace("-", "").ToUpper();
return s;
}
/// <summary>
/// Md5 32位长度
/// </summary>
/// <param name="sValue"></param>
/// <returns></returns>
public static string GetMd5Upper32(string sValue)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string s = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(sValue)));
s = s.Replace("-", "").ToUpper();
return s;
}
生成 十位的时间戳
/// <summary>
/// 获取十位的时间戳
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string GenerateTimeStamp(DateTime dt)
{
// Default implementation of UNIX time of the current UTC time
TimeSpan ts = dt.ToUniversalTime() - new DateTime(, , , , , , );
return Convert.ToInt32(ts.TotalSeconds).ToString();
}
.netcore2.1 使用IdentityServer4 生成Token验证的更多相关文章
- Python itsdangerous 生成token和验证token
代码如下 class AuthToken(object): # 用于处理token信息流程: # 1.更加给定的用户信息生成token # 2.保存生成的token,以便于后面验证 # 3.对用户请求 ...
- 【Python】Django【邮箱验证】 后端验证如何生成 token加密验证码 与如何解码!!!!
1.生成token验证码方案 ,使用itsdangerous 大宝剑, 可以序列化出验证码,并能设置过期时间 安装 itsdangerous pip install itsdangerous ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- [Python]token的生成及验证
hmac模块(仅在python3中可以使用) 简介: HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出. 典型应用: HMAC的一 ...
- Java实现token的生成与验证-登录功能
一.token与cookie相比较的优势1.支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的: 2.无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而 ...
- java中token的生成和验证
package com.zjn.token; /** * token编码工具类 * @author ouyangjun */ public class TokenEncryptUtils { // 编 ...
- 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...
- 【JWT】JWT+HA256加密 Token验证
目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...
- php:微信公众号token验证失败原因、验证码显示不出来的问题
ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ...
随机推荐
- JSON2ABAPType:根据JSON数据结构生成ABAP类型定义
一图表明本文将要介绍的工具: JSON是常见的数据格式,经常用于接口开发.ABAP开发者通常使用/ui2/cl_json来把JSON数据转换为相应的ABAP类型. 在转换前,必须要定义相应的ABAP类 ...
- 数据库学习笔记day03
创建两个表,一个名为emp,一个名为dept,并且插入数据 create table emp(empno number(4,0),ename varchar2(10),job varchar2(9), ...
- Sql: Oracle paging
--书分类目录kind --涂聚文 Geovin Du create table geovindu.BookKindList ( BookKindID INT PRIMARY KEY, BookKin ...
- SpringMVC 自定义参数解析器.
一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...
- 一文读懂分布式任务调度平台XXL-JOB
本文主要介绍分布式任务调度平台XXL-JOB(v2.1.0版本),包括功能特性.实现原理.优缺点.同类框架比较等 基本介绍 项目开发中,常常以下场景需要分布式任务调度: 同一服务多个实例的任务存在互斥 ...
- python高阶函数——返回函数(闭包)
首先,来看一个一般意义的求和: >>> def cal_sum(*args): ... sum = 0 ... for i in args: ... sum = sum + i .. ...
- MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题
排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 By:授客 QQ:1033553122 测试环境 win10 MySQL 5.7 问题描述: 执行类似以下mysql查询, SEL ...
- oracle 架构图
- 使用navicat连接只开放内网ip连接的数据库
无法通过Navicat来连接MySQL,比较常见的两种问题? 服务器上自己安装的MySQL数据库,且未开通外网登录账号 直接购买服务商的MySQL数据库不创建公网访问,只有内网访问 背景: 公司数 ...
- C# 让你解决方案乱七八糟的DLL放入指定文件夹
嗯,大家的解决方案可能会有许多dll,这样不美观,而且也麻烦. 很多小白都不知道如何将这些dll放到如自己程序的bin文件夹下. 本渣今天来试着将dll复制到指定的文件夹下~ 比如我之前做的一个Win ...