一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 基于.net4.0實現IdentityServer4客戶端JWT解密

基于.net4.0實現IdentityServer4客戶端JWT解密

2020-06-02 14:03ldybyz ASP.NET教程

這篇文章主要為大家詳細介紹了基于.net4.0實現IdentityServer4客戶端JWT解密,具有一定的參考價值,感興趣的小伙伴們可以參考一下

情景:公司項目基于.net4.0,web客戶端實現單點登錄需要自己解密id_token,對于jwt解密,.net提供了IdentityModel類庫,但是4.0中該類庫不可用,所以自己實現了解密方法..

使用了類庫:鏈接地址

下面直接貼代碼,直接調用DecodeJWT方法就行,參數為id_token,key默認為空字符串"",

代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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);
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/ldybyz/archive/2018/09/21/9688088.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99精品全国免费7观看视频 | 毛片a级放荡的护士hd | 色5月婷婷| 91香蕉导航| 18hdxxxx中国| 无人区乱码区1卡2卡三卡在线 | 日韩特级片 | 性色AV乱码一区二区三区视频 | a级免费观看 | 国内亚州视频在线观看 | beeg日本高清xxxx18 | 美女用屁股把人吞进肚子 | 日本高清免费不卡在线播放 | 婷婷中文| 国产一及毛片 | yy6080久久国产伦理 | 星星动漫无删减在线观看 | 亚洲精品永久免费 | 国产成人精品视频午夜 | 阿v天堂2020 α片免费 | 日韩亚洲国产欧美精品 | 全弄乱纶小说 | 欧美va免费精品高清在线 | 亚洲精品成人在线 | 国内外精品免费视频 | 欧美日韩看看2015永久免费 | 97爱sese| 高h肉厨房 | 涩色爱| 爱情岛论坛亚洲一号路线 | 日韩欧美一级大片 | 亚洲品质自拍网站 | 免费日本在线视频 | 九九99香蕉在线视频美国毛片 | 久久亚洲精品AV成人无码 | 爱情岛永久成人免费网站 | 欧美在线观看视频一区 | 特级毛片免费视频观看 | 天天草天天 | 日本一区二区三区在线 观看网站 | 欧美一区二区三区免费观看视频 |