每个新技术权限验证都有一套机制,之前项目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验证的更多相关文章

  1. Python itsdangerous 生成token和验证token

    代码如下 class AuthToken(object): # 用于处理token信息流程: # 1.更加给定的用户信息生成token # 2.保存生成的token,以便于后面验证 # 3.对用户请求 ...

  2. 【Python】Django【邮箱验证】 后端验证如何生成 token加密验证码 与如何解码!!!!

    1.生成token验证码方案   ,使用itsdangerous    大宝剑, 可以序列化出验证码,并能设置过期时间 安装 itsdangerous pip install itsdangerous ...

  3. 利用jwt生成token,用于http请求身份验证

    前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...

  4. [Python]token的生成及验证

    hmac模块(仅在python3中可以使用) 简介: HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出. 典型应用: HMAC的一 ...

  5. Java实现token的生成与验证-登录功能

    一.token与cookie相比较的优势1.支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的: 2.无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而 ...

  6. java中token的生成和验证

    package com.zjn.token; /** * token编码工具类 * @author ouyangjun */ public class TokenEncryptUtils { // 编 ...

  7. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...

  8. 【JWT】JWT+HA256加密 Token验证

    目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...

  9. php:微信公众号token验证失败原因、验证码显示不出来的问题

    ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的 ...

随机推荐

  1. Python之闭包and装饰器

    闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...

  2. 浅析 Java 与 C++ 的垃圾回收机制

        Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...

  3. 升级sharepoint2013遇到的坑

    现在要将sharepoint2010,ProjectServer2010升级到2016的版本,需要先升级到2013的版本. 按照官方文档,瞎搞将sharepoint2010升级到2013的版本,中间出 ...

  4. nfs 所有的版本的 RFC 整理; nfs 所有版本对比;

    下面是针对 nfs 所有的版本,我们可以通过不同的RFC 进行详细看其RFC的细节来进行对比: 下面是备忘一些NFS RFC 的链接: https://datatracker.ietf.org/doc ...

  5. kibana的query string syntax 笔记

    kibana的query string syntax 并不是 Query String Query,只能说类似.kibana的 Lucene query string syntax(es的query ...

  6. 做了这么久的程序员,你知道为什么会有 Lambda 表达式吗?

    Java8 有一些新的特性,今天老顾给大家分享一下关于 Lambda 表达式的由来,一开始感觉 Lambda 可读性蛮差的,不知道 为什么 Java8 会出来这个表达式?既然大佬们推出来,肯定是有原因 ...

  7. MySql数据库之数据库基础命令

    继续上篇博客所说到的,使用命令玩转MySql数据库. 在连接数据库时,我们需要确定数据库所在的服务器IP,用户名以及密码.当然,我们一般练习都会使用本地数据库,那么本地数据库的连接命令如下: mysq ...

  8. 【CF528D】Fuzzy Search

    Problem Description 你有一个长度为 \(n\) 的串 \(S\),以及长度为 \(m\) 的串 \(T\). 现给定一个数 \(k\) ,我们说 \(T\) 在 \(S\) 的位置 ...

  9. U8隐藏的配置项

    数据表:accinformation 我使用了一个是否自动审核库存生成的单据,看看是否能解决调拨单自动生成的其他出入库单自动审核的功能.

  10. .NET面试题解析(9)-SQL语言基础及数据库基本原理

    见面试题 1. 索引的作用?她的优点缺点是什么? 2. 介绍存储过程基本概念和 她的优缺点? 3. 使用索引有哪些需要注意的地方? 4. 索引碎片是如何产生的?有什么危害?又该如何处理? 5. 锁的目 ...