IdentityServer4客戶端JWT解密實現(基於.net4.0)

来源:https://www.cnblogs.com/ldybyz/archive/2018/09/21/9688088.html
-Advertisement-
Play Games

情景:公司項目基於.net4.0,web客戶端實現單點登錄需要自己解密id_token,對於jwt解密,.net提供了IdentityModel類庫,但是4.0中該類庫不可用,所以自己實現瞭解密方法.. 使用了類庫:https://github.com/jwt-dotnet/jwt 下麵直接貼代碼, ...


情景:公司項目基於.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_uri var 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獲取keys json = webClient.DownloadString(jwksUri); var keys = JsonConvert.DeserializeObject<CustomJWKs>(json); //從jwt獲取頭部kid,並從keys中找到匹配kid的key string[] 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); }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每個程式員、或者說每個工作者都應該有自己的職業規劃,如果你不是富二代,不是官二代,也沒有職業規劃,希望你可以思考一下自己的將來。今天給大家分享的是一篇來自阿裡Java架構師對普通程式員的職業建議,希望對你有啟發。 普通程式員,三年成為年薪70w架構師,只因做到了這些 ...
  • 1.分析 上傳文件的過程:客服端選擇一個文件後,寫入到伺服器端,伺服器端使用一個目錄來存儲該文件--底層IO流操作 2.jsp文件上的表單設計 表單傳輸格式用multipart/form-data,要上傳的文件input標簽name屬性最好用同樣的首碼或者尾碼好獲取 3後臺Servlet處理 1.S ...
  • 題意 題目鏈接 題意:給出一張無向圖,每次詢問兩點之間的最短路,滿足$m - n <= 20$ $n, m, q \leqslant 10^5$ Sol 非常好的一道題。 首先建出一個dfs樹。 因為邊數-點數非常少,所以我們可以對於某些非樹邊特殊考慮。 具體做法是:對於非樹邊連接的兩個點,暴力求出 ...
  • 分散式架構有以下幾點普適性的共性需求: 1. 提供集群的集中化的配置管理功能,可以不重啟就讓新的配置參數生效,類似與配置中心 2. 簡單可靠的集群節點動態發現機制,便於動態發現服務,動態擴展節點 3. 簡單可靠的leader選舉機制 4. 提供分散式鎖 zookeeper的數據結構整體上可以看作一顆 ...
  • 在前面大致預覽了常用變數的結構之後,我們今天來仔細的剖析一下字元串的具體實現。 一、字元串的結構 zend_refcounted_h對應的結構體: 下麵我們來瞭解一下具體每個成員的作用: gc:就是_zend_refcounted_h結構體,主要作用是引用計數以及標記變數的類別。 h:字元串的哈希值 ...
  • 前言 並行編程:通過編碼方式利用多核或多處理器稱為並行編程,多線程概念的一個子集。 並行處理:把正在執行的大量的任務分割成小塊,分配給多個同時運行的線程。多線程的一種。 並行編程分為如下幾個結構: 1.並行的LINQ或PLINQ 2.Parallel類 3.任務並行結構 4.併發集合 5.SpinL ...
  • 前言 本章講述正確添加語言資源的方式,以及一段語言資源的多種樣式顯示。 例如:“@Winter,你好!感謝已使用軟體 800 天!” 在添加如上多語言資源項時,“XX,你好!感謝已使用軟體 X 天!” 那麼,你是怎麼添加語言資源的呢? 分別添加,“,你好!”、“感謝已使用軟體”、“年”3個,再通過界 ...
  • 錯誤 無法安裝程式包“MiniProfiler.EF6 4.0.138”。你正在嘗試將此程式包安裝到目標為“.NETFramework,Version=v4.5.2”的項目中, 但該程式包不包含任何與該框架相容的程式集引用或內容文件。有關詳細信息,請聯繫程式包作者。 產生這個錯誤的原因主要是.net ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...