.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验证失败",经过检查(用生成日志的 ...
随机推荐
- Python之闭包and装饰器
闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...
- 浅析 Java 与 C++ 的垃圾回收机制
Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...
- 升级sharepoint2013遇到的坑
现在要将sharepoint2010,ProjectServer2010升级到2016的版本,需要先升级到2013的版本. 按照官方文档,瞎搞将sharepoint2010升级到2013的版本,中间出 ...
- nfs 所有的版本的 RFC 整理; nfs 所有版本对比;
下面是针对 nfs 所有的版本,我们可以通过不同的RFC 进行详细看其RFC的细节来进行对比: 下面是备忘一些NFS RFC 的链接: https://datatracker.ietf.org/doc ...
- kibana的query string syntax 笔记
kibana的query string syntax 并不是 Query String Query,只能说类似.kibana的 Lucene query string syntax(es的query ...
- 做了这么久的程序员,你知道为什么会有 Lambda 表达式吗?
Java8 有一些新的特性,今天老顾给大家分享一下关于 Lambda 表达式的由来,一开始感觉 Lambda 可读性蛮差的,不知道 为什么 Java8 会出来这个表达式?既然大佬们推出来,肯定是有原因 ...
- MySql数据库之数据库基础命令
继续上篇博客所说到的,使用命令玩转MySql数据库. 在连接数据库时,我们需要确定数据库所在的服务器IP,用户名以及密码.当然,我们一般练习都会使用本地数据库,那么本地数据库的连接命令如下: mysq ...
- 【CF528D】Fuzzy Search
Problem Description 你有一个长度为 \(n\) 的串 \(S\),以及长度为 \(m\) 的串 \(T\). 现给定一个数 \(k\) ,我们说 \(T\) 在 \(S\) 的位置 ...
- U8隐藏的配置项
数据表:accinformation 我使用了一个是否自动审核库存生成的单据,看看是否能解决调拨单自动生成的其他出入库单自动审核的功能.
- .NET面试题解析(9)-SQL语言基础及数据库基本原理
见面试题 1. 索引的作用?她的优点缺点是什么? 2. 介绍存储过程基本概念和 她的优缺点? 3. 使用索引有哪些需要注意的地方? 4. 索引碎片是如何产生的?有什么危害?又该如何处理? 5. 锁的目 ...