久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

    • <bdo id='A8F5G'></bdo><ul id='A8F5G'></ul>
  1. <small id='A8F5G'></small><noframes id='A8F5G'>

    <legend id='A8F5G'><style id='A8F5G'><dir id='A8F5G'><q id='A8F5G'></q></dir></style></legend>
  2. <i id='A8F5G'><tr id='A8F5G'><dt id='A8F5G'><q id='A8F5G'><span id='A8F5G'><b id='A8F5G'><form id='A8F5G'><ins id='A8F5G'></ins><ul id='A8F5G'></ul><sub id='A8F5G'></sub></form><legend id='A8F5G'></legend><bdo id='A8F5G'><pre id='A8F5G'><center id='A8F5G'></center></pre></bdo></b><th id='A8F5G'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='A8F5G'><tfoot id='A8F5G'></tfoot><dl id='A8F5G'><fieldset id='A8F5G'></fieldset></dl></div>

      <tfoot id='A8F5G'></tfoot>

      C# 中是否有任何 JSON Web 令牌 (JWT) 示例?

      Is there any JSON Web Token (JWT) example in C#?(C# 中是否有任何 JSON Web 令牌 (JWT) 示例?)
      • <small id='KRuq2'></small><noframes id='KRuq2'>

      • <i id='KRuq2'><tr id='KRuq2'><dt id='KRuq2'><q id='KRuq2'><span id='KRuq2'><b id='KRuq2'><form id='KRuq2'><ins id='KRuq2'></ins><ul id='KRuq2'></ul><sub id='KRuq2'></sub></form><legend id='KRuq2'></legend><bdo id='KRuq2'><pre id='KRuq2'><center id='KRuq2'></center></pre></bdo></b><th id='KRuq2'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='KRuq2'><tfoot id='KRuq2'></tfoot><dl id='KRuq2'><fieldset id='KRuq2'></fieldset></dl></div>

        • <legend id='KRuq2'><style id='KRuq2'><dir id='KRuq2'><q id='KRuq2'></q></dir></style></legend>
              <bdo id='KRuq2'></bdo><ul id='KRuq2'></ul>
            • <tfoot id='KRuq2'></tfoot>
                  <tbody id='KRuq2'></tbody>
                本文介紹了C# 中是否有任何 JSON Web 令牌 (JWT) 示例?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

                問(wèn)題描述

                限時(shí)送ChatGPT賬號(hào)..

                我覺(jué)得我在這里服用了瘋狂的藥丸.通常,對(duì)于任何給定的任務(wù),網(wǎng)絡(luò)上總是有一百萬(wàn)個(gè)庫(kù)和樣本.我正在嘗試通過(guò)使用 JSON Web 令牌 (JWT) 來(lái)使用 Google服務(wù)帳戶"實(shí)現(xiàn)身份驗(yàn)證,如 這里.

                但是,只有 PHP、Python 和 Java 中的客戶端庫(kù).即使在 Google 的身份驗(yàn)證之外搜索 JWT 示例,關(guān)于 JWT 的概念也只有蟋蟀和草稿.這真的很新,而且可能是谷歌專有系統(tǒng)嗎?

                我能解釋的最接近的 java 示例看起來(lái)非常密集且令人生畏.C# 中必須有一些我至少可以開(kāi)始的東西.對(duì)此的任何幫助都會(huì)很棒!

                解決方案

                謝謝大家.我找到了一個(gè) Json Web Token 的基本實(shí)現(xiàn),并用 Google 風(fēng)格對(duì)其進(jìn)行了擴(kuò)展.我還沒(méi)有完全解決它,但它已經(jīng)完成了 97%.這個(gè)項(xiàng)目失去了動(dòng)力,所以希望這將有助于其他人獲得良好的開(kāi)端:

                注意:我對(duì)基本實(shí)現(xiàn)所做的更改(不記得我在哪里找到的)是:

                <塊引用>

                1. 更改了 HS256 -> RS256
                2. 交換了標(biāo)頭中的 JWT 和 alg 順序.不知道是誰(shuí)弄錯(cuò)了,谷歌還是規(guī)范,但谷歌按照他們的文檔如下所示.

                公共枚舉 JwtHashAlgorithm{RS256,HS384,HS512}公共類(lèi) JsonWebToken{私有靜態(tài)字典<JwtHashAlgorithm, Func<byte[], byte[], byte[]>>哈希算法;靜態(tài) JsonWebToken(){HashAlgorithms = new Dictionary公共類(lèi) GoogleJsonWebToken{公共靜態(tài)字符串編碼(字符串電子郵件,字符串證書(shū)文件路徑){var utc0 = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);var issueTime = DateTime.Now;var iat = (int)issueTime.Subtract(utc0).TotalSeconds;var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;//過(guò)期時(shí)間最長(zhǎng)為 1 小時(shí),但讓我們?cè)诎踩那闆r下玩var 有效載荷 = 新{iss = 電子郵件,范圍 = "https://www.googleapis.com/auth/gan.readonly",aud = "https://accounts.google.com/o/oauth2/token",經(jīng)驗(yàn) = 經(jīng)驗(yàn),iat = iat};var certificate = new X509Certificate2(certificateFilePath, "notasecret");var privateKey = certificate.Export(X509ContentType.Cert);return JsonWebToken.Encode(payload, privateKey, JwtHashAlgorithm.RS256);}}

                I feel like I'm taking crazy pills here. Usually there's always a million library and samples floating around the web for any given task. I'm trying to implement authentication with a Google "Service Account" by use of JSON Web Tokens (JWT) as described here.

                However there is only client libraries in PHP, Python, and Java. Even searching for JWT examples outside of Google's authentication, there is only crickets and drafts on the JWT concept. Is this really so new and possibly a Google proprietary system?

                The java sample which is the closest I could manage to interpret looks pretty intensive and intimidating. There's got to be something out there in C# that I could at least start with. Any help with this would be great!

                解決方案

                Thanks everyone. I found a base implementation of a Json Web Token and expanded on it with the Google flavor. I still haven't gotten it completely worked out but it's 97% there. This project lost it's steam, so hopefully this will help someone else get a good head-start:

                Note: Changes I made to the base implementation (Can't remember where I found it,) are:

                1. Changed HS256 -> RS256
                2. Swapped the JWT and alg order in the header. Not sure who got it wrong, Google or the spec, but google takes it the way It is below according to their docs.

                public enum JwtHashAlgorithm
                {
                    RS256,
                    HS384,
                    HS512
                }
                
                public class JsonWebToken
                {
                    private static Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>> HashAlgorithms;
                
                    static JsonWebToken()
                    {
                        HashAlgorithms = new Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>>
                            {
                                { JwtHashAlgorithm.RS256, (key, value) => { using (var sha = new HMACSHA256(key)) { return sha.ComputeHash(value); } } },
                                { JwtHashAlgorithm.HS384, (key, value) => { using (var sha = new HMACSHA384(key)) { return sha.ComputeHash(value); } } },
                                { JwtHashAlgorithm.HS512, (key, value) => { using (var sha = new HMACSHA512(key)) { return sha.ComputeHash(value); } } }
                            };
                    }
                
                    public static string Encode(object payload, string key, JwtHashAlgorithm algorithm)
                    {
                        return Encode(payload, Encoding.UTF8.GetBytes(key), algorithm);
                    }
                
                    public static string Encode(object payload, byte[] keyBytes, JwtHashAlgorithm algorithm)
                    {
                        var segments = new List<string>();
                        var header = new { alg = algorithm.ToString(), typ = "JWT" };
                
                        byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None));
                        byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));
                        //byte[] payloadBytes = Encoding.UTF8.GetBytes(@"{"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com","scope":"https://www.googleapis.com/auth/prediction","aud":"https://accounts.google.com/o/oauth2/token","exp":1328554385,"iat":1328550785}");
                
                        segments.Add(Base64UrlEncode(headerBytes));
                        segments.Add(Base64UrlEncode(payloadBytes));
                
                        var stringToSign = string.Join(".", segments.ToArray());
                
                        var bytesToSign = Encoding.UTF8.GetBytes(stringToSign);
                
                        byte[] signature = HashAlgorithms[algorithm](keyBytes, bytesToSign);
                        segments.Add(Base64UrlEncode(signature));
                
                        return string.Join(".", segments.ToArray());
                    }
                
                    public static string Decode(string token, string key)
                    {
                        return Decode(token, key, true);
                    }
                
                    public static string Decode(string token, string key, bool verify)
                    {
                        var parts = token.Split('.');
                        var header = parts[0];
                        var payload = parts[1];
                        byte[] crypto = Base64UrlDecode(parts[2]);
                
                        var headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
                        var headerData = JObject.Parse(headerJson);
                        var payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
                        var payloadData = JObject.Parse(payloadJson);
                
                        if (verify)
                        {
                            var bytesToSign = Encoding.UTF8.GetBytes(string.Concat(header, ".", payload));
                            var keyBytes = Encoding.UTF8.GetBytes(key);
                            var algorithm = (string)headerData["alg"];
                
                            var signature = HashAlgorithms[GetHashAlgorithm(algorithm)](keyBytes, bytesToSign);
                            var decodedCrypto = Convert.ToBase64String(crypto);
                            var decodedSignature = Convert.ToBase64String(signature);
                
                            if (decodedCrypto != decodedSignature)
                            {
                                throw new ApplicationException(string.Format("Invalid signature. Expected {0} got {1}", decodedCrypto, decodedSignature));
                            }
                        }
                
                        return payloadData.ToString();
                    }
                
                    private static JwtHashAlgorithm GetHashAlgorithm(string algorithm)
                    {
                        switch (algorithm)
                        {
                            case "RS256": return JwtHashAlgorithm.RS256;
                            case "HS384": return JwtHashAlgorithm.HS384;
                            case "HS512": return JwtHashAlgorithm.HS512;
                            default: throw new InvalidOperationException("Algorithm not supported.");
                        }
                    }
                
                    // from JWT spec
                    private static string Base64UrlEncode(byte[] input)
                    {
                        var output = Convert.ToBase64String(input);
                        output = output.Split('=')[0]; // Remove any trailing '='s
                        output = output.Replace('+', '-'); // 62nd char of encoding
                        output = output.Replace('/', '_'); // 63rd char of encoding
                        return output;
                    }
                
                    // from JWT spec
                    private static byte[] Base64UrlDecode(string input)
                    {
                        var output = input;
                        output = output.Replace('-', '+'); // 62nd char of encoding
                        output = output.Replace('_', '/'); // 63rd char of encoding
                        switch (output.Length % 4) // Pad with trailing '='s
                        {
                            case 0: break; // No pad chars in this case
                            case 2: output += "=="; break; // Two pad chars
                            case 3: output += "="; break; // One pad char
                            default: throw new System.Exception("Illegal base64url string!");
                        }
                        var converted = Convert.FromBase64String(output); // Standard base64 decoder
                        return converted;
                    }
                }
                

                And then my google specific JWT class:

                public class GoogleJsonWebToken
                {
                    public static string Encode(string email, string certificateFilePath)
                    {
                        var utc0 = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);
                        var issueTime = DateTime.Now;
                
                        var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
                        var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds; // Expiration time is up to 1 hour, but lets play on safe side
                
                        var payload = new
                        {
                            iss = email,
                            scope = "https://www.googleapis.com/auth/gan.readonly",
                            aud = "https://accounts.google.com/o/oauth2/token",
                            exp = exp,
                            iat = iat
                        };
                
                        var certificate = new X509Certificate2(certificateFilePath, "notasecret");
                
                        var privateKey = certificate.Export(X509ContentType.Cert);
                
                        return JsonWebToken.Encode(payload, privateKey, JwtHashAlgorithm.RS256);
                    }
                }
                

                這篇關(guān)于C# 中是否有任何 JSON Web 令牌 (JWT) 示例?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

                【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

                相關(guān)文檔推薦

                What are good algorithms for vehicle license plate detection?(車(chē)牌檢測(cè)有哪些好的算法?)
                onClick event for Image in Unity(Unity中圖像的onClick事件)
                Running Total C#(運(yùn)行總 C#)
                Deleting a directory when clicked on a hyperlink with JAvascript.ASP.NET C#(單擊帶有 JAvascript.ASP.NET C# 的超鏈接時(shí)刪除目錄)
                asp.net listview highlight row on click(asp.net listview 在單擊時(shí)突出顯示行)
                Calling A Button OnClick from a function(從函數(shù)調(diào)用按鈕 OnClick)

                        <i id='jPMok'><tr id='jPMok'><dt id='jPMok'><q id='jPMok'><span id='jPMok'><b id='jPMok'><form id='jPMok'><ins id='jPMok'></ins><ul id='jPMok'></ul><sub id='jPMok'></sub></form><legend id='jPMok'></legend><bdo id='jPMok'><pre id='jPMok'><center id='jPMok'></center></pre></bdo></b><th id='jPMok'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='jPMok'><tfoot id='jPMok'></tfoot><dl id='jPMok'><fieldset id='jPMok'></fieldset></dl></div>
                        <tfoot id='jPMok'></tfoot>
                        <legend id='jPMok'><style id='jPMok'><dir id='jPMok'><q id='jPMok'></q></dir></style></legend>

                      1. <small id='jPMok'></small><noframes id='jPMok'>

                          <bdo id='jPMok'></bdo><ul id='jPMok'></ul>

                            <tbody id='jPMok'></tbody>
                          主站蜘蛛池模板: 中文字幕在线观看一区二区 | 国产精品久久精品 | 成人黄色电影在线播放 | 欧美在线一二三 | 能看的av网站 | 中文字幕欧美一区二区 | 午夜午夜精品一区二区三区文 | 观看av| 亚洲精品自拍 | 欧美日日| 精品一级| 亚洲视频二区 | 毛片一级片 | 日韩一区二区三区在线 | 精品久久久久久久久久久久久久 | 亚洲欧美一区二区三区视频 | 黄色一级片视频 | 日韩午夜 | 日韩久久久久 | 天堂一区 | 欧美一级免费 | 欧美精品1区2区 | 日韩一二区 | 久久机热 | 亚洲交性 | www.国产一区 | 亚洲福利 | 日韩免费高清视频 | 狠狠干影院 | 亚洲精品一区二三区不卡 | 久久av一区 | 99热热| 日韩免费福利视频 | 热久久国产| 日日噜噜夜夜爽爽狠狠 | 欧美一级黄色片 | 国产欧美日韩综合精品一区二区 | 91欧美激情一区二区三区成人 | 色秀网站| 日韩一区二区三区av | 久久成人免费视频 |