亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在C#中利用jwt實現一個分布式登錄功能

發布時間:2021-02-03 15:40:29 來源:億速云 閱讀:359 作者:Leah 欄目:開發技術

怎么在C#中利用jwt實現一個分布式登錄功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一、傳統的session登錄

服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的應用就能識別請求來自哪個用戶了,這就是傳統的基于session認證。

怎么在C#中利用jwt實現一個分布式登錄功能

在asp.net core中可以簡單實現:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
   if (env.IsDevelopment())
   {
    app.UseDeveloperExceptionPage();
   }
   else
   {
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
   }

   app.UseHttpsRedirection();
   //使用靜態文件
   app.UseStaticFiles();
   //Cookie策略
   //app.UseCookiePolicy();
   //Session
   app.UseSession();

   app.UseMvc(routes =>
   {
    routes.MapRoute(
     name: "default",
     // template: "{controller=Home}/{action=Index}/{id?}");
     //template: "{controller=Home}/{action=Server}/{id?}");
     template: "{controller=Login}/{action=SignIn}/{id?}");
   });
  }

但是這種基于session的認證使應用本身很難得到擴展,隨著不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來。

傳統session的主要問題如下:

1.服務器壓力: 每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大。

2.擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。

3.CSRF: 因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

二、基于token的鑒權機制

基于token的鑒權機制是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息,而是基于token去運算而實現鑒權。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就為服務實現大規模分布式提供了基礎。

怎么在C#中利用jwt實現一個分布式登錄功能

上圖是一種用token登錄的實現方式,類似的還有很多,雖然實現了分布式的登錄處理,但是由于不同的系統之間的不同實現,導致開發量劇增。

三、Json web token

這里推薦使用JWT——Json web token(官網鏈接)。一個典型的JWT看起來如下圖:

怎么在C#中利用jwt實現一個分布式登錄功能

jwt為一個字符串,字符之間通過"."分隔符分為三個子串。注意JWT對象為一個長字串,各字串之間也沒有換行符,此處為了演示需要,特意分行并用不同顏色表示了。每一個子串表示了一個功能塊,總共有以下三個部分:JWT頭、有效載荷和簽名,將它們寫成一行如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJpYXQiOjE1OTM5NTU5NDMsInVpZCI6MTAsImV4cCI6MTU5Mzk1NTk3Mywic2NvcGVzIjpbImFkbWluIiwidXNlciJdfQ.VHpxmxKVKpsn2Iytqc_6Z1U1NtiX3EgVki4PmA-J3Pg

一般是將它放入HTTP請求的Header Authorization字段中

Authorization: Bearer

這里可以打開nuget:https://www.nuget.org/packages/JWT.Standard/,或者在vs中使用

輸入jwt.standard找到nuget包下載

1.生成jwt數據

在需要使用的地方輸入如下C#代碼:

var jwtp = new JWTPackage<UserModel>(new UserModel()
{
 Id = "1",
 Name = "yswenli",
 Role = "Admin"
}, 180, _pwd);
var keyValuePair = jwtp.GetAuthorizationBearer();
context.HttpContext.Response.Headers[keyValuePair.Key] = keyValuePair.Value;

這樣就將需要的jwt內容信息加入到Http頭部中,當然可以使用如下方式,以參數數據的方式傳遞,從而避免跨域問題

var password = Guid.NewGuid().ToString("N");

 var jwtp1 = new JWTPackage<User>(new User()
 {
  Id = "1",
  Name = "yswenli",
  Role = "Admin"
 }, 180, password);

 var sign = jwtp1.Signature;

2.jwt解析驗證

JWTPackage<T>中使用JWTPackage<T>.Parse方法解析jwt的內容,如果內容是header中的參數,則快捷解析驗證代碼如下:

var result = string.Empty;
try
{
 if (context.HttpContext.Request.Headers.ContainsKey(keyValuePair.Key))
 {
  var val = context.HttpContext.Request.Headers[keyValuePair.Key].ToString();

  val = val.Replace(JWTPackage.Prex, "");

  var jwt = JWTPackage<UserModel>.Parse(val, pwd);

  result = "OK";
 }
}
catch (IllegalTokenException iex)
{
 result = $"解析失敗:{iex.Message}";
}
catch (TokenExpiredException tex)
{
 result = $"解析失敗:{tex.Message}";
}
catch (SignatureVerificationException sex)
{
 result = $"解析失敗:{sex.Message}";
}
catch (Exception ex)
{
 result = $"解析失敗:{ex.Message}";
}
return result;

四、JWT的問題

經過上述的簡單介紹,JWT不僅可用于認證,還可用于信息交換,善用JWT有助于減少服務器請求數據的次數。但是如果不正確的使用JWT也會造成安全問題,主要幾點如下:

1.保護好secret私鑰,加密的密碼不能泄漏,否則就失去了簽名的意義了

2.Replay Attacks,JWT的消息體中最好加入生成時間,在后端中進行時間判定,小于規定時間的直接攔截

3.不應該在JWT的payload部分存放敏感信息,因為該部分是客戶端可解密的部分

4.建議的方式是通過SSL加密的傳輸(https協議),從而避免敏感信息被嗅探

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jwt
AI

安吉县| 肃北| 西青区| 拜城县| 鹤峰县| 兴宁市| 虹口区| 乃东县| 渑池县| 香格里拉县| 青河县| 土默特右旗| 犍为县| 碌曲县| 柳河县| 阿巴嘎旗| 江西省| 古田县| 巴东县| 宿州市| 宁乡县| 建德市| 保定市| 宝鸡市| 龙胜| 理塘县| 长丰县| 太原市| 合作市| 肇庆市| 哈尔滨市| 体育| 巢湖市| 洛扎县| 阿克| 凤凰县| 吉木乃县| 富宁县| 邯郸县| 麻城市| 九龙县|