一、传统MVC验证Token

推荐(https://www.cnblogs.com/xiaobai123/p/9242828.html

自定义处理Jwt方式

1、新建JWT类

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web; namespace temp
{ public class Jwt
{ //参考自 阮一峰 jwt介绍 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html public static string SALT = "OXpcRP8jmCfMKumY"; /// <summary>
///
/// </summary>
/// <param name="ExraPayload">额外的信息</param>
/// <returns></returns>
public static string Create(Dictionary<string, object> ExraPayload)
{
var Header = new Dictionary<string, string>();
Header.Add("tp", "MD5");
var Payload = new Dictionary<string, object>(); //JWT 规定了7个官方字段,供选用。
Payload.Add("iss", "signBy"); //颁发人
Payload.Add("jti", Guid.NewGuid().ToString()); //jwt的id
Payload.Add("exp", System.DateTime.Now.AddMinutes());//过期时间
Payload.Add("nbf", System.DateTime.Now);//生效时间
Payload.Add("iat", System.DateTime.Now);//签发时间
Payload.Add("sub", "subject");//主题
Payload.Add("aud", "audience");//受众 foreach (var item in ExraPayload)
{
if (Payload.ContainsKey(item.Key))
{ throw new Exception($"{item.Key}键值已被占用 不能使用 ");
}
else
{
Payload.Add(item.Key, item.Value);
}
}
string base64Header = Base64Url(Newtonsoft.Json.JsonConvert.SerializeObject(Header));
string base64Payload = Base64Url(Newtonsoft.Json.JsonConvert.SerializeObject(Payload));
string tmp = base64Header + "." + base64Payload; string sign = Md5(tmp + SALT);//加盐,重要 return base64Header + "." + base64Payload + "." + sign;
} //校验是否合法,是否过期
public static bool Check(string token)
{
string base64Header = token.Split('.')[];
string base64Payload = token.Split('.')[];
string sign = token.Split('.')[];
string tmp = base64Header + "." + base64Payload;
var signCheck = Md5(base64Header + "." + base64Payload + SALT);
if (signCheck != sign)
{
return false;
}
var dic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(Base64UrlDecode(base64Payload));
if (Convert.ToDateTime(dic["exp"]) < System.DateTime.Now)
{
//过期了
return false; }
return true; }
//校验是否合法,是否过期
public static Dictionary<string, object> GetPayLoad(string token)
{ string base64Payload = token.Split('.')[]; var dic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(Base64UrlDecode(base64Payload)); return dic; } public static string Base64Url(string input)
{
//JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。
//Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。
string output = "";
byte[] bytes = Encoding.UTF8.GetBytes(input);
try
{
output = Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_').TrimEnd('='); }
catch (Exception e)
{
throw e;
}
return output;
}
public static string Base64UrlDecode(string input)
{
string output = ""; input = input.Replace('-', '+').Replace('_', '/');
switch (input.Length % )
{
case :
input += "==";
break;
case :
input += "=";
break;
}
byte[] bytes = Convert.FromBase64String(input);
try
{
output = Encoding.UTF8.GetString(bytes);
}
catch
{
output = input;
}
return output;
}
public static string Md5(string input, int bit = )
{ MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(input));
StringBuilder tmp = new StringBuilder();
foreach (byte i in hashedDataBytes)
{
tmp.Append(i.ToString("x2"));
}
if (bit == )
return tmp.ToString().Substring(, );
else
if (bit == ) return tmp.ToString();//默认情况
else return string.Empty; }
} }

2、请求测试

3、报错的

4、解决方案(第一点:console.要用,为了抓取输出应该用trace,第二点:用try 来解决token处理格式的问题)

一、传统MVC token验证方式的更多相关文章

  1. OAuth2.0和企业内部统一登录,token验证方式,OAuth2.0的 Authorization code grant 和 Implicit grant区别

    统一登录是个很多应用系统都要考虑的问题,多个项目的话最好前期进行统一设计,否则后面改造兼容很麻烦: cas认证的方式:新公司都是老项目,用的是cas认证的方式,比较重而且依赖较多,winform的项目 ...

  2. 在vue中使用后台提供 的token验证方式总结及使用方法

    token是相对会叫安全的使用暗码形式的数据传输,由后台产生,并且传输到前台,前台可以将保存,在前台每次发送请求的时候可以携带token,后台可以对token进行验证,通过验证的通过请求可以对数据进行 ...

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

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

  4. 基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, ...

  5. 我只知道一点非常简单的关于MVC的验证

    我只知道一些非常简单的关于MVC的验证 如题,我只知道一点非常简单的关于MVC的验证,所以如果您接触过MVC的验证,相信也就不用看了,这个且当作是学习笔记吧. 先小讲解一下他基本的五个从Model里打 ...

  6. Web APIs 基于令牌TOKEN验证的实现

    Web APIs 基于令牌TOKEN验证的实现 概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但 ...

  7. ASP.NET Web APIs 基于令牌TOKEN验证的实现(保存到DB的Token)

    http://www.cnblogs.com/niuww/p/5639637.html 保存到DB的Token 基于.Net Framework 4.0 Web API开发(4):ASP.NET We ...

  8. Spring MVC 数据验证——validate注解方式

    1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...

  9. ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式、错误信息提示、validate方法的背后

    ASP.NET MVC借助jQuery的验证机制,提供了一套从客户端到服务端异步验证的解决方案,通常情况下,用起来相当方便.但面对一些相对特殊的情况,可能会遇到验证失效的场景,比如在使用ajax动态异 ...

随机推荐

  1. 在spring的业务层获取request,response

    1.直接通过controller层获取到传输到业务层2.SpringMVC提供的RequestContextHolder可以直接获取代码: RequestAttributes requestAttri ...

  2. linux中查找命令find、locate、whereis、which、type的区别

    find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/var/lib/locatedb)文件不同,find查找的是磁盘空间. locate locate命令其实 ...

  3. eclipse 建立Maven java工程

    1.在项目资源管理器右键---新建---项目 2.在选择向导里选择Maven---Maven Project 3.选择默认的工作空间,下一步 4.选择箭头所示选项 5.输入组织名和工程名.点击完成

  4. kernel32.dll 这个系统模块

    详细解读:远程线程注入DLL到PC版微信 一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一 ...

  5. xtrabackup备份失败(error writing file 'UNOPENED')

    xtrabackup备份失败 解决了,是因为limit open files值设置太小了 (3)修改资源限制参数 vi /etc/security/limits.conf nproc:用户创建进程数限 ...

  6. DOS bcp

    C:\>bcp /?用法: bcp {dbtable | query} {in | out | queryout | format} 数据文件  [-m 最大错误数]             [ ...

  7. length 和 size 区分

    ​ 总是混淆length和size,今天专门区分一下 1.在java代码(.java)中 1.length属性是针对Java中的数组来说的,要求数组的长度可以用其length属性: 2.length( ...

  8. LC 155 Min Stack

    问题描述 Design a stack that supports push, pop, top, and retrieving the minimum element in constant tim ...

  9. JS的精确简单的加减乘除

    简单的写法: <script> function decNum(a){/*获取小数位数*/ var r=0; a=a.toString(); if(a.indexOf(".&qu ...

  10. union和in哪个效率高

    一直都认为是in的效率要高,但是这次确有点蒙圈. SELECT * FROM runinfo WHERE status in (0,2,1,3,4,7,9,10); 这个查询的效率是,经常是1秒多. ...