每个新技术权限验证都有一套机制,之前项目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. .Net配置Ajax跨域访问

    1.在web.config文件中的 system.webServer 节点下 增加如下配置 <httpProtocol> <customHeaders> <add nam ...

  2. 松软科技Web课堂:JavaScript 异常

    JavaScript 错误 - Throw 和 Try to Catch try 语句使您能够测试代码块中的错误. catch 语句允许您处理错误. throw 语句允许您创建自定义错误. final ...

  3. ArcGIS JS 4加载第三方矢量切片

        现在矢量切片越来越普及,对于地图渲染能更轻更快.ArcGIS JS 4.13可以实现加载第三方矢量切片,以下为代码示例,最下方是我之前切的建筑物数据.     当切片大小在1M左右,加载效果还 ...

  4. C语言基于NIOSII的软件开发及流水灯设计

    一.Quartus II 12.1 (32-Bit)进行硬件设计 1.所需要的系统元器件组成 2.系统电路图 二.Nios II 12.1 Software Build Tools for Eclip ...

  5. 安装SDK 6.0(二)

    2==>安装SDK 6.0 打开安卓Android Studio 出现 Unable to access Android SDK add-on list 点击 Cancal 在点击Cancel ...

  6. Spring Cloud系列:不重启eureka,清除down掉的服务

    场景描述 做项目的时候,我的服务改了个ip,然后重新启动后,原ip的服务down掉了,但是没有清楚掉,还在上面,导致我用swagger测试的时候,访问不到真正up的程序.重启eureka又不划算,于是 ...

  7. JS---体验DOM操作

    体验DOM操作 1. <!--html代码--> <input type="button" value="弹框" onclick=" ...

  8. asp.net允许跨域配置web.config

    <configuration> <system.webServer> <modules> <add name="CultureAwareHttpMo ...

  9. Auto入门 之 常用概念

    1.SEMI (Semiconductor Equipment And Materials International)  国际半导体设备与材料产业协会 2.SECS SECS协议是基于RS-232或 ...

  10. Linux下安装及使用mysql

    (注:本人在centos7进行的安装及使用) 1.安装wget yum install wget 2.下载mysql安装包 wget http://repo.mysql.com/mysql57-com ...