怎么在C#中利用jwt實(shí)現(xiàn)一個(gè)分布式登錄功能-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián)公司成立于2013年,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元白河做網(wǎng)站,已為上家服務(wù),為白河各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

一、傳統(tǒng)的session登錄

在服務(wù)器存儲(chǔ)一份用戶(hù)登錄的信息,這份登錄信息會(huì)在響應(yīng)時(shí)傳遞給瀏覽器,告訴其保存為cookie,以便下次請(qǐng)求時(shí)發(fā)送給我們的應(yīng)用,這樣我們的應(yīng)用就能識(shí)別請(qǐng)求來(lái)自哪個(gè)用戶(hù)了,這就是傳統(tǒng)的基于session認(rèn)證。

怎么在C#中利用jwt實(shí)現(xiàn)一個(gè)分布式登錄功能

在asp.net core中可以簡(jiǎn)單實(shí)現(xiàn):

// 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();
   //使用靜態(tài)文件
   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的認(rèn)證使應(yīng)用本身很難得到擴(kuò)展,隨著不同客戶(hù)端用戶(hù)的增加,獨(dú)立的服務(wù)器已無(wú)法承載更多的用戶(hù),而這時(shí)候基于session認(rèn)證應(yīng)用的問(wèn)題就會(huì)暴露出來(lái)。

傳統(tǒng)session的主要問(wèn)題如下:

1.服務(wù)器壓力: 每個(gè)用戶(hù)經(jīng)過(guò)我們的應(yīng)用認(rèn)證之后,我們的應(yīng)用都要在服務(wù)端做一次記錄,以方便用戶(hù)下次請(qǐng)求的鑒別,通常而言session都是保存在內(nèi)存中,而隨著認(rèn)證用戶(hù)的增多,服務(wù)端的開(kāi)銷(xiāo)會(huì)明顯增大。

2.擴(kuò)展性: 用戶(hù)認(rèn)證之后,服務(wù)端做認(rèn)證記錄,如果認(rèn)證的記錄被保存在內(nèi)存中的話,這意味著用戶(hù)下次請(qǐng)求還必須要請(qǐng)求在這臺(tái)服務(wù)器上,這樣才能拿到授權(quán)的資源,這樣在分布式的應(yīng)用上,相應(yīng)的限制了負(fù)載均衡器的能力。這也意味著限制了應(yīng)用的擴(kuò)展能力。

3.CSRF: 因?yàn)槭腔赾ookie來(lái)進(jìn)行用戶(hù)識(shí)別的, cookie如果被截獲,用戶(hù)就會(huì)很容易受到跨站請(qǐng)求偽造的攻擊。

二、基于token的鑒權(quán)機(jī)制

基于token的鑒權(quán)機(jī)制是無(wú)狀態(tài)的,它不需要在服務(wù)端去保留用戶(hù)的認(rèn)證信息或者會(huì)話信息,而是基于token去運(yùn)算而實(shí)現(xiàn)鑒權(quán)。這就意味著基于token認(rèn)證機(jī)制的應(yīng)用不需要去考慮用戶(hù)在哪一臺(tái)服務(wù)器登錄了,這就為服務(wù)實(shí)現(xiàn)大規(guī)模分布式提供了基礎(chǔ)。

怎么在C#中利用jwt實(shí)現(xiàn)一個(gè)分布式登錄功能

上圖是一種用token登錄的實(shí)現(xiàn)方式,類(lèi)似的還有很多,雖然實(shí)現(xiàn)了分布式的登錄處理,但是由于不同的系統(tǒng)之間的不同實(shí)現(xiàn),導(dǎo)致開(kāi)發(fā)量劇增。

三、Json web token

這里推薦使用JWT——Json web token(官網(wǎng)鏈接)。一個(gè)典型的JWT看起來(lái)如下圖:

怎么在C#中利用jwt實(shí)現(xiàn)一個(gè)分布式登錄功能

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJpYXQiOjE1OTM5NTU5NDMsInVpZCI6MTAsImV4cCI6MTU5Mzk1NTk3Mywic2NvcGVzIjpbImFkbWluIiwidXNlciJdfQ.VHpxmxKVKpsn2Iytqc_6Z1U1NtiX3EgVki4PmA-J3Pg

一般是將它放入HTTP請(qǐng)求的Header Authorization字段中

Authorization: Bearer

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

輸入jwt.standard找到nuget包下載

1.生成jwt數(shù)據(jù)

在需要使用的地方輸入如下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內(nèi)容信息加入到Http頭部中,當(dāng)然可以使用如下方式,以參數(shù)數(shù)據(jù)的方式傳遞,從而避免跨域問(wèn)題

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解析驗(yàn)證

JWTPackage<T>中使用JWTPackage<T>.Parse方法解析jwt的內(nèi)容,如果內(nèi)容是header中的參數(shù),則快捷解析驗(yàn)證代碼如下:

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的問(wèn)題

經(jīng)過(guò)上述的簡(jiǎn)單介紹,JWT不僅可用于認(rèn)證,還可用于信息交換,善用JWT有助于減少服務(wù)器請(qǐng)求數(shù)據(jù)的次數(shù)。但是如果不正確的使用JWT也會(huì)造成安全問(wèn)題,主要幾點(diǎn)如下:

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

2.Replay Attacks,JWT的消息體中好加入生成時(shí)間,在后端中進(jìn)行時(shí)間判定,小于規(guī)定時(shí)間的直接攔截

3.不應(yīng)該在JWT的payload部分存放敏感信息,因?yàn)樵摬糠质强蛻?hù)端可解密的部分

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

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。

當(dāng)前標(biāo)題:怎么在C#中利用jwt實(shí)現(xiàn)一個(gè)分布式登錄功能-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://muchs.cn/article22/cdcocc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信公眾號(hào)、移動(dòng)網(wǎng)站建設(shè)、云服務(wù)器、網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司