欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#關(guān)于JWT跨域身份驗(yàn)證的實(shí)現(xiàn)代碼

 更新時(shí)間:2019年10月16日 09:09:08   作者:流月無雙  
這篇文章主要介紹了c#關(guān)于JWT跨域身份驗(yàn)證的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

JSON Web Token(JWT)是目前最流行的跨域身份驗(yàn)證解決方案。為了網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開發(fā)標(biāo)準(zhǔn)(RFC 7519),

該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登陸(SSO)場(chǎng)景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,

以便于從資源服務(wù)器獲取資源,該token也可直接被用于認(rèn)證,也可被加密。

一、JWT的組成

下面是JWT的一段示例,分為三個(gè)部分,分別是頭部(header),載荷(payload)}和簽證(signature),他們之間用點(diǎn)隔開。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiLmtYHmnIjml6Dlj4wiLCJleHAiOjE1NzExMDIxNTMsInN1YiI6InRlc3RKV1QiLCJhdWQiOiJVU0VSIiwiaWF0IjoiMjAxOS8xMC8xNSA5OjE1OjQzIiwiZGF0YSI6eyJuYW1lIjoiMTExIiwiYWdlIjoxMSwiYWRkcmVzcyI6Imh1YmVpIn19.
25IbZpAbSXBQsr2k3h0IzKRAC6z3OJTWg38VDtcEER8

二、和傳統(tǒng)session的對(duì)比

JWT是基于json的鑒權(quán)機(jī)制,而且是無狀態(tài)的,服務(wù)器端是沒有如傳統(tǒng)那樣保存客戶端的登錄信息的,這就為分布式開發(fā)提供了便利,

因?yàn)閭鹘y(tǒng)的方式是在服務(wù)端保存session信息,session是保存在內(nèi)存中的,當(dāng)客戶量變大的時(shí)候,對(duì)服務(wù)器的壓力自然會(huì)增大,

最關(guān)鍵的是在集群分布式中,每一次登錄的服務(wù)器可能不一樣,那么可能導(dǎo)致session保存在其中一個(gè)服務(wù)器,而另外一個(gè)服務(wù)器被請(qǐng)求的

時(shí)候還是無狀態(tài),除非你再次登錄,這就造成了很大的麻煩,也有人說把session存放在專門的服務(wù)器,每次都去那個(gè)服務(wù)器請(qǐng)求,

我不認(rèn)為這是很好的解決方案,本來集群就是為了高可用,如果你配置session的服務(wù)器壞了,大家都跟著完蛋,所以JWT這種無狀態(tài)的方式

就非常適合這種分布式的系統(tǒng)。

三、代碼 JwtHelper

光說不練假把式,下面還是來一段代碼。

還是老方式,先用NuGet把JWT引用進(jìn)來,這里需要引入JWT和newtonsoft.json

如下圖所示:

然后就是生成JWT的方法。

static IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//HMACSHA256加密
 static IJsonSerializer serializer = new JsonNetSerializer();//序列化和反序列
 static IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//Base64編解碼
 static IDateTimeProvider provider = new UtcDateTimeProvider();//UTC時(shí)間獲取
const string secret = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4aKpVo2OHXPwb1R7duLgg";//服務(wù)端
public static string CreateJWT(Dictionary<string, object> payload)
{
      IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
      return encoder.Encode(payload, secret);
}

看到這段代碼,你說覺得怎么這么簡(jiǎn)單,沒錯(cuò),就是這么簡(jiǎn)單,這個(gè)方法是被我們引用進(jìn)來的這個(gè)JWT給封裝了,所以看起來很簡(jiǎn)單

當(dāng)時(shí)我看到這里也是有點(diǎn)吃驚,不過我還是對(duì)源碼進(jìn)行了研究,下面貼出一段源碼給大家看看

如下所示,這段代碼是比較核心的代碼,在沒有傳遞header的時(shí)候,他幫你默認(rèn)加了header,

其實(shí)下面的這段代碼很容易看懂,無非就是對(duì)header和payload進(jìn)行base64加密(其實(shí)這里說加密也不是很恰當(dāng))。

這里的header你可以自己傳遞進(jìn)來。

public string Encode(IDictionary<string, object> extraHeaders, object payload, byte[] key)
    {
      if (payload is null)
        throw new ArgumentNullException(nameof(payload));

      var segments = new List<string>(3);

      var header = extraHeaders is null ? new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase) : new Dictionary<string, object>(extraHeaders, StringComparer.OrdinalIgnoreCase);
      header.Add("typ", "JWT");
      header.Add("alg", _algorithm.Name);

      var headerBytes = GetBytes(_jsonSerializer.Serialize(header));
      var payloadBytes = GetBytes(_jsonSerializer.Serialize(payload));

      segments.Add(_urlEncoder.Encode(headerBytes));
      segments.Add(_urlEncoder.Encode(payloadBytes));

      var stringToSign = String.Join(".", segments.ToArray());
      var bytesToSign = GetBytes(stringToSign);

      var signature = _algorithm.Sign(key, bytesToSign);
      segments.Add(_urlEncoder.Encode(signature));

      return String.Join(".", segments.ToArray());
    }

下面一段就是對(duì)JWT進(jìn)行驗(yàn)證的代碼,這里的寫法都差不多,反正都是調(diào)用JWT里面的方法,我們傳遞參數(shù)即可。

public static bool ValidateJWT(string token, out string payload, out string message)
    {
      bool isValidted = false;
      payload = "";
      try
      {
        IJwtValidator validator = new JwtValidator(serializer, provider);//用于驗(yàn)證JWT的類

        IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);//用于解析JWT的類
        payload = decoder.Decode(token, secret, verify: true);

        isValidted = true;

        message = "驗(yàn)證成功";
      }
      catch (TokenExpiredException)//當(dāng)前時(shí)間大于負(fù)載過期時(shí)間(負(fù)荷中的exp),會(huì)引發(fā)Token過期異常
      {
        message = "過期了!";
      }
      catch (SignatureVerificationException)//如果簽名不匹配,引發(fā)簽名驗(yàn)證異常
      {
        message = "簽名錯(cuò)誤!";
      }
      return isValidted;
    }

四、調(diào)用

class Program
  {
    static void Main(string[] args)
    {
      //載荷(payload)
      var payload = new Dictionary<string, object>
      {
        { "iss","流月無雙"},//發(fā)行人
        { "exp", DateTimeOffset.UtcNow.AddSeconds(10).ToUnixTimeSeconds() },//到期時(shí)間
        { "sub", "testJWT" }, //主題
        { "aud", "USER" }, //用戶
        { "iat", DateTime.Now.ToString() }, //發(fā)布時(shí)間 
        { "data" ,new { name="111",age=11,address="hubei"} }
      };
      //生成JWT
      Console.WriteLine("******************生成JWT*******************");
      string JWTString = JwtHelper.CreateJWT(payload);
      Console.WriteLine(JWTString);
      Console.WriteLine();

      //校驗(yàn)JWT
      Console.WriteLine("*******************校驗(yàn)JWT,獲得載荷***************");
      string ResultMessage;//需要解析的消息
      string Payload;//獲取負(fù)載
      if (JwtHelper.ValidateJWT(JWTString, out Payload, out ResultMessage))
      {
        Console.WriteLine(Payload);
      }
      Console.WriteLine(ResultMessage);//驗(yàn)證結(jié)果說明
      Console.WriteLine("*******************END*************************");
    }
  }

結(jié)果如圖:

五、總結(jié)

1、因?yàn)閖son是通用的,所以jwt可以在絕大部分平臺(tái)可以通用,如java,python,php,.net等

2、基于jwt是無狀態(tài)的,jwt可以用于分布式等現(xiàn)在比較流行的一些框架中。

3、jwt本身不是加密的,所以安全性不是很高,別人知道了你的token就可以解析了,

當(dāng)然你自己也可以對(duì)jwt進(jìn)行加密,設(shè)置的過期時(shí)間不宜過長(zhǎng),同時(shí)不要保存一些重要的信息,如密碼。

4、盡量使用https,這也是為了安全。

5、JWT字節(jié)占用很少,非常的輕便,所以便于傳輸。

6、JWT一般放在http的頭部Header中傳輸。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# DateTime日期比較方法案例詳解

    C# DateTime日期比較方法案例詳解

    這篇文章主要介紹了C# DateTime日期比較方法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C#獲取并修改文件擴(kuò)展名的方法

    C#獲取并修改文件擴(kuò)展名的方法

    這篇文章主要介紹了C#獲取并修改文件擴(kuò)展名的方法,實(shí)例分析了C#編程方式修改文件擴(kuò)展名的技巧,涉及Path類的使用方法,需要的朋友可以參考下
    2015-04-04
  • 解決C#中取消方向鍵對(duì)控件焦點(diǎn)控制的實(shí)現(xiàn)方法

    解決C#中取消方向鍵對(duì)控件焦點(diǎn)控制的實(shí)現(xiàn)方法

    本篇文章是對(duì)C#中取消方向鍵對(duì)控件焦點(diǎn)控制的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C# Request.Form用法案例詳解

    C# Request.Form用法案例詳解

    這篇文章主要介紹了C# Request.Form用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • unity通過Mesh網(wǎng)格繪制圖形球體

    unity通過Mesh網(wǎng)格繪制圖形球體

    這篇文章主要為大家詳細(xì)介紹了unity通過Mesh網(wǎng)格繪制圖形球體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Unity實(shí)現(xiàn)鼠標(biāo)雙擊與長(zhǎng)按的檢測(cè)

    Unity實(shí)現(xiàn)鼠標(biāo)雙擊與長(zhǎng)按的檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)雙擊與長(zhǎng)按的檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C#使用AnimateWindow()實(shí)現(xiàn)動(dòng)畫窗體的方法

    C#使用AnimateWindow()實(shí)現(xiàn)動(dòng)畫窗體的方法

    用API函數(shù)AnimateWindow函數(shù)來實(shí)現(xiàn)窗體的動(dòng)畫效果,在C#中,你可以使用P/Invoke技術(shù)調(diào)用Windows API中的AnimateWindow函數(shù)來實(shí)現(xiàn)動(dòng)畫窗體,本文就給大家介紹了C#使用AnimateWindow()實(shí)現(xiàn)動(dòng)畫窗體的方法,感興趣的朋友可以參考下
    2024-04-04
  • C#逐行讀取文件的方法

    C#逐行讀取文件的方法

    這篇文章主要介紹了C#逐行讀取文件的方法,針對(duì)較大文件的讀取非常實(shí)用,需要的朋友可以參考下
    2015-07-07
  • C#實(shí)現(xiàn)XOR密碼(異或密碼)的示例代碼

    C#實(shí)現(xiàn)XOR密碼(異或密碼)的示例代碼

    XOR密碼(異或密碼)是一種簡(jiǎn)單的加密算法,它使用異或(XOR)操作來對(duì)明文和密鑰進(jìn)行加密和解密,本文為大家介紹了C#實(shí)現(xiàn)XOR密碼的相關(guān)知識(shí),希望對(duì)大家有所幫助
    2024-01-01
  • C#單例模式(Singleton Pattern)詳解

    C#單例模式(Singleton Pattern)詳解

    這篇文章主要為大家詳細(xì)介紹了C#單例模式Singleton Pattern的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論