情景:公司项目基于.net4.0,web客户端实现单点登录需要自己解密id_token,对于jwt解密,.net提供了IdentityModel类库,但是4.0中该类库不可用,所以自己实现了解密方法..

使用了类库:https://github.com/jwt-dotnet/jwt

下面直接贴代码,直接调用DecodeJWT方法就行,参数为id_token,key默认为空字符串"",


         public static IDictionary<string, object> DecodeJWT(string jwttoken,string key){//从/.well-known/openid-configuration路径获取jwks_urivar webClient = new WebClient();var endpoint = "http://localhost:5000/.well-known/openid-configuration";var json = webClient.DownloadString(endpoint);JObject metadata = JsonConvert.DeserializeObject<JObject>(json);var jwksUri = metadata["jwks_uri"].ToString();//从jwks_uri获取keysjson = webClient.DownloadString(jwksUri);var keys = JsonConvert.DeserializeObject<CustomJWKs>(json);//从jwt获取头部kid,并从keys中找到匹配kid的keystring[] tokenParts = jwttoken.Split('.');byte[] bytes = FromBase64Url(tokenParts[0]);string head= Encoding.UTF8.GetString(bytes);string kid = JsonConvert.DeserializeObject<JObject>(head)["kid"].ToString();var defaultkey=keys.keys.Where(t => t.kid == kid).FirstOrDefault();if(defaultkey==null){throw new Exception("未找到匹配的kid");}//jwt解密return RS256Decode(jwttoken, key, defaultkey.e, defaultkey.n);}public static IDictionary<string, object> RS256Decode(string token, string secret, string exponent,string modulus){try{IJsonSerializer serializer = new JsonNetSerializer();IDateTimeProvider provider = new UtcDateTimeProvider();IJwtValidator validator = new JwtValidator(serializer, provider);IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();RSAlgorithmFactory rS256Algorithm = new RSAlgorithmFactory(() =>{RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();rsa.ImportParameters(new RSAParameters(){Modulus = FromBase64Url(modulus),Exponent = FromBase64Url(exponent)});byte[] rsaBytes = rsa.ExportCspBlob(true);X509Certificate2 cert = new X509Certificate2(rsaBytes);return cert;});IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, rS256Algorithm);var json = decoder.DecodeToObject(token, secret, verify: false);return json;}catch (TokenExpiredException){throw new Exception("token已过期");//Console.WriteLine("Token has expired");//return null;
            }catch (SignatureVerificationException){throw new Exception("token验证失败");//Console.WriteLine("Token has invalid signature");//return null;
            }}public static byte[] FromBase64Url(string base64Url){string padded = base64Url.Length % 4 == 0? base64Url : base64Url + "====".Substring(base64Url.Length % 4);string base64 = padded.Replace("_", "/").Replace("-", "+");return Convert.FromBase64String(base64);}

转载于:https://www.cnblogs.com/ldybyz/p/9688088.html

IdentityServer4客户端JWT解密实现(基于.net4.0)相关推荐

  1. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

  2. 【ESP8266】ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)

    前言 MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分. ESP8266是一款物美价廉的Wi-Fi芯片,集成Ten ...

  3. 酒店管理系统升级(.net4.0 + sql2005 + linq to sql)

    成都酒店管理系统(.net4.0 + sql2005/2008 + linq to sql) 参考"东方之星酒店管理系统 2010版",基于.net4.0开发框架,C#语言,C/S ...

  4. ASP.NET4.0中客户端ID的生成

    从去年某个时候,我开始探索ASP.NET4.0 Web窗体的改进.我发现ASP.NET4.0中一些令人兴奋地改进,我确认这一切都会使WEB开发更简单并为我们提供更多灵活性.因此我逐个摘选了这些 很令人 ...

  5. 基于cling2.0的Android DLNA/Upnp客户端基本开发成功

    最近花了2个月的时间,基于cling2.0协议栈做了个Android DLNA/Upnp客户端,实现了DMS,DMR,DMC的主要功能,全面打通了Upnp协议,某些方面已经超越BubbleUpnp,例 ...

  6. ArcBlock创始人冒志鸿解密区块链3.0

    ArcBlock:解密区块链3.0 币乎公开课 bihu.com 本期嘉宾:冒志鸿(ArcBlock创始人兼CEO) 大家好,我是冒志鸿,网名老冒,ArcBlock的创始人兼CEO.我今天为大家分享的 ...

  7. .NET4.0并行计算技术基础(8)

    说明: 要想看懂本系列文章,需要您对.NET多线程开发有基本的了解.我在新书<面向对象的艺术 --.NET Framework 4.0技术剖析与应用>(暂名)中花了近200页的篇幅来介绍. ...

  8. 基于Tomcat5.0和Axis2开发Web Service代码详解

    本文将详细介绍HelloWorld中使用的server和client端代码.阅读之前,你应该首先了解SOAP1.1协议.<?xml:namespace prefix = o ns = " ...

  9. 基于Tomcat5.0和Axis2开发Web Service应用实例

    本文将介绍如何使用Tomcat5.0和Apache Axis2开发.部署及测试一个简单的Web Service应用.<?xml:namespace prefix = o ns = "u ...

最新文章

  1. java ssh文件下载_Java使用SSH从远程服务器下载文件
  2. 现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)...
  3. 5、继承与派生4-派生类的构造和析构函数
  4. 常用的webpack 配置
  5. sys接口linux编程,网络编程常用接口的内核实现----sys_listen()
  6. win 10 VMware与Hyper-v共存
  7. Android 源码获取-----在Windows环境下通过Git得到Android源代码
  8. php删除xml头部,使用php删除xml文件中的子节点
  9. 根据id来实现小程序tab切换,
  10. 扩展 TextBox 控件 - 依 FormViewMode 来自行设定状态
  11. sofia-sip-ua >= 1.12.12… configure: error: no usable sofia-sip; please install sofia-sip-ua devel pa
  12. php arcsin,三角函数在线计算器
  13. DELL官方证实:NVIDIA史上最大显卡质量事故
  14. 连享会新命令 lxh:随时查看 Stata 资源
  15. Google Cloud API设计指南
  16. 苹果CMS接入GOGO支付实现个人收款回调详细教程(附插件)
  17. 二十九幅图片所展现的意境:壮美!
  18. gamit 常用命令
  19. Windows下将Tomcat8注册为系统服务
  20. python 操作 csv 编码问题,繁体字体乱码

热门文章

  1. 星云链智能合约开发(六):智能合约开发与部署
  2. Spring, MyBatis 多数据源的配置和管理
  3. linux下如何安装charles
  4. Struts2学习(二):第一个Action
  5. windows7下bcdedit出现“拒绝访问”解决办法
  6. SplitContainer.SplitterDistance属性值设置应注意的与FixedPanel有关
  7. java 送参数_关于java:如何以编程方式发送带参数的HTTP请求?
  8. 蓝桥杯 ALGO-70 算法训练 最长字符串
  9. 蓝桥杯 ALGO-20 算法训练 求先序排列 Java版
  10. 1014. 福尔摩斯的约会 (20)-PAT乙级真题