iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
自我挑戰組

30天開啟.NET後端工程師的旅程系列 第 30

Day 30 實現Jwt Token身分驗證的ASP.NET Core Web API登入

  • 分享至 

  • xImage
  •  

前言
Day29完成了簡單的註冊跟登入,那在前後端分離的時候,是有可能會使用到JWT來去在不同系統之間傳遞信息,通常用於身份驗證和授權。


再來要做新增jwt Token,首先先去appSetting裡面創建一個隨機超過16個字的Token,下面是我設定的Token。

"AppSettings": {
    "Token": "the last few day of iron challenge."
  },

大概是如下圖所示,Token後面的內容可以根據自己想要的內容隨機設定。
https://ithelp.ithome.com.tw/upload/images/20231012/20151470nDDQZ1fw6z.png
再來到Controller新增一個創建Token的方法,傳入user進去之後創建的Token

	private string CreateToken(User user)
		{
			List<Claim> claims = new List<Claim>
			{
				//創建了一個 Claims 的 List,其中包含了一個名為 "ClaimTypes.Name" 的聲明,該聲明的值是使用者的名稱(user.Username)
				new Claim(ClaimTypes.Name,user.Username)
			};
			var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(
				_configuration.GetSection("AppSettings:Token").Value!));
			var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

			var token = new JwtSecurityToken(
				claims:claims,
				expires:DateTime.Now.AddDays(1),
				signingCredentials:creds
				);

			//處理 JWT 的物件,我們使用它的 WriteToken 方法將 JWT 物件轉換為字符串形式,以便於傳輸。
			var jwt = new JwtSecurityTokenHandler().WriteToken(token);
			return jwt;//返回 JWT 字符串,您可以使用它來向客戶端返回身份驗證令牌。
		}
  1. CreateToken 方法: 這是一個名為 CreateToken 的方法,它接受一個名為 user 的參數,代表要將哪個使用者資訊嵌入到 JWT 中。
  2. Claims: 在 JWT 中,claims 是聲明的集合,它們代表了有關使用者或其他實體的信息。
  3. SymmetricSecurityKey: 這裡我們創建了一個 SymmetricSecurityKey(對稱式安全金鑰),用於對 JWT 的內容進行簽名和驗證。這個金鑰是根據配置文件中的 "AppSettings:Token" 鍵所提供的值來建立的。該值應該是一個密碼或密鑰,以確保 JWT 的安全性。
  4. SigningCredentials: 使用 SymmetricSecurityKey 創建 SigningCredentials,它包含了金鑰和安全演算法(SecurityAlgorithms.HmacSha256),用於對 JWT 進行簽名。
  5. JwtSecurityToken: 這是實際的 JWT 物件的建立。我們將之前創建的 claims 添加到 JWT 中,並設置了過期時間(expires),通常是當前時間加上一段時間,這裡是一天。然後,我們使用 SigningCredentials 對 JWT 進行簽名。

然後在Day 29 登入的部分,最後也要改成叫用CreateToken的方法

[HttpPost("login")]
		public ActionResult<User> Login(UserDto request)
		{
			if(user.Username != request.Username) { return BadRequest("User not found."); }
			if (!BCrypt.Net.BCrypt.Verify(request.Password, user.PasswordHash))
			{
				return BadRequest("Wrong Username Or Password");
			}

			string token = CreateToken(user);//新增這個
			return Ok(token);//回傳的內容改成回傳token
		}

登入成功回傳jwtToken,下面紅框框圈起來的就是加密後的jwt Token。
https://ithelp.ithome.com.tw/upload/images/20231012/20151470AeMJRNo3Rq.png
再把上面Response body裡面的這段複製貼到jwt.io這個網站裡面。
https://ithelp.ithome.com.tw/upload/images/20231012/20151470kPdIr5lbpc.png


終於順利的完成30天的挑戰,準備時間比較短暫,擔心自己無法完成,所以不時都會有想放棄的念頭,很慶幸自己最後有堅持到最後一天挑戰成功,發文的內容還有可以再更好的解釋說明的地方,也歡迎給予指教跟回饋。
一個月說長不長,但需要堅持30天每天輸出內容,並且需要反覆查找資料確認自己的內容描述是否正確,跟去年挑戰的前端不同,今年就想把自己所學到的嘗試自己解釋出來,持續督促自己有這樣的輸出才能有成長的機會~


上一篇
Day29 建立安全的ASP.NET Core Web API註冊服務
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言